爬蟲精進 十一 協程案例

2021-09-29 13:48:54 字數 3694 閱讀 3117

需求 :用多協程爬取薄荷網11個常見食物分類裡的食物資訊(包含食物名、熱量、食物詳情頁面鏈結)。

分析過程:

我們能在response裡找到食物的資訊,說明我們想要的資料存在html裡。再看第0個請求1的headers,可以發現薄荷網的網頁請求方式是get。知道了請求方式是get,我們就知道可以用requests.get()獲取資料。

1.分析類別不同**的規律

先關閉「檢查」工具。我們接著來觀察,每個常見食物分類的**和每一頁食物的**有何規律。

果然,常見食物分類的**構造是有規律的。前10個常見食物分類的**都是:數字

唯獨最後乙個常見食物分類【菜餚】的**與其他不同,是:

2.分析分頁不同時**的規律

原來?page=數字真的是代表頁數的意思。只要改變page後面的數字,就能實現翻頁。

基於我們上面的觀察,可以得出薄荷網每個食物類別的每一頁食物記錄的**規律——

前面我們知道薄荷網的食物熱量的資料都存在html裡,所以等下就可以用beautifulsoup模組來解析。

你把滑鼠接著移到食物上,你就會發現:原來每個食物的資訊都被分別藏在了乙個…標籤裡。每頁食物記錄裡有10個食物,剛好對應上網頁源**裡的10個…標籤。

這麼看來的話,我們用find_all/find就能提取出…標籤下的食物詳情鏈結、名稱和熱量。

最終**為:

from gevent import monkey

monkey.patch_all()

import gevent,requests, bs4, csv

from gevent.queue import queue

work = queue()

url_1 = ''

for x in range(1, 4):

for y in range(1, 4):

real_url = url_1.format(type=x, page=y)

work.put_nowait(real_url)

url_2 = '?page='

for x in range(1,4):

real_url = url_2.format(page=x)

work.put_nowait(real_url)

def crawler():

headers =

while not work.empty():

url = work.get_nowait()

res = requests.get(url, headers=headers)

bs_res = bs4.beautifulsoup(res.text, 'html.parser')

foods = bs_res.find_all('li', class_='item clearfix')

for food in foods:

food_name = food.find_all('a')[1]['title']

food_url = '' + food.find_all('a')[1]['href']

food_calorie = food.find('p').text

writer.writerow([food_name, food_calorie, food_url])

print(food_name)

csv_file= open('boohee.csv', 'w', newline='')

#呼叫open()函式開啟csv檔案,傳入引數:檔名「boohee.csv」、寫入模式「w」、newline=''。

writer = csv.writer(csv_file)

# 用csv.writer()函式建立乙個writer物件。

writer.writerow(['食物', '熱量', '鏈結'])

tasks_list =

for x in range(5):

task = gevent.spawn(crawler)

gevent.joinall(tasks_list)

練習 :請使用多協程和佇列,爬取時光網電視劇集top100的資料(劇名、導演、主演和簡介)

import  gevent,requests,bs4,csv

from gevent.queue import queue

from gevent import monkey

#monkey.patch_all()

work = queue()

url = ''

work.put_nowait('')

for i in range(2,11):

work.put_nowait(url.format(page=i))

csv_file = open('movies.csv','w',newline="")

writer = csv.writer(csv_file)

writer.writerow(['序號','劇名','導演','主演','簡介'])

def crawler():

while not work.empty():

realurl = work.get_nowait()

res = requests.get(realurl)

bf = bs4.beautifulsoup(res.text,'html.parser')

movesul = bf.find('ul',id='asyncratingregion').find_all('li')

for one in movesul:

index = one.find('em').text

mov_con = one.find('div',class_='mov_con')

mov_a = mov_con.find_all('a')

if len(mov_a) > 1 :

mov_name = mov_a[0].text

if len(mov_a) > 2 :

mov_director = mov_a[1].text

if len(mov_a) > 3 :

mov_mainactor = mov_a[2].text

mov_detail = one.find('p',class_ = 'mt3')

writer.writerow([index,mov_name,mov_director,mov_mainactor,mov_detail])

tasklist =

for x in range(2):

task = gevent.spawn(crawler)

gevent.joinall(tasklist)

python協程使用 協程的案例

概念 使用者層面在乙個執行緒中進行多工切換的機制,比執行緒更加輕量級 實現併發量更大 協程的使用 使用第三方庫 gevent gevent 是乙個基於協程的 python 網路庫,在遇到 io 阻塞時,程式會自動進行切換,可以讓我們用同步的放肆寫非同步 io 協程的使用 from gevent im...

python 協程 爬蟲

協程 又叫微執行緒 python的多執行緒沒法利用多核,只能用乙個核去切換,沒辦法實現真正的並行效果。多執行緒的意義,對於io密集型是有意義的。大部分處理都是io的,多執行緒是可以解決大多數情況的。但是解決不了並行的多程序。協程 非搶占式的程式,執行緒和程序都是搶占式的。協程也是要切換的,不過這種切...

多協程爬蟲

要實現非同步的爬蟲方式的話,需要用到多協程。同步的爬蟲方式爬取這8個 import requests,time 匯入requests和time start time.time 記錄程式開始時間 url list 把8個 封裝成列表 for url in url list 遍歷url list r r...