本文首發於知乎
爬蟲**如下
import requests
import time
from threading import thread
from queue import queue
import json
from bs4 import beautifulsoup
def run_time(func):
start = time.time()
func(*args, **kw)
end = time.time()
print('running', end-start, 's')
class spider():
def __init__(self):
self.start_url = ''
self.qurl = queue()
self.data = list()
self.item_num = 5 # 限制每頁提取個數(也決定了二級頁面數量)防止對網頁請求過多
self.thread_num = 10 # 抓取二級頁面執行緒數量
self.first_running = true
def parse_first(self, url):
print('crawling', url)
r = requests.get(url)
soup = beautifulsoup(r.content, 'lxml')
movies = soup.find_all('div', class_ = 'info')[:self.item_num]
for movie in movies:
url = movie.find('div', class_ = 'hd').a['href']
self.qurl.put(url)
nextpage = soup.find('span', class_ = 'next').a
if nextpage:
nexturl = self.start_url + nextpage['href']
self.parse_first(nexturl)
else:
self.first_running = false
def parse_second(self):
while self.first_running or not self.qurl.empty():
url = self.qurl.get()
print('crawling', url)
r = requests.get(url)
soup = beautifulsoup(r.content, 'lxml')
mydict = {}
title = soup.find('span', property = 'v:itemreviewed')
mydict['title'] = title.text if title else none
duration = soup.find('span', property = 'v:runtime')
mydict['duration'] = duration.text if duration else none
time = soup.find('span', property = 'v:initialreleasedate')
mydict['time'] = time.text if time else none
@run_time
def run(self):
ths =
th1 = thread(target=self.parse_first, args=(self.start_url, ))
th1.start()
for _ in range(self.thread_num):
th = thread(target=self.parse_second)
th.start()
for th in ths:
th.join()
s = json.dumps(self.data, ensure_ascii=false, indent=4)
with open('top_th1.json', 'w', encoding='utf-8') as f:
f.write(s)
print('data crawling is finished.')
if __name__ == '__main__':
spider().run()
複製**
除此之外,還需要說明乙個地方
對於第二點,這裡定義了self.first_running
,它如果是true
,則表示一級頁面還沒執行完成。此時即使二級頁面的url佇列已經空了,也要繼續等待一級頁面解析後產生新的二級頁面url。
另外,由於這次url佇列是典型的生產消費者模式,因此如果不想自己實現condition鎖的話,就用queue來代替list。
讀者也可以試著更改self.thread_num
看爬蟲速度有什麼改變。
專欄主頁:python程式設計
專欄目錄:目錄
版本說明:軟體及包版本說明
多執行緒爬蟲實現(上)
本文首發於知乎 爬蟲主要執行時間消耗是請求網頁時的io阻塞,所以開啟多執行緒,讓不同請求的等待同時進行,可以大大提高爬蟲執行效率。本文基於多執行緒 這裡開啟了10個執行緒 使用github的api,抓取fork cpython專案的所有5千多個專案資訊,將資料儲存到json檔案中。爬蟲所需技術 爬蟲...
爬蟲多執行緒
多執行緒在之前的scrapy裡面已經接觸過了,就是裡面的yiled,開啟乙個新的執行緒。但是這是這是基於這個高階框架的,用的時候只知道這是開啟了乙個新的執行緒,並不是很清楚到底是怎麼執行的。而在python裡面有包 import threading引入這個包之後就可以寫自己的多執行緒了 寫多執行緒的...
多執行緒爬蟲
python標準庫是執行緒之間常見的資料交換形式 queue的使用可以確保python的執行緒安全 q queue.queue maxsize 建立佇列,並可以指定大小 q.empty 判斷佇列是否為空 q.full 判斷佇列是否滿 q.put data 向佇列中放入資料 q.get 從佇列中拿資料...