「python爬虫之路day15」:多线程爬取低俗段子(来看看你的fzl时代!)

本文分享了一个使用Python的requests和lxml库爬取百思不得姐网站段子的多线程代码实例,通过解析网页源码,抓取段子内容及链接,并保存至CSV文件。

今天学习了爬百思不得姐姐的段子,其实有点懵,也觉得自己技术之路的遥遥,所以记录一下,然后准备打王者荣耀。
来看代码:

import requests
from lxml import etree
import csv
import threading
from queue import Queue
class BSSpider(threading.Thread):
    headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.87 Safari/537.36"}
    def __init__(self,page_queue,joke_queue,*args,**kwargs):
        super(BSSpider,self).__init__(*args,**kwargs)
        self.base_domain='http://www.budejie.com'
        self.page_queue=page_queue
        self.joke_queue=joke_queue
    def run(self):
        while True:
            if self.page_queue.empty():
                break
            url=self.page_queue.get()
            response=requests.get(url,headers=self.headers)
            text=response.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.joke_queue.put((joke,link))
            print("*"*30+"第%s页下载完成!"%url.split('/')[-1]+"*"*30)

class BSWriter(threading.Thread):
    def __init__(self,gLock,writer,joke_queue,*args,**kwargs):
        super(BSWriter, self).__init__(*args, **kwargs)
        self.writer = writer
        self.joke_queue = joke_queue
        self.lock=gLock
    def run(self):
        while True:
            try:
                joke_info = self.joke_queue.get(timeout=4)
                joke,link = joke_info
                self.lock.acquire()
                self.writer.writerow((joke,link))
                self.lock.release()
                print('保存一条')
            except:
                break

def main():
    page_queue=Queue(10)
    joke_queue=Queue(500)
    gLock=threading.Lock()
    fp=open('bsbs.csv','a',newline='',encoding='utf-8')
    writer=csv.writer(fp)
    writer.writerow(('content','link'))#写入标签
    for x in range(1,11):
        url='http://www.budejie.com/text/%d'%x
        page_queue.put(url)
    for x in range(5):
        t=BSSpider(page_queue,joke_queue)
        t.start()
    for x in range(5):
        t=BSWriter(gLock,writer,joke_queue)
        t.start()
if __name__ == '__main__':
    main()

来看我们保存的段子咯:

现在看看当年一直看的东西感觉索然无味,其实并不是它们变了,而是我们出现了其的替代品而且我们的要求越来越高了。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值