python爬蟲實例之淘寶商品比價定向爬取
這次就模仿之前做的總結進行初次嘗試
- 目標:獲取淘寶搜索頁面的信息,提取其中的商品名稱和價格
- 理解:
- 獲取淘寶的搜索接口
- 淘寶頁面的翻頁處理
- 技術路線:requests——re
準備工作
- 獲取淘寶搜索商品的關鍵字接口
如下圖,自然而然地看見網址中地keyword後面,赫然地跟着“海賊王手辦”,幾個大字
舊版是 q= 後面連接關鍵字,這裏只是教你怎麼看
- 獲取翻頁的關鍵字接口
嘗試翻頁之後,發現page後面對應的頁碼變爲2,所以改變page的就翻頁了
這個是新版的,舊版的是s作爲關鍵字,44的倍數一頁
- 查看robots協議,查看是否允許進行爬取
如下圖,好吧,這個我也忘記了,看一下什麼意思
根據基本語法知道,淘寶是不允許所有的爬蟲對根目錄進行爬取的,但是用於技術探討應該是可以的
- 如果要獲取商品信息的提取範式,需要查看商品信息的表達式形式,於是我打開了網頁
如下圖,好吧,搜索之下並沒有任何發現,似乎沒有將信息保存在網頁
於是乎我打開某個商品的頁面,並查看源代碼
好吧,所有的信息都是寫在標籤裏面的,教程裏面的信息並沒有出現
由此發現,淘寶已經有了改良,商品的信息已經不寫在html頁面中,沒有辦法直接爬取
但是作爲一個練手的項目,可以參照視頻裏面的版本進行一下分析和講解,如下圖
價格的圖片段,“view_price”:“127.00”
分析爲正則表達式:“view_price”:"[\d.]*"
名稱段,“raw_title”:“超牛娜娜包”
分析成正則表達式:“raw_title”:"[.]*"
程序編寫
-
第一步,確定步驟,並將所有的步驟
- 提交商品的搜索請求,獲取頁面 getHTMLText()
- 對於每個頁面,提取商品的名稱和價格信息 parsePage()
- 將信息輸出到屏幕上 printGoodList()
- 採用main函數將所有的函數連接起來
代碼:
# 獲取相關的HTML頁面信息
# url是網頁的連接
def getHTMLtext(url):
return''
# 獲取各個商品的信息
# html是爬取到本地的HTML內容
# ilt是用來存放商品信息的html頁面
def parsePage(ilt,html):
print('')
# 將商品輸入到屏幕上
# ilt是容納對應的商品的信息的列表
def printMessage(ilt):
print()
# 用main函數將所有的網頁鏈接起來
# 重點在於翻頁的方式,獲取翻頁的關鍵字
def main():
goods = '書包'
depth = 2
start_url = 'http://a.taobao.com/search?q=' + goods
infolist = []
for i in range(2):
try:
url = start_url+'&s=' + str(44*i)
html = getHTMLtext(url)
parsePage(infolist,html)
except:
continue
printMessage(infolist)
main()
- 第二步,完善各個步驟的方法
逐步完善各個部分的代碼
- 第一部分完善getHTMLtext(url),常規的爬取頁面的方式,基本上不變
# 獲取相關的HTML頁面信息
def getHTMLtext(url):
try:
r = requests.get(url,timeout = 30)
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text
except:
return''
- 第二部分,完善parsePage()分析爬取頁面(parse描述),不同於以往的BeautifulSoup庫查找標籤,這裏用正則表達式
# 獲取各個商品的信息
def parsePage(ilt,html):
try:
plt = re.findall(r'\"view_price\"\:\"[\d.]*\"',html)
tlt = re.findall(r'\"raw_title\"\:\".*?\"',html)
//根據很久以前的網頁得到的信息格式
for i in range(len(plt)):
price = eval(plt[i].split(':')[1])
# eval()函數,將對應的數據外層的雙引號或者是單引號去掉
# 注意,提取之後是作爲字符串存在的,然後用”:“將之拆分,僅僅只取後面的值
title = eval(tlt[i].split(':')[1])
ilt.append([price.title])
except:
print('')
- 第三部分,採用格式輸出的方式,用format函數,先規定輸出的格式,然後逐個輸出
# 將商品輸入到屏幕上
def printMessage(ilt):
tplt = '{:4}\t{:8}\t{:16}'
# 定義輸出的模板
print(tplt.format("序號","價格","商品名稱"))
count = 0
for g in ilt:
count = count + 1
print(tplt.format(count,g[0],g[1]))
代碼總結
import re
import requests
# 獲取相關的HTML頁面信息
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'\"view_price\"\:\"[\d.]*\"',html)
tlt = re.findall(r'\"raw_title\"\:\".*?\"',html)
for i in range(len(plt)):
price = eval(plt[i].split(':')[1])
# eval()函數,將對應的數據外層的雙引號或者是單引號去掉
title = eval(tlt[i].split(':')[1])
ilt.append([price.title])
except:
print('')
# 將商品輸入到屏幕上
def printMessage(ilt):
tplt = '{:4}\t{:8}\t{:16}'
# 定義輸出的模板
print(tplt.format("序號","價格","商品名稱"))
count = 0
for g in ilt:
count = count + 1
print(tplt.format(count,g[0],g[1]))
# 用main函數將所有的網頁鏈接起來
def main():
goods = '書包'
depth = 2
start_url = 'http://a.taobao.com/search?q=' + goods
infolist = []
for i in range(2):
try:
url = start_url+'&s=' + str(44*i)
html = getHTMLtext(url)
parsePage(infolist,html)
except:
continue
printMessage(infolist)
main()
總結
-
我們平常在瀏覽網頁的時候,發現很多的頁面是需要登錄才能使用,那麼爬蟲怎麼爬取?其實我也不知道,但是我想攻克,在下一篇博客我一定會寫這方面的信息
-
現今爲止,篩選網上的信息,我們有兩種方式
- 方式一:使用BeautifulSoup庫,信息包含在標籤中
- 方式二:使用正則表達式,整個頁面中進行爬取
-
現今爲止,我們常用的輸出方式,使用format函數,先是寫出對應的輸出格式,然後再分佈填入其中
-
對於關鍵字,通過之前的幾個例子發現,無論是翻頁,還是搜索都會映射到網址中的對應的關鍵字,所以要回看關鍵字