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