1. 程式人生 > >京東爬蟲——京東評論資訊爬取及評論圖片的下載

京東爬蟲——京東評論資訊爬取及評論圖片的下載

之前,我做了一個天貓評論資訊的抓取,和評論圖片的下載,不過那次是將資訊全部存入資料庫後再從資料庫提取圖片資訊進行下載,這次我做了一個資訊抓取和圖片下載的二合一升級版。

本次以京東nike自營店為目標,

老方法,按F12開啟流量監控器,在network中點選js,接下來在眾多條資訊中找到儲存評論資訊的連結,具體如下:

最後找到的連結張這個樣子:

https://sclub.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98vv119&productId=7252788&score=0&sortType=5&page=0&pageSize=10&isShadowSku=0&fold=1

開啟連結後發現它也是json格式的,這就簡單啦

首先利用urllib.request開啟連結,再用json載入json檔案,程式碼如下:

url='https://sclub.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98vv119&productId=7252788&score=0&sortType=5&page=0&pageSize=10&isShadowSku=0&fold=1'
html = urllib.request.urlopen(url).read().decode('gbk')
jsondata = re.search(r'\{.*\}', html).group()
data = json.loads(jsondata)

這裡使用了正則是因為html打開發現他是長這樣的:

我們需要的json格式檔案放在那個()裡面。

得到json格式的資料後,就要對資料進行篩選,我將使用者名稱、評論等一些資訊放進了資料庫中,圖片立即下載

首先寫一個迴圈,遍歷當前url中的所有評論內容,部分程式碼如下:

    for i in range(0, len(data['comments'])):
        id = data['comments'][i]['nickname']
        # 使用者名稱
        content = data['comments'][i]['content']
        # 評論
        time = data['comments'][i]['creationTime']
        # 評論日期
        type = data['comments'][i]['referenceName']
        # 型號及顏色

在爬取圖片連結並下載時,因為有些評論沒有圖片,所以需要對key進行判斷是否存在

if('images' in data['comments'][i].keys()):

如果存在,則對圖片連結進行抓取,並補全連結和下載:

pics = data['comments'][i]['images'][k]['imgUrl']
a='http:'+pics
urllib.request.urlretrieve(a, 'D:\jd_pics/' + str(z)+'_'+str(i+1) + '_' + 'pic' + '_' + str(k) + '.jpg')
                    # 買家秀,命名規則:第幾頁第幾條評論的第幾個圖片

對於追評的爬取,大體思路同上,這裡不做贅述

最後就是考慮迴圈抓取,只要寫個迴圈就OK

    for j in range(0,150):
        url='https://sclub.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98vv119&productId=7252788&score=0&sortType=5&page='+str(j)+'&pageSize=10&isShadowSku=0&fold=1'
        

我這裡嘗試抓取了前150頁評論的內容,因為要一邊抓一邊下載圖片,所以時間較長,我總用時大約25分鐘,最後得到資料庫中1000條資訊

和本地1216張圖片

咦~這不對啊,150頁每頁10條資訊,這總數應該是1500啊!為什麼我的資料庫中只有1000條?

我去百度了下,有前輩這樣解釋說:

“在mysql中,每個資料庫最多可建立20億個表,一個表允許定義1024列,每行的最大長度為8092位元組(不包括文字和影象型別的長度)。
當表中定義有varchar、nvarchar或varbinary型別列時,如果向表中插入的資料行超過8092位元組時將導致Transact-SQL語句失敗,併產生錯誤資訊。
SQL對每個表中行的數量沒有直接限制,但它受資料庫儲存空間的限制。

每個資料庫的最大空間1048516TB,所以一個表可用的最大空間為1048516TB減去資料庫類系統表和其它資料庫物件所佔用的空間。”

也就是說一個數據庫的容量是肯定夠的,那我剩下的那500條記錄哪去了?

找了半天,結果發現navicat for mysql有分頁功能,它自動幫我分頁了快哭了

唉~蠢哭自己大哭哭

本人學生,對於python爬蟲的學習也是剛剛入門,本文及程式碼如有漏洞,還請各路大神不吝賜教,謝謝!微笑

:轉載請標明出處