python爬取淘寶搜尋頁(練習)
阿新 • • 發佈:2018-11-10
1、本博文中程式碼是轉載內容,原文章地址如下:
https://segmentfault.com/a/1190000014688216
2、原作者講解的很詳細,我只是在原文程式碼的基礎上稍作修改,添加了一些註釋及無關緊要的程式碼
3、本篇博文涉及知識點如下:
①通過對比頁面構造爬取網址
②獲取日期及當前時間
③獲取網頁json內容
④通過觀察json內容找到哪些關鍵點是要提取的資訊,注意各個字典的巢狀
#python3.6
import re
import requests
from datetime import date
import json
import time
def sousuo(keyword,date_,select_type,pages):
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit'
'/537.36 (KHTML, like Gecko) Chrome/63.0.3239.108 Safari/537.36'}
item_ids = [];titles = [];prices = [];locations = [];sales_count = [];user_ids = [];store_names = []
for i in range(int(pages)):
page = str(44 * i)
#構造網址
url = 'https://s.taobao.com/search?q={}&imgfile=&js=1' \
'&stats_click=search_radio_all%3A1&initiative_id={}&ie=utf8{}&s={}'\
.format(keyword,date_,selection[select_type] ,pages)
r = requests.get(url, headers=headers)
#所有的商品資訊都在p_page_config的字典內
data = re.search(r'g_page_config = (.+);',r.text)
#載入json中的內容
data = json.loads(data.group(1), encoding='utf-8')
#層層剝離,每個商品的資訊都在一個字典裡,所有商品的字典組成一個auctions列表,
# mods、itemlist、data、auctions 這幾個字典是巢狀關係
for auction in data['mods']['itemlist']['data']['auctions']:
#以下語句是把一個商品的特定資訊加到指定的列表裡,結合上面的for迴圈,可把所有商品的資訊都加到指定的列表中
item_ids.append(auction['nid']) #nid是商品的編號
titles.append(auction['raw_title']) #raw_title是商品的名字
prices.append(auction['view_price']) #view_price是商品價格
locations.append(auction['item_loc']) #item_loc是賣家地址
sales_count.append(auction['view_sales']) #view_sales是商品銷售量
user_ids.append(auction['user_id']) #user_id是賣家的id
store_names.append(auction['nick']) #nick是賣家商店的店名
# 為便於觀察進度,添加了print
print('已完成%d頁' % (i+1))
# 隔一段時間訪問一次,以免出現"遠端主機強迫關閉了一個現有的連線 10054"
# 設定5秒的時候還是會出現連線失敗的情況,設定10秒基本不會出現連線失敗的情況,但是時間有點長,本次僅做測試學習用,更好的方法以後再改進
time.sleep(10)
#顯示每個商品資訊是否齊全
print(len(item_ids),len(titles),len(prices),len(locations),len(sales_count),len(user_ids),len(store_names))
print(item_ids)
print(titles)
print(prices)
print(locations)
print(sales_count)
print(user_ids)
print(store_names)
return len(item_ids)
#設定用那種方式進行商品排序,default是綜合排序,sale-desc是按銷售量排序
selection = { '0':'&sort=default','1':'&sort=sale-desc'}
date_ = str(date.today()).replace('-','')
keyword = input('輸入商品名:')
pages = input('爬多少頁:')
select_type = input('輸入0按預設排序,輸入1按銷量排序:')
#為便於測試,添加了如下語句
if not keyword:
keyword = '電腦'
if not select_type:
select_type = '0'
if not pages:
pages = '1'
#time.time()獲取當前的時間戳,便於顯示爬取耗費的時間
current_time = time.time()
item_count = sousuo(keyword, date_, select_type, pages)
#用當前的時間點減去爬取之前記錄的時間點就是爬取網站耗去的時間
cost_time = int(time.time().__float__() - current_time.__float__())
print('\n\n抓取%s頁,共%d個商品,用時%ds' % (pages,item_count,cost_time))