又到了一年一度的教師節(jié),每次教師節(jié)大家都會(huì)煩惱不知道送什么禮物?尤其是對(duì)于理工男來(lái)說(shuō),更是一個(gè)讓人頭大的問(wèn)題。我今天就和大家分享一個(gè)用Python爬取淘寶商品信息的項(xiàng)目,希望可以給大家選禮物時(shí)提供一個(gè)參考。
1.爬取目標(biāo)
本次項(xiàng)目利用selenium抓取淘寶商品信息,用selenium語(yǔ)法來(lái)獲取商品信息、價(jià)格、購(gòu)買(mǎi)人數(shù)、圖片、以及店鋪的名字,最后再把獲取的信息儲(chǔ)存在MongoDB中。
2.準(zhǔn)備工作
在開(kāi)始本次項(xiàng)目前,首先你要確保正確安裝好Chome瀏覽器并配置好對(duì)應(yīng)版本的ChromeDriver;另外,還需要正確安裝Python的selenium庫(kù)和pymongo庫(kù);最后還要在電腦上安裝好MongoDB。
3.下面給出Windows下安裝selenium、pymongo、MongoDB的方法
selenium:
pipinstallselenium? || pip3installselenium
pymongo:
pipinstallpymongo? || pip3installpymongo
MongoDB:
由于MongoDB現(xiàn)在版本比較多,3.0和4.0安裝方法存在差異,我下載的是3.x版本的,安裝和配置都比較簡(jiǎn)單,所以,我也建議大家安裝和使用3.x版本的。
下載鏈接:
https://www.mongodb.com/download-center/community
ChromeDriver下載鏈接:
https://chromedriver.storage.googleapis.com/index.html
這里下載的ChromeDriver版本要和你下載的谷歌瀏覽器的版本相一致,否則程序運(yùn)行會(huì)出現(xiàn)錯(cuò)誤。下載完后將ChromeDriver.exe放到你Python安裝路徑下的Scripts中即可。
4.提取單頁(yè)商品信息
獲取各個(gè)元素用到的是selenium語(yǔ)法的
find_element_by_xpath()
括號(hào)中需要填入各元素的Xpath路徑。
獲取商品信息
代碼如下:
'info': li.find_element_by_xpath('.//div[@class="row row-2 title"]').text
獲取價(jià)格信息
代碼如下:
'price': li.find_element_by_xpath('.//a[@class="J_ClickStat"]').get_attribute('trace-price') +'元'
獲取付款人數(shù)
代碼如下:
'deal': li.find_element_by_xpath('.//div[@class="deal-cnt"]').text
獲取圖片
代碼如下:
'image': li.find_element_by_xpath('.//div[@class="pic"]/a/img').get_attribute('src')
獲取店鋪名字
代碼如下:
'name': li.find_element_by_xpath('.//div[@class="shop"]/a/span[2]').text
5.提取多頁(yè)商品信息
經(jīng)過(guò)上面的分析,只能爬取一頁(yè)的商品信息,我們想獲取多頁(yè)信息,就需要先定義一個(gè)函數(shù),將總頁(yè)數(shù)提取出來(lái),代碼如下
#提取總頁(yè)數(shù)
defsearch():
driver.find_element_by_id('q').send_keys('python')
driver.find_element_by_class_name("tb-bg").click()
time.sleep(10)
token
= driver.find_element_by_xpath(
'//*[@id="mainsrp-pager"]/div/div/div/div[1]'
).text
token =int(re.compile('\d+').search(token).group(0))
returntoken
6.向下滑動(dòng)頁(yè)面
我們都知道selenium用來(lái)抓取動(dòng)態(tài)渲染的頁(yè)面非常有效,我們?cè)谧ト№?yè)面信息時(shí),需要模擬人來(lái)操作下拉、翻頁(yè)等操作。
對(duì)于下拉操作,有爬蟲(chóng)基礎(chǔ)的可能會(huì)想到用selenium模擬的操作,但本次項(xiàng)目我們用js語(yǔ)法來(lái)模擬下拉,這樣做的好處就是不容易被淘寶的反爬機(jī)制識(shí)別,代碼如下
defdrop_down():
forxinrange(1,11,2):
time.sleep(0.5)
j = x/10#滑動(dòng)到的位置
js ='document.documentElement.scrollTop = document.documentElement.scrollHeight * %f'%j
? ? ? ? driver.execute_script(js)
同理,我們也定義一個(gè)函數(shù)來(lái)模擬翻頁(yè),代碼如下
defnext_page():
? ? token = search()
num =0
whilenum != token -1:
driver.get('https://s.taobao.com/search?q={}&s={}'.format(keyword,44*num))
driver.implicitly_wait(10)#隱式等待
num +=1
? ? ? ? drop_down()
? ? ? ? get_product()
翻頁(yè)編寫(xiě)時(shí),需要注意,我在代碼加入了keyword,意思就是可以根據(jù)你自己的需求,爬取不同種類(lèi)的商品信息。
7.將數(shù)據(jù)保存至MongoDB
defsave_to_mongo(result):
try:
ifdb[MONGO_COLLECTION].insert(result):
print('儲(chǔ)存到MongoDB成功')
exceptException:
print('儲(chǔ)存到MongoDB失敗')
8.結(jié)果展示
總結(jié)
這次用selenium爬取淘寶商品信息,代碼邏輯框架如下
由于我能力有限,暫時(shí)只能實(shí)現(xiàn)這么多功能,下一步準(zhǔn)備對(duì)MongoDB儲(chǔ)存的數(shù)據(jù)進(jìn)行分析,這樣就完成了從數(shù)據(jù)爬取——數(shù)據(jù)儲(chǔ)存——數(shù)據(jù)分析一個(gè)完整的過(guò)程。如果有感興趣的小伙伴,后臺(tái)可以回復(fù)「教師節(jié)」獲取項(xiàng)目源碼。
最后,祝所有的老師們:教師節(jié)快樂(lè)!