阿里云备案 网站备案域名上海seo优化bwyseo
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 前言
- 一、多进程与多线程爬取斗图网
- 总结
前言
提示:这里可以添加本文要记录的大概内容:
爬取斗图网
提示:以下是本篇文章正文内容,下面案例可供参考
一、多进程与多线程爬取斗图网
"""
网址:https://www.doutupk.com/article/list/?page=2
目标:多进程多线程下载图片
"""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/?page=2"# 请求页面源代码的session = requests.Session()session.headers = {"":""#请求头自行添加}resp = session.get(url)tree = etree.HTML(resp.text)a_list = tree.xpath(".//div[@id='home']/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 = f"https://www.doutupk.com/article/list/?page={i}"t.submit(get_img_src,f"https://www.doutupk.com/article/list/?page={i}",q)# get_img_src(f"https://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, mode='wb') 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(target=get_img_process,args=(q,))# 表示给进程函数提供参数,必须是(元组)args# 负责下载图片p2 = Process(target=download_process,args=(q,))p1.start()p2.start()if __name__ == '__main__':main()
总结
将图片url的提取和图片下载分成两个独立的任务,每一个任务用一个进程,并用多线程提高效率,两个进程的图片url交互使用的Queue队列,确保获取图片url的进程能把url传递给图片下载任务进程。