用python爬取分析淘寶商品信息詳解技術(shù)篇
Tip:本文僅供學(xué)習(xí)與交流,切勿用于非法用途?。。?/p>
背景介紹
有個(gè)同學(xué)問(wèn)我:“XXX,有沒(méi)有辦法搜集一下淘寶的商品信息啊,我想要做個(gè)統(tǒng)計(jì)”。于是乎,閑來(lái)無(wú)事的我,又開(kāi)始琢磨起這事…

一、模擬登陸
興致勃勃的我,沖進(jìn)淘寶就準(zhǔn)備一頓亂搜:

在搜索欄里填好關(guān)鍵詞:“顯卡”,小手輕快敲擊著回車(chē)鍵(小樣~看我的)
心情愉悅的我等待著返回滿(mǎn)滿(mǎn)的商品信息,結(jié)果苦苦的等待換了的卻是302,于是我意外地來(lái)到了登陸界面。

情況基本就是這么個(gè)情況了…
然后我查了一下,隨著淘寶反爬手段的不斷加強(qiáng),很多小伙伴應(yīng)該已經(jīng)發(fā)現(xiàn),淘寶搜索功能是需要用戶(hù)登陸的!
關(guān)于淘寶模擬登陸,有大大已經(jīng)利用requests成功模擬登陸(感興趣的小伙伴請(qǐng)往這邊>>>requests登陸淘寶<<<)
這個(gè)方法得先分析淘寶登陸的各種請(qǐng)求,并模擬生成相應(yīng)的參數(shù),相對(duì)來(lái)說(shuō)有一定的難度。于是我決定換一種思路,通過(guò)selenium+二維碼的方式:
# 打開(kāi)圖片
def Openimg(img_location):
img=Image.open(img_location)
img.show()
# 登陸獲取cookies
def Login():
driver = webdriver.PhantomJS()
driver.get('https://login.taobao.com/member/login.jhtml')
try:
driver.find_element_by_xpath('//*[@id="login"]/div[1]/i').click()
except:
pass
time.sleep(3)
# 執(zhí)行JS獲得canvas的二維碼
JS = 'return document.getElementsByTagName("canvas")[0].toDataURL("image/png");'
im_info = driver.execute_script(JS) # 執(zhí)行JS獲取圖片信息
im_base64 = im_info.split(',')[1] #拿到base64編碼的圖片信息
im_bytes = base64.b64decode(im_base64) #轉(zhuǎn)為bytes類(lèi)型
time.sleep(2)
with open('./login.png','wb') as f:
f.write(im_bytes)
f.close()
t = threading.Thread(target=Openimg,args=('./login.png',))
t.start()
print("Logining...Please sweep the code!\n")
while(True):
c = driver.get_cookies()
if len(c) > 20: #登陸成功獲取到cookies
cookies = {}
for i in range(len(c)):
cookies[c[i]['name']] = c[i]['value']
driver.close()
print("Login in successfully!\n")
return cookies
time.sleep(1)
通過(guò)webdriver打開(kāi)淘寶登陸界面,把二維碼下載到本地并打開(kāi)等待用戶(hù)掃碼(相應(yīng)的元素大家通過(guò)瀏覽器的F12元素分析很容易就能找出)。待掃碼成功后,將webdriver里的cookies轉(zhuǎn)為DICT形式,并返回。(這里是為了后續(xù)requests爬取信息的時(shí)候使用)
二、爬取商品信息
當(dāng)我拿到cookies之后,便能對(duì)商品信息進(jìn)行爬取了。
(小樣 ~我來(lái)啦)
1. 定義相關(guān)參數(shù)
定義相應(yīng)的請(qǐng)求地址,請(qǐng)求頭等等:
# 定義參數(shù)
headers = {'Host':'s.taobao.com',
'User-Agent':'Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:63.0) Gecko/20100101 Firefox/63.0',
'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language':'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
'Accept-Encoding':'gzip, deflate, br',
'Connection':'keep-alive'}
list_url = 'http://s.taobao.com/search?q=%(key)s&ie=utf8&s=%(page)d'
2. 分析并定義正則
當(dāng)請(qǐng)求得到HTML頁(yè)面后,想要得到我們想要的數(shù)據(jù)就必須得對(duì)其進(jìn)行提取,這里我選擇了正則的方式。通過(guò)查看頁(yè)面源碼:

偷懶的我上面只標(biāo)志了兩個(gè)數(shù)據(jù),不過(guò)其他也是類(lèi)似的,于是得到以下正則:
# 正則模式 p_title = '"raw_title":"(.*?)"' #標(biāo)題 p_location = '"item_loc":"(.*?)"' #銷(xiāo)售地 p_sale = '"view_sales":"(.*?)人付款"' #銷(xiāo)售量 p_comment = '"comment_count":"(.*?)"'#評(píng)論數(shù) p_price = '"view_price":"(.*?)"' #銷(xiāo)售價(jià)格 p_nid = '"nid":"(.*?)"' #商品唯一ID p_img = '"pic_url":"(.*?)"' #圖片URL
(ps.聰明的小伙伴應(yīng)該已經(jīng)發(fā)現(xiàn)了,其實(shí)商品信息是被保存在了g_page_config變量里面,所以我們也可以先提取這個(gè)變量(一個(gè)字典),然后再讀取數(shù)據(jù),也可!)
3. 數(shù)據(jù)爬取
完事具備,只欠東風(fēng)。于是,東風(fēng)來(lái)了:
# 數(shù)據(jù)爬取
key = input('請(qǐng)輸入關(guān)鍵字:') # 商品的關(guān)鍵詞
N = 20 # 爬取的頁(yè)數(shù)
data = []
cookies = Login()
for i in range(N):
try:
page = i*44
url = list_url%{'key':key,'page':page}
res = requests.get(url,headers=headers,cookies=cookies)
html = res.text
title = re.findall(p_title,html)
location = re.findall(p_location,html)
sale = re.findall(p_sale,html)
comment = re.findall(p_comment,html)
price = re.findall(p_price,html)
nid = re.findall(p_nid,html)
img = re.findall(p_img,html)
for j in range(len(title)):
data.append([title[j],location[j],sale[j],comment[j],price[j],nid[j],img[j]])
print('-------Page%s complete!--------\n\n'%(i+1))
time.sleep(3)
except:
pass
data = pd.DataFrame(data,columns=['title','location','sale','comment','price','nid','img'])
data.to_csv('%s.csv'%key,encoding='utf-8',index=False)
上面代碼爬取20也商品信息,并將其保存在本地的csv文件中,效果是這樣的:

三、簡(jiǎn)單數(shù)據(jù)分析
有了數(shù)據(jù),放著豈不是浪費(fèi),我可是社會(huì)主義好青年,怎能做這種事? 那么,就讓我們來(lái)簡(jiǎn)單看看這些數(shù)據(jù)叭:
(當(dāng)然,數(shù)據(jù)量小,僅供娛樂(lè)參考)
1.導(dǎo)入庫(kù)
# 導(dǎo)入相關(guān)庫(kù) import jieba import operator import pandas as pd from wordcloud import WordCloud from matplotlib import pyplot as plt
相應(yīng)庫(kù)的安裝方法(其實(shí)基本都能通過(guò)pip解決):
- jieba
- pandas
- wordcloud
- matplotlib
2.中文顯示
# matplotlib中文顯示 plt.rcParams['font.family'] = ['sans-serif'] plt.rcParams['font.sans-serif'] = ['SimHei']
不設(shè)置可能出現(xiàn)中文亂碼等鬧心的情況哦~
3.讀取數(shù)據(jù)
# 讀取數(shù)據(jù)
key = '顯卡'
data = pd.read_csv('%s.csv'%key,encoding='utf-8',engine='python')
4.分析價(jià)格分布
# 價(jià)格分布
plt.figure(figsize=(16,9))
plt.hist(data['price'],bins=20,alpha=0.6)
plt.title('價(jià)格頻率分布直方圖')
plt.xlabel('價(jià)格')
plt.ylabel('頻數(shù)')
plt.savefig('價(jià)格分布.png')
價(jià)格頻率分布直方圖:

5.分析銷(xiāo)售地分布
# 銷(xiāo)售地分布
group_data = list(data.groupby('location'))
loc_num = {}
for i in range(len(group_data)):
loc_num[group_data[i][0]] = len(group_data[i][1])
plt.figure(figsize=(19,9))
plt.title('銷(xiāo)售地')
plt.scatter(list(loc_num.keys())[:20],list(loc_num.values())[:20],color='r')
plt.plot(list(loc_num.keys())[:20],list(loc_num.values())[:20])
plt.savefig('銷(xiāo)售地.png')
sorted_loc_num = sorted(loc_num.items(), key=operator.itemgetter(1),reverse=True)#排序
loc_num_10 = sorted_loc_num[:10] #取前10
loc_10 = []
num_10 = []
for i in range(10):
loc_10.append(loc_num_10[i][0])
num_10.append(loc_num_10[i][1])
plt.figure(figsize=(16,9))
plt.title('銷(xiāo)售地TOP10')
plt.bar(loc_10,num_10,facecolor = 'lightskyblue',edgecolor = 'white')
plt.savefig('銷(xiāo)售地TOP10.png')
銷(xiāo)售地分布:

銷(xiāo)售地TOP10:

6.詞云分析
# 制作詞云
content = ''
for i in range(len(data)):
content += data['title'][i]
wl = jieba.cut(content,cut_all=True)
wl_space_split = ' '.join(wl)
wc = WordCloud('simhei.ttf',
background_color='white', # 背景顏色
width=1000,
height=600,).generate(wl_space_split)
wc.to_file('%s.png'%key)
淘寶商品”顯卡“的詞云:

寫(xiě)在最后
感謝各位大大的耐心閱讀~
到此這篇關(guān)于用python爬取分析淘寶商品信息詳解技術(shù)篇的文章就介紹到這了,更多相關(guān)python爬取淘寶商品信息內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Django 對(duì)IP訪問(wèn)頻率進(jìn)行限制的例子
今天小編就為大家分享一篇Django 對(duì)IP訪問(wèn)頻率進(jìn)行限制的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-08-08
淺談Python Opencv中g(shù)amma變換的使用詳解
下面小編就為大家分享一篇淺談Python Opencv中g(shù)amma變換的使用詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-04-04
python實(shí)現(xiàn)周期方波信號(hào)頻譜圖
這篇文章主要介紹了python 周期方波信號(hào)頻譜圖,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-07-07
python+jinja2實(shí)現(xiàn)接口數(shù)據(jù)批量生成工具
這篇文章主要介紹了python+jinja2實(shí)現(xiàn)接口數(shù)據(jù)批量生成工具的操作方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-08-08
在Mac OS上搭建Python的開(kāi)發(fā)環(huán)境
這篇文章主要介紹了在Mac OS上搭建Apache服務(wù)器和Python解釋器的開(kāi)發(fā)環(huán)境,雖然Mac OS上自帶Python但往往難以滿(mǎn)足開(kāi)發(fā)者對(duì)版本的需求,需要的朋友可以參考下2015-12-12

