前言:
今天就給大家帶來一個淘寶商品數據爬蟲。順便按老規矩把抓取到的數據可視化一波。廢話不多說,讓我們愉快地開始吧~
開發工具
Python版本:3.6.4
相關模塊:
DecryptLogin模塊;
pyecharts模塊;
以及一些Python自帶的模塊。
環境搭建
安裝Python並添加到環境變量,pip安裝需要的相關模塊即可。
數據爬取
既然說了是模擬登錄相關的爬蟲小案例,首先自然是要實現一下淘寶的模擬登錄啦。這里還是利用我們開源的DecryptLogin庫來實現,只需三行代碼即可:
'''模擬登錄淘寶'''
@staticmethod
def login():
lg = login.Login()
infos_return, session = lg.taobao()
return session
另外,順便提一句,經常有人想讓我在DecryptLogin庫里加入cookies持久化功能。其實你自己多寫兩行代碼就能實現了:
if os.path.isfile('session.pkl'):
self.session = pickle.load(open('session.pkl', 'rb'))
else:
self.session = TBGoodsCrawler.login()
f = open('session.pkl', 'wb')
pickle.dump(self.session, f)
f.close()
我真不想在這個庫里添加這個功能,后面我倒是想添加一些其他爬蟲相關的功能,這個之后再說吧。好的,偏題了,言歸正傳吧。接着,我們去網頁版的淘寶抓一波包吧。比如F12打開開發者工具后,在淘寶的商品搜索欄里隨便輸入點東西,就像這樣:

全局搜索一下諸如search這樣的關鍵詞,可以發現如下鏈接:

看看它返回的數據是啥:

看來應該沒錯了。另外,如果小伙伴們自己實戰的時候沒有找到這個接口api,可以嘗試再點擊一下右上角的下一頁商品按鈕:

這樣就肯定能抓到這個請求接口啦。簡單測試一下,可以發現盡管請求這個接口所需攜帶的參數看上去很多,但實際上必須要提交的參數只有兩個,即:
q: 商品名稱
s: 當前頁碼的偏移量
好啦,根據這個接口,以及我們的測試結果,現在就可以愉快地開始實現淘寶商品數據的抓取啦。具體而言,主代碼實現如下:
'''外部調用'''
def run(self):
search_url = 'https://s.taobao.com/search?'
while True:
goods_name = input('請輸入想要抓取的商品信息名稱: ')
offset = 0
page_size = 44
goods_infos_dict = {}
page_interval = random.randint(1, 5)
page_pointer = 0
while True:
params = {
'q': goods_name,
'ajax': 'true',
'ie': 'utf8',
's': str(offset)
}
response = self.session.get(search_url, params=params)
if (response.status_code != 200):
break
response_json = response.json()
all_items = response_json.get('mods', {}).get('itemlist', {}).get('data', {}).get('auctions', [])
if len(all_items) == 0:
break
for item in all_items:
if not item['category']:
continue
goods_infos_dict.update({len(goods_infos_dict)+1:
{
'shope_name': item.get('nick', ''),
'title': item.get('raw_title', ''),
'pic_url': item.get('pic_url', ''),
'detail_url': item.get('detail_url', ''),
'price': item.get('view_price', ''),
'location': item.get('item_loc', ''),
'fee': item.get('view_fee', ''),
'num_comments': item.get('comment_count', ''),
'num_sells': item.get('view_sales', '')
}
})
print(goods_infos_dict)
self.__save(goods_infos_dict, goods_name+'.pkl')
offset += page_size
if offset // page_size > 100:
break
page_pointer += 1
if page_pointer == page_interval:
time.sleep(random.randint(30, 60)+random.random()*10)
page_interval = random.randint(1, 5)
page_pointer = 0
else:
time.sleep(random.random()+2)
print('[INFO]: 關於%s的商品數據抓取完畢, 共抓取到%s條數據...' % (goods_name, len(goods_infos_dict)))
數據可視化
這里我們來可視化一波我們抓到的奶茶數據。先來看看在淘寶上賣奶茶的商家在全國范圍內的數量分布情況:

看完數據分布沒想到啊,奶茶店鋪最多的地方竟然是廣東。
再來看看淘寶上賣奶茶的店鋪的銷量排名前10名:

以及淘寶上評論數量前10名的奶茶店鋪:

再看看在這些店鋪要運費和不要運費的商品比例:

最后,再看看奶茶相關商品的售價區間唄:

