吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2518|回复: 5
收起左侧

[Python 转载] Python自学记录--多线程糗事百科爬虫

  [复制链接]
BoBuo 发表于 2021-9-26 22:39
[Python] 纯文本查看 复制代码
#线程库
import threading
#队列
import queue
import requests
import time
from lxml import etree

#采集网页线程--爬取段子列表所在的网页,放进队列
class Thread1(threading.Thread):
    
    def __init__(self, threadName,pageQueue,dataQueue):
        threading.Thread.__init__(self)
        self.threadName = threadName #线程名
        self.pageQueue = pageQueue #页码队列
        self.dataQueue = dataQueue #数据队列
        self.headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36"}

    def run(self):
        print("启动线程"+self.threadName)
        while not flag1:
            try:
                page=self.pageQueue.get()
                url="https://www.qiushibaike.com/8hr/page/"+str(page)+"/"
                content=requests.get(url,headers=self.headers).text
                time.sleep(0.5)
                self.dataQueue.put(content) #将数据放入队列中
            except Exception as e:
                pass

        print("结束线程"+self.threadName)



#解析网页线程--从队列中拿到列表网页,进行解析,并储存到本地
class Thread2(threading.Thread):
    
    def __init__(self, threadName,dataQueue,filename):
        threading.Thread.__init__(self)
        self.threadName = threadName
        self.dataQueue = dataQueue
        self.filename = filename

    def run(self):
        print("启动线程"+self.threadName)
        while not flag2:
            try:
                data1=self.dataQueue.get()
                html=etree.HTML(data1)
                node_list=html.xpath('//div//a[@class="recmd-content"]')
                for node in node_list:
                    data=node.text
                    self.filename.write(data+"\n")
            except Exception as e:
                pass

        print("结束线程"+self.threadName)

flag1=False #判断页码队列中是否为空
flag2=False #判断数据队列中是否为空

def main():
    #页码队列
    pageQueue=queue.Queue(2)  #页码最大为10

    for i in range(1,11):
        pageQueue.put(i)

    #存放采集结果的数据队列
    dataQueue=queue.Queue()

    #保存到本地的文件
    filename=open(r"D:\代码保存\duanzi.txt","a")

    #启动线程
    t1=Thread1("采集线程",pageQueue,dataQueue)
    t1.start()
    t2=Thread2("解析线程",dataQueue,filename)
    t2.start()

    #当padeQueue为空时,结束采集线程
    while not pageQueue.empty():
        pass

    global flag1 
    flag1=True

    #当padeQueue为空时,结束采集线程
    while not pageQueue.empty():
        pass

    global flag2 
    flag2=True

    t1.join()
    t2.join()

    filename.close()

    print("结束!")

if __name__ == '__main__':
    main()

免费评分

参与人数 4吾爱币 +4 热心值 +4 收起 理由
TXWD东方不败 + 1 + 1 我很赞同!
撸冰花 + 1 + 1 我很赞同!
lua11 + 1 + 1 用心讨论,共获提升!
wezve + 1 + 1 我很赞同!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

WZY001 发表于 2021-9-26 22:51
妙啊,感谢分享
ynboyinkm 发表于 2021-9-27 08:30
地狱猫 发表于 2021-9-29 19:56
你开发业务系统吗?现在网上有很多零代码搭建系统的平台,我们想借助这样的平台搭建业务系统,然后布置到我们自己的服务器。
 楼主| BoBuo 发表于 2021-9-30 15:15
地狱猫 发表于 2021-9-29 19:56
你开发业务系统吗?现在网上有很多零代码搭建系统的平台,我们想借助这样的平台搭建业务系统,然后布置到我 ...

小白自学中  能力有限   期待学成后与您合作
hnadsl2001 发表于 2021-10-18 16:37
收藏一下,多线程还没有学到
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 14:32

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表