爬虫学习:简单的多线程加速爬取
接上一篇:爬虫学习:xpath爬取评书网
对于爬取要下载数据,如果数据量比较大,单线程爬虫将会花费很长的时间,而且电脑的硬件和网络带宽也无法得到很好地利用。因此,本文将利用python的threading模块对爬虫进行简单的优化。
相关理论就不多说了,具体看:Python3多线程,threading基于线程的并行。
代码如下:
#多线程 from lxml import etree import requests import threading headers = {"User-Agent" : "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1 Trident/5.0;"} url='https://www.5tps.com/html/23602.html' html=etree.HTML(requests.get(url,headers=headers).content) results=html.xpath('//ul/li/a/@title') #音频链接 resultst=html.xpath('//ul/li/a/text()') #章节名字 for i in range(len(results)): results[i]='http://psf.tt56w.com:8000/单田芳/单田芳_破晓记(37回)/'+results[i] resultst[i]=resultst[i].replace('\xa0','') def save_file(result,resultt): with open('G:\dota\pingshu3\{}.mp3'.format(resultt[1:-1]),'wb') as f: f.write(requests.get(result).content) #下载并保存,具体保存路径根据需要修改 print(resultt[1:-1]) def main(): for i in zip(results,resultst): #创建线程 thread_spider = threading.Thread(target=save_file, args=(i[0],i[1])) # 启动线程 thread_spider.start() if __name__ == '__main__': main()
PS:需要注意的是,多线程下爬取的结果并不是按顺序排列的,所以在爬取一些有一定顺序的数据时,可以在爬取过程中为数据添加序号,爬取结束后按照序号进行排序处理!!!
参考资料:
https://www.runoob.com/python3/python3-multithreading.html
https://docs.python.org/zh-cn/3/library/threading.html
https://www.cnblogs.com/insane-Mr-Li/p/9879356.html