python爬虫实战-使用threading多线程爬取段子

我们今天使用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是一个爬取效率非常高的爬取方法,希望各位同学好好学习关于这方面知识。
在这里插入图片描述

各位大佬看完了给弟弟点个赞六个关注再走,谢谢各位啦!

猜你喜欢

转载自blog.csdn.net/m0_37623374/article/details/124734564
今日推荐