iT邦幫忙

1

加入Loop做多網頁資料搜尋的 Debug

#
  • 分享至 

  • xImage

Python爬蟲爬蝦皮資料,目前單頁資料已經完成所有的擷取,但是單頁只有6筆資訊,所以進階做多網頁資料爬取,首先,發現不同網頁的差異只有在url網址其中的數字做跳頁,例如

第一頁:
url = "https://shopee.tw/api/v2/shop/get_ratings?filter=0&limit=6&offset=0&shopid=4098392&type=0&userid=4099676"

第二頁:
url = "https://shopee.tw/api/v2/shop/get_ratings?filter=0&limit=6&offset=6&shopid=4098392&type=0&userid=4099676"

只有差在 "offset=0" 和 "offset=6",因為一頁只有6筆(0~5),所以第二頁是從第6筆開始,測試跳頁迴圈是否可以正確抓取 url:下面是我使用的方式

import time
url = "https://shopee.tw/api/v2/shop/get_ratings?filter=0&limit=6&offset={}&shopid=4098392&type=0&userid=4099676"

for t in (0, 6, 12):
    print(url.format(t))
    time.sleep(2)

https://ithelp.ithome.com.tw/upload/images/20191214/20123283ahAX4C0zZ0.jpg

結果顯示可以的(也許有更好的方法),接下來是置入原本正常單一頁爬蟲的程式碼,正常運作的碼如下:

import requests 
from selenium import webdriver
import json
import pandas

url = "https://shopee.tw/api/v2/shop/get_ratings?filter=0&limit=6&offset=0&shopid=4098392&type=0&userid=4099676"

path = "C:\chromedriver.exe"
driver = webdriver.Chrome(path)
driver.get(url)
Cookie = ';'.join(['{}={}'.format(item.get('name'), item.get('value')) for item in driver.get_cookies()])

header = {
    'cookie': Cookie,
    'if-none-match-': 'ad0cf65c2f362c78081c167ace34e140',
    'if-none-match-': '55b03-eddbcc2c628e9f6639f434a78134bca1',
    'referer': 'https://shopee.tw/buyer/4099676/rating',
    'sec-fetch-mode': 'cors',
    'sec-fetch-site': 'same-origin',
    'User-Agent': "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36",
    'x-api-source': 'pc',
    'x-requested-with': 'XMLHttpRequest',
    #'Postman-Token': '68c324d7-4894-448a-a4db-9072b6bbcf0c',
    #'Connection': 'keep-alive'

}

req = requests.get(url, headers = header)
data = req.json()

df0 = ('買家ID: {}'.format(data['data']['items'][0]['cmtid']))
df1 = ('買家ID: {}'.format(data['data']['items'][1]['cmtid']))
df2 = ('買家ID: {}'.format(data['data']['items'][2]['cmtid']))
df3 = ('買家ID: {}'.format(data['data']['items'][3]['cmtid']))
df4 = ('買家ID: {}'.format(data['data']['items'][4]['cmtid']))
df5 = ('買家ID: {}'.format(data['data']['items'][5]['cmtid']))
ls = (df0, df1, df2, df3, df4, df5)
all = pandas.DataFrame(ls)
print(all)

https://ithelp.ithome.com.tw/upload/images/20191214/20123283Byf4QK7qd2.jpg

下面是我試著將 Loop 欲抓三頁的程式碼置入,發現有問題,如下:

import requests 
from selenium import webdriver
import json
import pandas
import time

#url = "https://shopee.tw/api/v2/shop/get_ratings?filter=0&limit=6&offset=0&shopid=4098392&type=0&userid=4099676"
url = "https://shopee.tw/api/v2/shop/get_ratings?filter=0&limit=6&offset={}&shopid=4098392&type=0&userid=4099676"

for t in (0, 6, 12):
    print(url.format(t))

    path = "C:\chromedriver.exe"
    driver = webdriver.Chrome(path)
    driver.get(url)
    Cookie = ';'.join(['{}={}'.format(item.get('name'), item.get('value')) for item in driver.get_cookies()])

    header = {
        'cookie': Cookie,
        'if-none-match-': 'ad0cf65c2f362c78081c167ace34e140',
        'if-none-match-': '55b03-eddbcc2c628e9f6639f434a78134bca1',
        'referer': 'https://shopee.tw/buyer/4099676/rating',
        'sec-fetch-mode': 'cors',
        'sec-fetch-site': 'same-origin',
        'User-Agent': "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36",
        'x-api-source': 'pc',
        'x-requested-with': 'XMLHttpRequest',
        #'Postman-Token': '68c324d7-4894-448a-a4db-9072b6bbcf0c',
        #'Connection': 'keep-alive'

    }

    req = requests.get(url, headers = header)
    data = req.json()

    df0 = ('買家ID: {}'.format(data['data']['items'][0]['cmtid']))
    df1 = ('買家ID: {}'.format(data['data']['items'][1]['cmtid']))
    df2 = ('買家ID: {}'.format(data['data']['items'][2]['cmtid']))
    df3 = ('買家ID: {}'.format(data['data']['items'][3]['cmtid']))
    df4 = ('買家ID: {}'.format(data['data']['items'][4]['cmtid']))
    df5 = ('買家ID: {}'.format(data['data']['items'][5]['cmtid']))
    ls = (df0, df1, df2, df3, df4, df5)
    all = pandas.DataFrame(ls)
    print(all)

    time.sleep(2)

https://ithelp.ithome.com.tw/upload/images/20191214/20123283IU0E3yVLLZ.jpg

我有試將著code縮減測試,url 的替換在 req = requests.get(url, headers = header),之前是可以運作的,但是有幾種可能是我無法判斷(因為我還很蔡)

  1. loop 的使用不好
  2. 縮排沒處理好 (不知道是否有好用的工具檢查)
  3. 程式碼的使用衝突(我有試著加入 continue, break 和 pass找問題),但仍超出我的能力範圍

麻煩各位先進指導,謝謝

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

0
dragonH
iT邦超人 5 級 ‧ 2019-12-14 20:53:39
最佳解答

字太多懶得看

不知道這個對你有沒有幫助

ideone

看更多先前的回應...收起先前的回應...
cfeynman iT邦新手 5 級 ‧ 2019-12-14 21:18:31 檢舉

龍H大,可以請你幫我試最後我放loop進去的程式碼嗎?我真的試不出問題,謝謝

dragonH iT邦超人 5 級 ‧ 2019-12-14 21:27:39 檢舉

cfeynman

或許你把你 loop 裡的 url

改成

url.format(t)

應該會比較快

不行的話再說

cfeynman iT邦新手 5 級 ‧ 2019-12-16 11:46:33 檢舉

太強了,下面所有url都改成url.format(t)就可以了,感謝

dragonH iT邦超人 5 級 ‧ 2019-12-16 14:29:58 檢舉

/images/emoticon/emoticon42.gif

0
froce
iT邦大師 1 級 ‧ 2019-12-15 12:37:25

我是懶得設置selenium,不過...

  1. 這debug訊息就告訴你是res解json的時候解不出來,你要不要先看一下res的內容是什麼?
  2. 然後某些東西應該可以共用,有必要每次都放在迴圈裡重新宣告一次嗎?
  3. 甚至人家api網址都告訴你limit和offset是幹嘛用的,你要抓18筆搞不好只需要改limit=18和offset=0就好...

爬蟲就是和寫網頁的人鬥智,寫過網頁能理解怎麼運作的,你要寫爬蟲很快。


剛剛瞄了一下程式碼,string format先去搞懂吧。

cfeynman iT邦新手 5 級 ‧ 2019-12-16 11:47:29 檢舉

謝謝Froce大,我會試是你的提議

我要發表回答

立即登入回答