本文所實現的爬取淘寶商品信息將實現以下功能:
對于某個類別的淘寶商品的頁面
image.png
爬取這個商品名稱,比如“手機”搜索結果下的每個商品的信息,存儲到數據結構中,并能將其輸出顯示。
如下的輸出形式:
image.png
接下來,就看我們如何一步步實現這個小爬蟲的吧
分析
- 目標:獲取淘寶搜索頁面的信息,提取其中的商品名稱和價格
- 理解:
淘寶的搜索接口
翻頁的處理
首先分析搜索接口,
很容易我們就可以發現,
image.png
https://s.taobao.com/search?q=后面接我們的搜索詞就可以
我們再研究翻頁處理:
第二頁
image.png
第三頁
image.png
我們可以發現,s參數指定了搜索頁的跳轉,每48條記錄一次頁面跳轉。
有同學可能發現還會有其他很多的參數,這個我們先忽略,我們直接構造一個url,只包括搜索詞和搜索頁,看看能不能訪問到正確頁面:
比如
https://s.taobao.com/search?q=手機&s=48
我們將上述地址放到地址欄
image.png
發現可以正確訪問,所以我們現在就已經知道了如何確定訪問接口
設計程序結構
主要有三步
- 步驟1:提交商品搜索請求,循環獲取頁面
- 步驟2:對于每個頁面,提取商品名稱和價格信息
- 步驟3:將信息輸出到屏幕上
首先我們對于上面研究出的搜索接口給出基本的代碼:
#CrowTaobaoPrice.py
import requests
import re
def getHTMLText(url):
def parsePage(ilt, html):
def printGoodsList(ilt):
def main():
goods = '手機'
depth = 3
start_url = 'https://s.taobao.com/search?q=' + goods
infoList = []
for i in range(depth):
try:
url = start_url + '&s=' + str(48*i)
html = getHTMLText(url)
parsePage(infoList, html)
except:
continue
printGoodsList(infoList)
main()
對于獲取頁面源碼的函數,我們已經寫過很多次了,就是利用requets庫抓取頁面
def getHTMLText(url):
try:
r = requests.get(url, timeout=30)
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text
except:
return ""
核心代碼
這個爬蟲最核心的地方就在于對商品信息的獲取,我們首先分析頁面的源代碼,我們搜索第一個商品的名字
image.png
基本上所有商品的信息,名稱,價格,月銷量都在這段數據結構里顯示,是嵌入在js代碼里的,所以我們就無法用bs4庫來提取。
但我們可以直接用re庫,正則表達式提取。
因為我們可以發現,所有的商品名稱都是
“title”:" "的格式,我們可以搜索確認一下:
image.png
我們搜索發現,正好是48條記錄,也就是48個商品的信息,所以直接匹配就可以把所所有商品名稱信息提取出來,是不是很簡單。
對于商品價格 和月銷量也是這么獲取的
def parsePage(ilt, html):
try:
plt = re.findall(r'\"price\"\:\"[\d\.]*\"',html)
tlt = re.findall(r'\"title\"\:\".*?\"',html)
mslt = re.findall(r'\"month_sales\"\:\"[\d\.]*\"',html)
for i in range(len(plt)):
price = eval(plt[i].split(':')[1])
title = eval(tlt[i].split(':')[1])
monthsales = eval(mslt[i].split(':')[1])
ilt.append([price , title, monthsales])
except:
print("")
完整代碼
#CrowTaobaoPrice.py
import requests
import re
def getHTMLText(url):
try:
r = requests.get(url, timeout=30)
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text
except:
return ""
def parsePage(ilt, html):
try:
plt = re.findall(r'\"price\"\:\"[\d\.]*\"',html)
tlt = re.findall(r'\"title\"\:\".*?\"',html)
mslt = re.findall(r'\"month_sales\"\:\"[\d\.]*\"',html)
for i in range(len(plt)):
price = eval(plt[i].split(':')[1])
title = eval(tlt[i].split(':')[1])
monthsales = eval(mslt[i].split(':')[1])
ilt.append([price , title, monthsales])
except:
print("")
def printGoodsList(ilt):
tplt = "{:4}\t{:8}\t{:16}\t{:16}"
print(tplt.format("序號", "價格", "商品名稱","月銷量"))
count = 0
for g in ilt:
count = count + 1
print(tplt.format(count, g[0], g[1],g[2]))
def main():
goods = '手機'
depth = 3
start_url = 'https://s.taobao.com/search?q=' + goods
infoList = []
for i in range(depth):
try:
url = start_url + '&s=' + str(48*i)
html = getHTMLText(url)
parsePage(infoList, html)
except:
continue
printGoodsList(infoList)
main()
結果:
image.png
小伙伴也可以更改這個程序去搜索各種不同的商品的信息啦