多執行緒爬蟲實現(下)

2021-09-11 21:39:35 字數 2618 閱讀 3091

本文首發於知乎

爬蟲**如下

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 從佇列中拿資料...