多執行緒爬蟲實現(上)

2021-09-11 13:01:46 字數 2365 閱讀 8918

本文首發於知乎

爬蟲主要執行時間消耗是請求網頁時的io阻塞,所以開啟多執行緒,讓不同請求的等待同時進行,可以大大提高爬蟲執行效率。

本文基於多執行緒(這裡開啟了10個執行緒),使用github的api,抓取fork cpython專案的所有5千多個專案資訊,將資料儲存到json檔案中。

爬蟲所需技術

爬蟲**如下

import requests

import time

from threading import thread

from queue import queue

import json

def run_time(func):

start = time.time()

func(*args, **kw)

end = time.time()

print('running', end-start, 's')

class spider():

def __init__(self):

self.qurl = queue()

self.data = list()

self.email = ''

# 登入github用的郵箱

self.password = ''

# 登入github用的密碼

self.page_num = 171

self.thread_num = 10

def produce_url(self):

baseurl = ''

for i in range(1, self.page_num + 1):

url = baseurl.format(i)

self.qurl.put(url) # 生成url存入佇列,等待其他執行緒提取

def get_info(self):

while not self.qurl.empty(): # 保證url遍歷結束後能退出執行緒

url = self.qurl.get() # 從佇列中獲取url

print('crawling', url)

req = requests.get(url, auth = (self.email, self.password))

data = req.json()

for datai in data:

result =

@run_time

def run(self):

self.produce_url()

ths =

for _ in range(self.thread_num):

th = thread(target=self.get_info)

th.start()

for th in ths:

th.join()

s = json.dumps(self.data, ensure_ascii=false, indent=4)

with open('github_thread.json', 'w', encoding='utf-8') as f:

f.write(s)

print('data crawling is finished.')

if __name__ == '__main__':

spider().run()

複製**

讀者只需要在spider__init__中,指定自己的github郵箱和密碼,即可執行爬蟲。

爬蟲說明如下

1.run_time函式是乙個計算程式執行時間的裝飾器,作用於spider物件的run函式

2.spider

爬蟲結果

抓取結果展示如下

這個程式開啟10個執行緒抓取171個頁面用了33秒。在這篇文章中不使用多執行緒則使用了333秒。為了能更清晰地體會多執行緒執行效率的改進,讀者可以自行嘗試修改上面**中的self.page_numself.thread_num

我這裡做了乙個實驗,self.page_num值設為20,即總共抓取20頁

乙個問題

最後留乙個問題給讀者思考:在前面的這篇文章中,我們也實現了乙個多執行緒爬蟲,為什麼當時的**那麼簡單,而現在卻複雜了這麼多呢?

後續

專欄主頁:python程式設計

專欄目錄:目錄

版本說明:軟體及包版本說明

多執行緒爬蟲實現(下)

本文首發於知乎 爬蟲 如下 import requests import time from threading import thread from queue import queue import json from bs4 import beautifulsoup def run time ...

爬蟲多執行緒

多執行緒在之前的scrapy裡面已經接觸過了,就是裡面的yiled,開啟乙個新的執行緒。但是這是這是基於這個高階框架的,用的時候只知道這是開啟了乙個新的執行緒,並不是很清楚到底是怎麼執行的。而在python裡面有包 import threading引入這個包之後就可以寫自己的多執行緒了 寫多執行緒的...

多執行緒爬蟲

python標準庫是執行緒之間常見的資料交換形式 queue的使用可以確保python的執行緒安全 q queue.queue maxsize 建立佇列,並可以指定大小 q.empty 判斷佇列是否為空 q.full 判斷佇列是否滿 q.put data 向佇列中放入資料 q.get 從佇列中拿資料...