1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        playwright網(wǎng)絡(luò)爬蟲實(shí)戰(zhàn)案例分享

        共 4417字,需瀏覽 9分鐘

         ·

        2022-07-27 02:49

        點(diǎn)擊上方“Python爬蟲與數(shù)據(jù)挖掘”,進(jìn)行關(guān)注

        回復(fù)“書籍”即可獲贈(zèng)Python從入門到進(jìn)階共10本電子書

        不寢聽金鑰,因風(fēng)想玉珂。

        大家好,我是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 -------------------

        往期精彩文章推薦:

        歡迎大家點(diǎn)贊,留言,轉(zhuǎn)發(fā),轉(zhuǎn)載,感謝大家的相伴與支持

        想加入Python學(xué)習(xí)群請(qǐng)?jiān)诤笈_(tái)回復(fù)【入群

        萬水千山總是情,點(diǎn)個(gè)【在看】行不行

        /今日留言主題/

        隨便說一兩句吧~~

        瀏覽 176
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            国内毛片毛片毛片毛片 | 激情八月丁香婷婷 | 午夜青娱乐盛世 | 精品无人区一区二区三区蜜桃小说 | 美女爱操笔网 | 蜜桃秘 无码一区二区三区四区 | 亚洲欧洲另类小说 | 视频一区二区三区四区五区 | 久久秘 一区二区三区四区 | 五月激情丁香网 |