一、關於淘寶網
淘寶網是亞太地區較大的網絡零售、商圈,由阿里巴巴集團在2003年5月創立。淘寶網是中國深受歡迎的網購零售平臺,擁有近5億的註冊用戶數,每天有超過6000萬的固定訪客,同時每天的在線商品數已經超過了8億件,平均每分鐘售出4.8萬件商品。
二、我們的目標是什麼?
1、爬取淘寶頁面某類商品的價格、名稱、店家地址、交易數量;
2、以列表的形式將每一個商品的數據存入.csv文件中;
3、實現與用戶的交互功能,不用修改程序也可以進行爬蟲;
4、打包程序,以方便更換設備時也可以使用。
三、淘寶網爬蟲思路
警告
警告:淘寶網的robots協議設定不允許爬蟲,本文僅供爬蟲學習,切勿對淘寶網進行大規模爬蟲,否則後果自負
爬蟲思路
淘寶網“每天的在線商品數已經超過了8億件,平均每分鐘售出4.8萬件商品”,如此巨大的數據量,如何在淘寶網上爬取下來呢?
其實,淘寶網的搜索功能就是一個“爬蟲”,通過鍵入“關鍵詞”,實現對服務器的訪問,返回你需要的商品序列。一般情況下,返回100頁,每頁48或60個商品。如下圖:
1、我們需要做的是對每一頁進行遍歷,爬取每個商品的價格、名稱、店家地址、交易數量等數據。
2、這時候我們需要看看“源碼”(任意位置右鍵→查看網頁源代碼),淘寶網返回靜態網頁,採用html編寫,源碼如下圖:
3、查看“上圖源碼”,我們發現:
價格數據爲"view_price":“8.50”;
名稱數據爲"raw_title":“愛好圓珠筆按壓式子彈頭油筆批發辦公學生用”
店家地址數據爲"item_loc":“浙江 溫州”
交易數量數據爲"view_sales":“1.0萬+人付款”
4、之後我們需要用python的re(正則表達式)庫對上述數據進行提取(關於正則表達式的編寫,大家可以看一下:正則表達式-菜鳥教程)
5、提取完成之後,就是存儲的問題了,我們需要把提取出來的數據用特定格式存儲在我們的計算機中,本文采用的存儲格式是csv。
以上就是整個“淘寶網爬蟲”思路。
四、程序編寫
#--author--張俊傑@Nick
#coding:utf-8
import requests
import re
import time
import csv
def getHTMLText(url):
try:
#每次登陸淘寶,淘寶都會以加密方式返回登陸賬號和密碼信息,如果使用程序訪問的話,需要發送post請求,這時需要發送cookie,以實現自動登錄。請使用自己的cookie,複製到header字典中。
header={"User-Agent":"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36",
"cookie":“輸入你的cookie”}
r = requests.get(url,headers=header,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)
loc = re.findall(r'\"item_loc\"\:\".*?\"',html)
sale = re.findall(r'\"view_sales\"\:\"[\d\.]*.*?\"',html)
for i in range(len(plt)):
price = eval(plt[i].split(':')[1])
title = eval(tlt[i].split(':')[1])
location = eval(loc[i].split(':')[1])
sales = eval(sale[i].split(':')[1])
ilt.append([price,title,location,sales])
except:
print("")
def printGoodsList(ilt):
tplt = "{:4}\t{:6}\t{:8}\t{:8}\t{:8}"
print(tplt.format("序號","價格","商品名稱","商品地址","付款數量"))
output_list=["序號","價格","商品名稱","商品地址","付款數量"]
#存儲路徑需根據需要更改
with open('C:/Users/你傑哥/Desktop/python/淘寶/'+str(goods)+'('+str(depth*48)+'條數據)'+'.csv',"a+",encoding='GB18030',newline='') as csvfile:
w=csv.writer(csvfile)
w.writerow(output_list)
csvfile.close()
count=0
for g in ilt:
count = count+1
print(tplt.format(count,g[0],g[1],g[2],g[3]))
out_putlist=[count,g[0],g[1],g[2],g[3]]
#存儲路徑需根據需要更改
with open('C:/Users/你傑哥/Desktop/python/淘寶/'+str(goods)+'('+str(depth*48)+'條數據)'+'.csv',"a+",encoding='GB18030',newline='') as csvfile:
w=csv.writer(csvfile)
w.writerow(out_putlist)
csvfile.close()
def main(goods,depth):
start_url='https://s.taobao.com/search?q='+goods
infoList =[]
for i in range(depth):
try:
url = start_url + '&s='+ str(44*i)
# 下面是我的網址簡化過程,最好學習一下。
#1、https://s.taobao.com/search?q=圓珠筆&imgfile=&js=1&stats_click=search_radio_all%3A1&initiative_id=staobaoz_20190826&ie=utf8&p4ppushleft=1%2C48&s=0
#2、https://s.taobao.com/search?q=圓珠筆&imgfile=&js=1&stats_click=search_radio_all%3A1&initiative_id=staobaoz_20190826&ie=utf8&p4ppushleft=1%2C48
#3、https://s.taobao.com/search?q=圓珠筆
#4、這個網址就可以實現我們需要的數據返回。
html= getHTMLText(url)
parsePage(infoList,html)
except:
continue
#print(html)
printGoodsList(infoList)
#實現超級簡單的用戶交互,想爬取什麼就爬取什麼
goods=input("請輸入你需要搜索的商品:")
#本文僅供學習,爬蟲深度的設置,請理性設置
depth=int(input("請輸入需要爬取的頁數(請嘗試在淘寶中搜索該商品關鍵詞,查看返回頁碼,請理性設置爬蟲深度):"))
#傳參,需把外部參數傳入main函數中。
main(goods,depth)
#提醒
print("數據爬取結束")
time.sleep(10)
五、封裝TB.py成.exe文件
在TB.py同目錄下右鍵打開cmd,執行pyinstaller -F TB.py #TB.py爲編寫的python文件(如果不會封裝,請看我上一篇文章)
六、執行TB.exe文件
1、雙擊TB.exe;
2、輸入關鍵詞(比如圓珠筆)、爬蟲頁數(depth)(比如2);
3、爬蟲結束
4、爬蟲結果
七、總結
1、Python程序簡潔,各種第三方庫支持,爬蟲方便;
2、在初次爬取淘寶網時出現了“無法訪問”的問題,這是因爲程序訪問受限,需發送post請求,創建字典,發送User-Agent和cookie;
3、靜態網頁爬蟲需對網頁源代碼進行分析,確定數據位置和特徵;
4、正則表達式是一種非常簡便的數據匹配方式,請認真學習用法,勤加練習;
5、程序編寫、運行會遇到很多的問題,耐心解決;
6、淘寶網是不允許爬蟲的,所以此帖僅供學習爬蟲技術,不建議大家對淘寶網網頁進行大規模爬取。