中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

多線程在python3爬蟲中調用函數的示例

發布時間:2020-11-25 09:32:57 來源:億速云 閱讀:258 作者:小新 欄目:編程語言

小編給大家分享一下多線程在python3爬蟲中調用函數的示例,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

可以說函數和python爬蟲一般情況下都可以結合使用,但是這需要小伙伴們對于函數的使用方法進行充分的了解,才能和python爬蟲的知識點緊密結合使用。經過幾天多線程和爬蟲的內容講解,相信大家對于這方面的模塊內容已經比較熟悉的,所以可以用我們的老朋友download()函數進行一次知識點的交流,下面就來來看看download()在python爬蟲中的運用吧。

對其進行構造,創建日志,download()函數創建線程,update_queque_url對連接的列表進行更新,get_url()根據bs4進行匹配獲取連接,download_all()通過調用download()函數實現批量下載。spider作為一個入口函數進行爬取

class Crawler:
    def __init__(self,name,domain,thread_number):
        self.name=name
 
        self.domain=domain
        self.thread_number=thread_number
 
        self.logfile=open('log.txt','w')
        self.thread_pool=[]
        self.url = 'http://'+domain
 
     def spider(self):# 內容會隨著爬蟲的進行而更新
        global g_queue_urls# 初始,隊列中僅有一個url
        g_queue_urls.append(self.url)# 爬取的深度
        depth =0
        print(f'爬蟲{self.name}開始啟動........')
        while g_queue_urls:
            depth +=1
            print(f'當前爬取深度是{depth}')
            self.logfile.write(f'URL:{g_queue_urls[0]}')
            self.download_all() # 下載所有
            self.update_queque_url() # 更新 url隊列
            self.logfile.write(f">>>Depth:{depth}")
            count = 0
            while count <len(g_queue_urls):
                self.logfile.write(f"累計爬取{g_total_count}條,爬取是第{g_queue_urls[count]}個")
                count+=1
 
 
 
    def download_all(self):
        global g_queue_urls
        global g_total_count
        i=0
        while i < len(g_queue_urls):
            j=0
            while j<self.thread_number and i+j <len(g_queue_urls):
                g_total_count +=1
                print(g_queue_urls[i+j])
                thread_result=self.download(g_queue_urls[i+j],f"{g_total_count}.html",j)
                if thread_result  is not None:
                      print(f'線程{i+j}啟動')
                j +=1
            i=i+j
            for thread in self.thread_pool:
                thread.join(25)
        g_queue_urls=[]
 
 
 
    def download(self,url,filename,tid):
        print(url,filename,tid)
        creawler_thread= CrawlerThread(url,filename,tid)
        self.thread_pool.append(creawler_thread)
        creawler_thread.start()
    def update_queque_url(self):
        global g_queue_urls
        global g_exist_urls#已經爬過的url
        new_urls=[]#新發現的url
        for url_content in g_urls:
            new_urls +=self.get_Url(url_content)# 從頁面中提取新url
        g_queue_urls=list(set(new_urls)  -set(g_exist_urls)) # 去除重復的和已經爬過的
 
    def get_Url(self,content):
     '''
        從網頁源代碼中提取url
        '''
        links =[] # 保存提取到的href
        try:
 
            soup =BeautifulSoup(content)
            for link in soup.findAll('a'):
                if link is not None and link.get('href') is not None:
                    if self.domain in link['href']:
    # 如果link是本網站的絕對地址
                        links.append(link)
                    elif  len(link['href']) >10 and  'http://' not in link['href']:
 # 如果link是相對地址
                        links.append(self.url +link['href'])
 
 
 
        except Exception as e:
            print("fail to get url",e)
        return links

主函數調用爬蟲函數的spider()方法

if __name__=="__main__":
    domain ="www.geyanw.com"
    thread_number=10
    name="geyan"
    crawler =Crawler(name,domain,thread_number)
    crawler.spider()

除了download()函數,spider()也可以在python爬蟲中調用。

以上是“多線程在python3爬蟲中調用函數的示例”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

乐平市| 辽中县| 汕头市| 宝清县| 安阳县| 石阡县| 兴安县| 大名县| 信宜市| 北宁市| 利川市| 台北市| 随州市| 合江县| 财经| 博野县| 栖霞市| 宁南县| 石台县| 东方市| 东光县| 南涧| 湟源县| 准格尔旗| 甘孜县| 沾益县| 巴楚县| 怀仁县| 中超| 盐源县| 郎溪县| 额济纳旗| 乃东县| 从江县| 大丰市| 称多县| 博兴县| 元阳县| 静乐县| 修武县| 彭山县|