本文主要是介绍python使用多线程爬取糗百段子,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
本次是对上次的糗百爬虫做的修改,使用多线程
import requests
from lxml import etree
import threading
from queue import Queueclass Qiubai:def __init__(self):self.headers = {"sec - fetch - dest": "empty","sec - fetch - mode": "cors","sec - fetch - site": "cross - site","User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.129 Safari/537.36"}self.url_list = Queue() #url队列self.res = Queue() #响应队列self.str = Queue() #数据队列def get_url_list(self):'''url队列'''url = "https://www.qiushibaike.com/text/page/{}/"for i in range(13):self.url_list.put(url.format(i)) #循环,创建url队列def get_html(self):'''发送请求'''while True:url = self.url_list.get() #从队列取出response = requests.get(url, headers=self.headers) #发送请求self.res.put(response.content.decode()) #放入队列self.url_list.task_done() #让队列减一def get_html_data(self):'''提取数据'''while True:html_str = self.res.get() #取出一个响应#提取数据html = etree.HTML(html_str)content_list = html.xpath('//div[@class="content"]')self.str.put(content_list) #放入队列self.res.task_done() #res让队列减一def save_data(self):'''保存'''while True:content_list = self.str.get() # 从队列取出一个with open("糗事百科搞笑段子.text", "a", encoding="utf-8") as f:for i in content_list:i = i.xpath("./span/text()") # 列表for j in i:a = j.replace("\n", "") # 去掉\n符号f.write(a)f.write("\n\n\n")self.str.task_done() # 队列减一def run(self):'''创建线程并开启'''#一个空列表,将所有线程放入里面,然后用for循环startthread_list = []#创建url队列url = threading.Thread(target=self.get_url_list)thread_list.append(url)#发送请求for i in range(20):send = threading.Thread(target=self.get_html)thread_list.append(send)#提取数据for i in range(10):get_data = threading.Thread(target=self.get_html_data)thread_list.append(get_data)#保存数据for i in range(20):save_data = threading.Thread(target=self.save_data)thread_list.append(save_data)#开始线程print("开始")for i in thread_list:i.daemon = True #子线程设置为守护线程,主线程结束子线程结束i.start()for j in [self.url_list, self.res, self.str]:j.join() #让主线程等待子线程结束再结束print("结束")if __name__ =="__main__":qiubai = Qiubai()qiubai.run()
结果截图如下
- 在创建线程是遇到了一直死循环的BUG
threading.Thread(target=self.get_html)
看了文档才知道我在target等号后面的函数加了括号,其实是不能加的。
这篇关于python使用多线程爬取糗百段子的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!