Python 爬虫如何实现多进程?多线程?多任务?

我写了一个爬虫,
假设我需要连续爬10个页面,
并且每次爬页面的时候,
在各个环节我都print了一些信息,
例如:
1.目标网址httpabc
2.找到视频链接
3.开始下载…
4.下载完成
能否同时爬这10个页面?
另外有几个疑问:
1.同时爬的话,print信息会混在一起?
2.能否在爬每个目标网页的时候,单独打开一个py文件,这样print信息就是独立的了?
3.如果直接手动打开多个py去运行的话,那目标网址会重复爬(因为我目标网址是单独一个txt文本,py文件会按顺序爬),该如何解决?

  1. 会,但是可以通过锁机制来确保信息不会混乱
  2. 可以,可以理解为写好的py是脚本文件,写好之后通过cmd来运行,比如说 python spider.py ,多开几个cmd,就是独立打印
  3. 不同页面的话,比如说txt文本有10页,开10个py文件,第一个在运行的时候,使用python spider.py index=0, py文件里面接收index的值,加入到url里面,第二个就是index = 1,以此类推
    如果是同一页面,直接10个线程爬取,将context分成10段分配给10个线程就不要开10个py了~

你如果是多线程爬取的话,打印信息会重复。建议你将结果写入文件。你在各个环节print的信息也没有什么用。print只是让你知道程序在运行。

第三个问题,我的处理办法是记录下那些是爬取过的,用个字典就行了,以网址作为key。value为false表示没有爬取;你可以试试看这个方法

使用多线程搜索,python多线程搜索代码框架如下所示,read中放你的搜索方法,把搜索结果放到results中即可,par_list中一个元组对应一个线程,根据自己的需要设定线程数哈

 
import threadpool
#多线程执行的方法
def read(pairDate,pairShift,site,flag):
#flag返回的值为1或0
#方法省略    
        return flag
#回调函数,接收的参数(请求本身,和请求工作函数执行结果        
def get_result(request,result):
    global results
    results.append(result)
 
results = []
# 声明可容纳五个线程的池
pool = threadpool.ThreadPool(3)
# 创建线程运行内容请求列表(线程工作函数,线程工作参数列表,回调函数)
list_var1 = [parse_date, parse_shift, 2080, ne_flag]
list_var3 = [parse_date, parse_shift, 2090, sz_flag]
list_var2 = [parse_date, parse_shift, 5060, xb_flag]
par_list = [(list_var1, None), (list_var2, None), (list_var3, None)]
re = threadpool.makeRequests(retry_read_ApsStatus, par_list, get_result)
 
#将每一个线程放到线程池
res = [pool.putRequest(req) for req in re]
pool.wait()
print("多线程返回结果")
print(results)
#多线程返回结果
#[1, 1, 1]
 

就一个输出窗口print肯定混在一起啊

import concurrent.futures.ThreadPoolExecutor
后面的教程你可以网上搜一下,多线程你可以理解成打开多个py文件,但其实是程序开辟出多个可以执行任务的子程序,然后将任务下发给各个子程序来执行,print要特殊处理过,不然确实会打印错乱的

多打开几个.py也能达到多线程效果,或者用python的多线程也行,from concurrent.futures import ThreadPoolExecutor挺好用的,也简单

你打开多个py 窗口运行的话,最简单的就是设定每个py 使用的网址范围,不要都从头开始读取

多线程防止假死,并不能按顺序输出,会混在一起

这篇文章就是一个很好的例子,https://www.zhihu.com/question/263977050

python 多线程实现多任务,多进程实行多任务
把里面的任务代码替换称爬虫代码即可
https://blog.csdn.net/weixin_39910711/article/details/118900523