1. 程式人生 > >Python網絡爬蟲筆記(五):下載、分析京東P20銷售數據

Python網絡爬蟲筆記(五):下載、分析京東P20銷售數據

9.png amp F12 不存在 strong xls sco 列表 std

(一) 分析網頁

下載下面這個鏈接的銷售數據

https://item.jd.com/6733026.html#comment

1、 翻頁的時候,谷歌F12的Network頁簽可以看到下面的請求。

技術分享圖片

從Preview頁簽可以看出,這個請求是獲取評論信息的

技術分享圖片

2、 對比第一頁、第二頁、第三頁…請求URL的區別

可以發現 page=0、page=1,0和1指的應該是頁數。

第一頁的 request url:沒有這個rid=0& 。 第二、三頁…的request url:多了這個rid=0&

除了上面這2個地方,其他內容都是一樣的。

技術分享圖片

3、 直接在瀏覽器輸入 復制出來的request url,可以看到評論、顏色、版本、內存信息,代碼將根據這些信息來寫正則表達式進行匹配。

技術分享圖片

(二) 實現代碼

delayed.py的代碼和我前面發的是一樣的(Python網絡爬蟲筆記(二)),不限速的話把和這個模塊相關的代碼刪除就行了
 1 import urllib.request as ure
 2 import urllib.parse
 3 import openpyxl
 4 import re
 5 import os
 6 from delayed import WaitFor
 7 def download(url,user_agent=FireDrich,num=2,proxy=None):
 8     print(下載:+url)
 9     #
設置用戶代理 10 headers = {user_agent:user_agent} 11 request = ure.Request(url,headers=headers) 12 #支持代理 13 opener = ure.build_opener() 14 if proxy: 15 proxy_params = {urllib.parse.urlparse(url).scheme: proxy} 16 opener.add_handler(ure.ProxyHandler(proxy_params)) 17 try
: 18 #下載網頁 19 # html = ure.urlopen(request).read() 20 html = opener.open(request).read() 21 except ure.URLError as e: 22 print(下載失敗+e.reason) 23 html=None 24 if num>0: 25 #遇到5XX錯誤時,遞歸調用自身重試下載,最多重復2次 26 if hasattr(e,code) and 500<=e.code<600: 27 return download(url,num=num-1) 28 return html 29 def writeXls(sale_list): 30 #如果Excel不存在,創建Excel,否則直接打開已經存在文檔 31 if P20銷售情況.xlsx not in os.listdir(): 32 wb =openpyxl.Workbook() 33 else: 34 wb =openpyxl.load_workbook(P20銷售情況.xlsx) 35 sheet = wb[Sheet] 36 sheet[A1] = 顏色 37 sheet[B1] = 版本 38 sheet[C1] = 內存 39 sheet[D1] = 評論 40 sheet[E1] = 評論時間 41 x = 2 42 #叠代所有銷售信息(列表) 43 for s in sale_list: 44 #獲取顏色等信息 45 content = s[0] 46 creationTime = s[1] 47 productColor = s[2] 48 productSize = s[3] 49 saleValue = s[4] 50 # 將顏色等信息添加到Excel 51 sheet[A + str(x)] = productColor 52 sheet[B + str(x)] = productSize 53 sheet[C + str(x)] = saleValue 54 sheet[D + str(x)] = content 55 sheet[E + str(x)] = creationTime 56 x += 1 57 wb.save(P20銷售情況.xlsx) 58 59 page = 0 60 allSale =[] 61 waitFor = WaitFor(2) 62 #預編譯匹配顏色、版本、內存等信息的正則表達式 63 regex = re.compile("content":"(.*?)","creationTime":"(.*?)".*?"productColor":"(.*?)","productSize":"(.*?)".*?"saleValue":"(.*?)") 64 #這裏只下載20頁數據,可以設置大一些(因為就算沒評論信息,也能下載到一些標簽信息等,所以可以if 正則沒匹配的話就結束循環,當然,下面沒處理這個) 65 while page<20: 66 if page==0: 67 url = https://sclub.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98vv176&productId=6733026&score=0&sortType=5&page= + str(page) + &pageSize=10&isShadowSku=0&fold=1 68 else: 69 url = https://sclub.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98vv176&productId=6733026&score=0&sortType=5&page= + str(page) + &pageSize=10&isShadowSku=0&rid=0&fold=1 70 waitFor.wait(url) 71 html = download(url) 72 html = html.decode(GBK) 73 #以列表形式返回顏色、版本、內存等信息 74 sale = regex.findall(html) 75 #將顏色、版本、內存等信息添加到allSale中(擴展allSale列表) 76 allSale.extend(sale) 77 page += 1 78 79 writeXls(allSale)

(三) 數據分析

1、 下載後的數據如下圖所示。

技術分享圖片

2、 生成圖表。

技術分享圖片

技術分享圖片

Python網絡爬蟲筆記(五):下載、分析京東P20銷售數據