本文首發於知乎
爬蟲主要執行時間消耗是請求網頁時的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_num
和self.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 從佇列中拿資料...