playwright網(wǎng)絡(luò)爬蟲實(shí)戰(zhàn)案例分享
回復(fù)“書籍”即可獲贈(zèng)Python從入門到進(jìn)階共10本電子書
大家好,我是Python進(jìn)階者。
一、前言
前幾天在Python白銀交流群【HugoLB】分享了一個(gè)playwright網(wǎng)絡(luò)爬蟲利器,如下圖所示。

感覺挺有意思,上手難度也不算太大,這里整理一份小教程分享給大家,后面遇到常規(guī)爬不動(dòng)的網(wǎng)站,不妨試試看這個(gè)利器,興許會(huì)事半功倍哦!
二、實(shí)現(xiàn)過程
這里使用新發(fā)地網(wǎng)站做一個(gè)簡(jiǎn)單的示例,新發(fā)地網(wǎng)站最開始的時(shí)候是get請(qǐng)求,去年的時(shí)候開始使用post請(qǐng)求方式,網(wǎng)頁發(fā)生了變化,其實(shí)你正常使用網(wǎng)絡(luò)爬蟲的常規(guī)方式,也是可以獲取到數(shù)據(jù)的,而且效率也很高,這里我是為了給大家做一個(gè)playwright網(wǎng)絡(luò)爬蟲示例,拿這個(gè)網(wǎng)站小試下牛刀。言歸正傳,一起來看看吧!
新發(fā)地網(wǎng)站的首頁如下圖所示:

進(jìn)入網(wǎng)頁之后,可以看到網(wǎng)頁的url,然后點(diǎn)擊右側(cè)的查看更多,即可進(jìn)入到詳情頁,如下圖所示:

此時(shí)可以看得到更多的數(shù)據(jù)量了,這里只是用一兩個(gè)頁面做一個(gè)示例,更多的頁面等大家自己去挖掘。
啟動(dòng)瀏覽器抓包,點(diǎn)擊網(wǎng)頁的下一頁,可以看到響應(yīng)數(shù)據(jù)如下圖所示:

此時(shí)的請(qǐng)求參數(shù)如下圖所示:

依次再點(diǎn)擊下一頁,可以看到Request URL是不變的,變化的是Payload里邊的current參數(shù)。

此時(shí)的請(qǐng)求參數(shù)如下圖所示:

那么到這里的話,網(wǎng)頁變化的規(guī)律其實(shí)已經(jīng)很明顯了,接下來我們只需要上playwright代碼就行了,代碼框架是固定的,只需要更改兩個(gè)url即可,第一個(gè)是主頁的url,第二個(gè)就是響應(yīng)數(shù)據(jù)的response.url,具體的代碼如下所示:
from playwright.sync_api import Playwright, sync_playwright
import datetime
from pprint import pprint
import traceback
import logging
from tqdm import tqdm
import json
# pip install playwright,然后終端 playwright install
"""
先用playwright寫一個(gè)普通的登入網(wǎng)站代碼,然后page.goto前面加上
page.on("request", lambda request: handle(request=request, response=None))
page.on("response", lambda response: handle(response=response, request=None))
然后可以寫一個(gè)handle自定義函數(shù),args為response和request,然后后面想怎么處理數(shù)據(jù)都可以
"""
# setup logging
logging.basicConfig(format='%(asctime)s | %(levelname)s : %(message)s', level=logging.INFO)
def handle_json(json):
# process our json data
# print(json)
for i in range(20):
data_list = json['list'][i]
# print(data_list)
id = data_list['id']
prodName = data_list['prodName']
prodCat = data_list['prodCat']
place = data_list['place']
print(id, prodName, prodCat, place)
def handle(request, response):
if response is not None:
# response url 是網(wǎng)站請(qǐng)求數(shù)據(jù)的url
if response.url == 'http://www.xinfadi.com.cn/getPriceData.html':
handle_json(response.json())
def run(playwright: Playwright) -> None:
browser = playwright.chromium.launch(headless=False)
context = browser.new_context(ignore_https_errors=True)
# Open new page
page = context.new_page()
page.on("request", lambda request: handle(request=request, response=None))
page.on("response", lambda response: handle(response=response, request=None))
# url是網(wǎng)頁加載的URL
url = 'http://www.xinfadi.com.cn/index.html'
page.goto(url)
# 然后之前看到有說道網(wǎng)站動(dòng)態(tài)加載,拖動(dòng)的問題。playwright可以直接用page.mouse.wheel(0, 300)解決
page.wait_for_timeout(50000)
# ---------------------
context.close()
page.close()
browser.close()
with sync_playwright() as playwright:
run(playwright)
運(yùn)行之后的結(jié)果如下所示:

可以看到數(shù)據(jù)已經(jīng)成功拿下了。在handle_json()這個(gè)函數(shù)里邊,你可以針對(duì)獲取到的數(shù)據(jù)做進(jìn)一步的處理,如提取,保存等,也可以直接打印出來看效果,看你自己的需求了。
如果有遇到問題,隨時(shí)聯(lián)系我解決,歡迎加入我的Python學(xué)習(xí)交流群。

三、總結(jié)
大家好,我是Python進(jìn)階者。這篇文章主要分享了一個(gè)playwright網(wǎng)絡(luò)爬蟲實(shí)戰(zhàn)案例教程,文中針對(duì)該問題給出了具體的解析和代碼實(shí)現(xiàn)。
最后感謝粉絲【HugoLB】分享,感謝【月神】、【瑜亮老師】、【此類生物】、【貓藥師Kelly】、【馮誠】等人參與學(xué)習(xí)交流。
小伙伴們,快快用實(shí)踐一下吧!如果在學(xué)習(xí)過程中,有遇到任何問題,歡迎加我好友,我拉你進(jìn)Python學(xué)習(xí)交流群共同探討學(xué)習(xí)。
------------------- End -------------------
往期精彩文章推薦:
在xpath匹配li標(biāo)簽的時(shí)候跳過第一個(gè)li標(biāo)簽,匹配剩下的li標(biāo)簽表達(dá)式怎么寫?
盤點(diǎn)兩種使用Python網(wǎng)絡(luò)爬蟲實(shí)現(xiàn)東方財(cái)富網(wǎng)分時(shí)數(shù)據(jù)抓取方法

歡迎大家點(diǎn)贊,留言,轉(zhuǎn)發(fā),轉(zhuǎn)載,感謝大家的相伴與支持
想加入Python學(xué)習(xí)群請(qǐng)?jiān)诤笈_(tái)回復(fù)【入群】
萬水千山總是情,點(diǎn)個(gè)【在看】行不行
/今日留言主題/
隨便說一兩句吧~~
