网页设计与网站制作,华为手机网站建设策划方案,网站优化模板,网站建设的说辞提示#xff1a;文章写完后#xff0c;目录可以自动生成#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、多进程与多线程爬取斗图网总结 前言
提示#xff1a;这里可以添加本文要记录的大概内容#xff1a;
爬取斗图网 提示#xff1a;以下是本篇文章正文内… 提示文章写完后目录可以自动生成如何生成可参考右边的帮助文档 文章目录 前言一、多进程与多线程爬取斗图网总结 前言
提示这里可以添加本文要记录的大概内容
爬取斗图网 提示以下是本篇文章正文内容下面案例可供参考
一、多进程与多线程爬取斗图网 网址:https://www.doutupk.com/article/list/?page2
目标:多进程多线程下载图片
import requests
from lxml import etree
from concurrent.futures import ThreadPoolExecutor
from multiprocessing import Process,Queue # 此队列是用的网络
# from queue import Queue #内存层面的。进程通信它是不行的
def get_img_src(url,q):# url https://www.doutupk.com/article/list/?page2# 请求页面源代码的session requests.Session()session.headers {:#请求头自行添加}resp session.get(url)tree etree.HTML(resp.text)a_list tree.xpath(.//div[idhome]/div/div[2]/a)# print(len(a_list))for a in a_list:srcs a.xpath(.//img/data-original)for src in srcs:# print(src)# download_img(src) # 需要交出去 而不是自己下载q.put(src) ## 吧src传递给队列
def get_img_process(q):with ThreadPoolExecutor(3) as t:# 线程池,相当于一个url一个线程for i in range(2,10):# url fhttps://www.doutupk.com/article/list/?page{i}t.submit(get_img_src,fhttps://www.doutupk.com/article/list/?page{i},q)# get_img_src(fhttps://www.doutupk.com/article/list/?page{i})# 当整个任务结束了,传递一个结束的型号q.put(结束了...)print(所有图片url获取完毕)def download_img(src):# 下载图片的session_2 requests.session()session_2.headers {:#请求头自行添加}file_name src.split(/)[-1]img_resp session_2.get(src)with open(file_name, modewb) as f:f.write(img_resp.content)def download_process(q): # 这个进程另一个进程里的图片下载地址with ThreadPoolExecutor(10) as t:while 1:# 从队列中提取到srcsrc q.get() # 接收到这条消息代表任务结束if src 结束了...:breakt.submit(download_img,src)# download_img(src)print(所有图片下载完毕)
def main():q Queue()# 负责获取图片下载地址p1 Process(targetget_img_process,args(q,))# 表示给进程函数提供参数必须是(元组)args# 负责下载图片p2 Process(targetdownload_process,args(q,))p1.start()p2.start()if __name__ __main__:main()总结
将图片url的提取和图片下载分成两个独立的任务每一个任务用一个进程并用多线程提高效率两个进程的图片url交互使用的Queue队列确保获取图片url的进程能把url传递给图片下载任务进程。