线程池和进程池(10)——批量获取图片(1)
时间:2023-09-09 21:07:02
目录
1 多线程和多进程
2XPath返回空列表问题
1 多线程和多进程
多过程和多线程是实现多任务的两种常用方法。
(9)_WHJ226的博客-CSDN博客
在这篇博文中,我们用以下方法获取刘亦菲的两张图片,但这两张图片对我们来说是完全不够的。
import requests from threading import Thread def func(name): body #函数体,可以是爬虫,该函数类似于请求-响应-保存数据 if __name__ == "__main__": #线程1 t1 = Thread(target=func,args=(name,))#传输参数必须是元组 t1.start() #线程2 t2 = Thread(target=func, args=(name,)) t2.start()
因此,我们需要改进方法。
例如:
#线程池 from concurrent.futures import ThreadPoolExecutor def fn(name): for i in range(1000): print(name,i) if __name__ == "__main__": # 创建一个由50个线程组成的线程池 with ThreadPoolExecutor(50) as t: for i in range(100): t.submit(fn,name=f"线程{i}") #等待线程池中的所有任务完成后再继续执行 print("123")
一般模板如下:
#1.提取单页数据 #2.使用线程池 import requests from lxml import etree from concurrent.futures import ThreadPoolExecutor def download_one_page(url): header = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36' } resp = requests.get(url=url, headers=header) html = etree.HTML(resp.text) urls = html.xpath(xpath) #xpath为了获取图片下载地址xpath path = 'E:/PHOTO/' #指定路径 #拿到每个url for url in urls: response = requests.get(url=url, headers=header) # 在此发送新的请求 title = url[m:n] '.jpg' ##下载图片指示文件名称 with open(path title, 'wb') as f: f.write(response.content) print("下载成功" name) time.sleep(2) response.close() if __name__ == "__main__": #for i in range(1,24):#第一种方法 #download_one_page(f"http://www.baidu.com_{i}")#该方法为单线程,效率低下 with ThreadPoolExecutor(5) as t:#第二种方法,改变值5可以改变速度 for i in range(1, 100): t.submit(download_one_page,"http://www.baidu.com_{i}")
2XPath返回空列表问题
如何使用这个模板,下面教你批量获取仙女姐姐的图片,怎么说,食色?性也(分开玩,审核应该能够通过)。
分析网页结构的第一步:
存储图片的地址:
解析XPath,并获取请求头、请求方式等信息:
获取XPath之后,根据模板编写代码。运行后返回的内容是空的。原因是我们获得的图片下载地址是空的,所以我们可以找到原因。排除了tbody(Python用xpath爬数据返回空列表 python关于使用的爬虫xpath写爬虫得不到内容, 获取空列表的解决方案_一生所爱的博客-CSDN博客_xpath返回空列表
爬虫使用xpath回到空中进行分析,无法获得相应元素的原因和解决方案_小鱼干儿博客-CSDN博客_xpath返回值为空),注释代码的可能性(关于xpath获取数据为空的原因_FRANCISHUI的博客-CSDN博客_xpath为空)后,原因就是requests只能获取网页的静态源代码,不能获得动态更新的内容。动态更新的内容应使用selenium 来爬取(http://t.csdn.cn/Ebs7i?spm=1005.2026.3001.5703)。或者是通过F12控制台分析页面数据加载链接,找到真正的链接json爬取数据地址。点击页面上的右键,选择右键菜单 "查看网页源代码"。如果该网页的静态源代码中有您需要爬行的内容,则表示该页面没有动态内容,可以使用requests爬行。否则说明页面内容动态更新,需要使用selenium 来爬取.
爬虫入门(6)-反爬(2)_WHJ226的博客-CSDN博客
爬虫入门(7)-反爬(3)Selenium_WHJ226的博客-CSDN博客
爬虫入门(8)-反爬(4)Selenium_WHJ226的博客-CSDN博客
爬虫入门(9)-反爬(5)Selenium_WHJ226的博客-CSDN博客
爬虫入门(10)-反爬(6)Selenium_WHJ226的博客-CSDN博客
反爬系列在一步步讲解Selenium面对动态网页的数据捕获,自动化测试。Chrome浏览器驱动器配置,以及自动化测试的基本解释,将带您掌握动态网页的所有数据,以便您可以爬上您所看到的。