我们今天使用threading多线程爬取段子,所有理论的知识都是空泛的,不如多来几次实战。
1.首先我们找到对应的网站。
2.并且找到text标签点进去,导入库,导入headers请求头。
3.然后定义好生产者类和消费者类,创建主函数。
4.其中生产者负责找到区域和内容并且获取到详情页的网站url。消费者负责写入文件中。主函数负责翻页和创建消费者和生产者,然后建设文件并且存储到文件当中。
代码:
import request
import threading
from queue import Queue#队列库
from lxml import etree#xpath
import csv#需要存储用的csv文件操作库
headers={
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.60 Safari/537.36'}
class Producer(threading.Thread):
def __init__(self,page_queue,text_queue,*args,**kwargs):
super(Producer, self).__init__(*args,**kwargs)
self.base_domain = '不得解的网站 私信我'#进行网址拼接用
self.page_queue=page_queue #把main函数中传进来
self.text_queue=text_queue
def run(self) -> None:
while not self.page_queue.empty():
page_url=self.page_queue.get()#从主函数中把页面url提取出来
resp=requests.get(page_url,headers=headers)
text=resp.text
html=etree.HTML(text)
descs=html.xpath("//div[@class='j-r-list-c-desc']")#找到所属的内容部分
for desc in descs:
jokes=desc.xpath(".//text()")
#提取文本
joke='\n'.join(jokes).strip()
#拼接并且消除空格
link=self.base_domain+desc.xpath(".//a/@href")[0]
#把详情页名的信息进行
self.text_queue.put((joke,link))
#把提取到的文本和详情网址放进text_queue
class Comsumer(threading.Thread):
def __init__(self,text_queue,writer,gLock,*args,**kwargs):
super(Comsumer, self).__init__(*args,**kwargs)
self.text_queue=text_queue#全局获取变量
self.writer=writer
self.lock=gLock#锁
def run(self) -> None:
while True:
try:
text_queue=self.text_queue.get(timeout=20)
joke,link=text_queue
#把元素再提取出来
self.lock.acquire()
self.writer.writerrow(joke,link)
#把joke和link写成一行
self.lock.release()
except:
break
def main():
page_queue=Queue(10)
text_queue=Queue(500)
gLock=threading.Lock()#定义锁
fp=open('bsbdj.csv','a',newline='',encoding='utf-8')
writer=csv.writer(fp)
writer.writerow(('content','link'))
#这里这两个是标签
for i in range(1,11):
#爬取10页
page_url='同上text/%d' % i
page_queue.put(page_url)
for x in range(5):
th=Producer(page_queue,text_queue)
th.start()
for x in range(5):
th=Comsumer(text_queue,writer,gLock)
th.start()
if __name__=='__main__':
main()
这里我们就把所有的过程全部写完了,多线程threading是一个爬取效率非常高的爬取方法,希望各位同学好好学习关于这方面知识。
各位大佬看完了给弟弟点个赞六个关注再走,谢谢各位啦!