需求 :用多協程爬取薄荷網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...