(维基百科)进阶的多线程爬虫

本文介绍了如何使用Python的多线程和深度算法优化爬虫,通过Crawler类和CrawlerThread子类展示了如何在维基百科爬取过程中实现并发下载,以提高爬取效率。
摘要由CSDN通过智能技术生成

多线程爬虫会用深度算法,我们优化上一篇内容代码:爬虫实战(维基xx)-CSDN博客

代码如下:

import requests
import re
import time
import threading

#https://www.britannica.com/topic/Wikipedia


#创建一些列表
g_mutex=threading.Condition()
g_pages=[]
g_queueURL=[]
g_existURL=[]
g_writecount=0

class Crawler:
    def __init__(self,url,threadnum):
        self.url=url
        self.threadnum=threadnum
        self.threadpool=[]
    def craw(self):
        global g_queueURL
        g_queueURL.append(url)
        depth=1
        while(depth<3):
            print('searching depth',depth,'\n')
            self.downloadAll()
            self.updateQueueURL()
            g_pages=[]
            depth+=1
    def downloadAll(self):
        global g_queueURL
        i=0
        while i<len(g_queueURL):
            j=0
            while j<self.threadnum and i+j<len(g_queueURL):
                threadresult=self.downloadAll(g_queueURL[i+j],j)
                j+=1
            i+=j
            for thread in  self.threadpool:
                thread.join(30)
            threadpool=[]
        g_queueURL=[]
    def download(self,url,tid):
       crawthread=CrawlerThread(url,tid)
       self.threadpool.append(crawthread)
       crawthread.start()

    def updateQueueURL(self):  # 完成一个深度的爬虫之后,更新队列
        global g_queueURL
        global g_existURL
        newUrlList = []
        for content in g_pages:
            newUrlList += self.getUrl(content)
        g_queueURL = list(set(newUrlList) - set(g_existURL))
        def getUrl(self,content):
            # 从获取的网页中解析ur1
            link_list=re.findall('<ahref="/wiki/([^:#=<>]*?)".*?</a>',content)
            unique_list=list(set(link_list))
            return unique_list
class CrawlerThread(threading.Thread):
    def __init__(self,url,tid):
        threading.Thread.__init__(self)
        self.url=url
        self.tid = tid

    def run(self, g_writecount=None):
            global g_mutex
            global g_writecounttry
            try:
                print(self.tid, "crawl ", self.url)
                headers = {
                    'User-Agent': 'Mozi1la/5.0(windows;U;windows NT 6.1;en-US;rv:1.9.1.6)Gecko/20091201 Firefox/3.5.6'}
                r = requests.get("https://en,wikipedia.org/wiki/" +self.url, headers=headers)
                html = r.text
                link_list2 = re.findall('<ahre£="/wiki/([^:#=<>]*?)".*?</a>', html)
                unique_list2=list(set(link_list2))
                for eachone in unique_list2:
                    g_writecount+= 1
                    content2 = "No." + str(g_writecount)+"\t Thread" + str(self.tid) + "t" + self.url + '->' + eachone + '\n'
                    with open('title2.txt', "a+")as f:
                        f.write(content2)
            except Exception as e:
                g_mutex.acquire()
                g_existURL.append(self.url)
                g_mutex.release()
                print('Failed downloading and saving', self.url)
                print(e)
                return None
            g_mutex.acquire()
            g_pages.append(self.url)
            g_existURL.append(self.url)
            g_mutex.release()
            
if __name__ == '__main__':
    url='wiki'
    threadnum=5
    crwaler=Crawler(url,threadnum)
    crwaler.craw()

多线程确实会加快爬虫的速度,我们假如线程开的多也会提高速度的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

eqwaak0

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值