1. 程式人生 > >Selenium爬取淘寶商品概要入mongodb

Selenium爬取淘寶商品概要入mongodb

enum style div location 如果 ces tex select target

準備:

1.安裝Selenium:終端輸入 pip install selenium

2.安裝下載Chromedriver:解壓後放在…\Google\Chrome\Application\;如果是Mac,可放入/usr/locl/bin,並將此目錄放入環境變量

3.安裝pyquery:終端輸入 pip install pyquery

4.安裝pymongo:終端輸入 pip install pymongo

5.安裝MongoDB的PyCharm插件:Preferences——Plugins——Mongo Plugin,安裝完成後重啟PyCharm可發現右側有Mongo Explorer

6.安裝MongoDB,windows:參考小歪老師知乎專欄MongoDB及可視化工具的安裝;mac:參考 Mac OSX 平臺安裝 MongoDB安裝

註:有時pip安裝後,PyCharm中無法識別,首先確認編譯器地址是否正確Preferences---Project interpreter;如果還不行,可在PyCharm下Preferences---Project interpreter重新添加包

基於:python3.6

遇到的坑:

1.定位搜索框元素的時候,查找對象路徑,在點完搜索按鈕後的頁面得到(正確應該在淘寶首頁獲取),結果運行的時候,怎麽都獲取不到這個對象;所以:獲取元素的時候,一定要在正確的頁面查找該元素位置

2.翻頁,10頁以前的頁碼鏈接定位中規中矩,10頁以後分奇偶,奇數用#mainsrp-pager > div > div > div > ul > li:nth-child(8) > a定位;偶數用#mainsrp-pager > div > div > div > ul > li:nth-child(9) > a定位,具體見源碼

以下是源碼,參考了很多DC 學院《Python爬蟲(入門+進階)》1-7,1-8課程內容,這算不算硬廣:p

#!/usr/bin/python
# -*- coding:utf-8 -*-

from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as ec
from selenium.webdriver.common.by import By
from pyquery import PyQuery as pq
import re
import time
from pymongo import MongoClient as mc

driver = webdriver.Chrome() #打開Chrome瀏覽器
wait = WebDriverWait(driver, 10)

# 獲取總頁數
def search():
try:
driver.get(‘https://www.taobao.com‘)
# 獲取搜索關鍵字輸入框
input = wait.until(ec.presence_of_element_located((By.CSS_SELECTOR, ‘#q‘)))
# 獲取搜索按鈕
search = wait.until(ec.element_to_be_clickable((By.CSS_SELECTOR, ‘#J_TSearchForm > div.search-button > button‘)),‘not find element‘)
# 輸入關鍵字
input.send_keys(u‘鞋子‘)
# 點搜索
search.click()
# 獲取總頁數
page_total = wait.until(ec.presence_of_element_located((By.CSS_SELECTOR, ‘#mainsrp-pager > div > div > div > div.total‘)),‘not find element‘)
# 調用方法獲取首頁產品概要
get_products()
return page_total.text
except Exception as ex:
print(ex)

# 翻頁
def page(pagenum):
try:
# 頁數小於10,直接按頁數定位
if(pagenum < 10):
css = ‘#mainsrp-pager > div > div > div > ul > li:nth-child({}) > a‘.format(pagenum)
else:
# 頁數大於10,如果是偶數,按nth-child(9)定位
if (pagenum%2==0):
css = ‘#mainsrp-pager > div > div > div > ul > li:nth-child(9) > a‘
# 頁數大於10,如果是奇數,按nth-child(8)定位
else:
css = ‘#mainsrp-pager > div > div > div > ul > li:nth-child(8) > a‘

# 獲取頁碼鏈接
link = wait.until(ec.element_to_be_clickable((By.CSS_SELECTOR, css)), ‘not find element‘)
# 點擊頁碼鏈接
link.click()
time.sleep(1)
# 調用方法獲取產品概要
get_products()
except Exception as ex:
print(ex)

# 獲取每頁產品概要數據
def get_products():
# 所有產品項位置
pb = wait.until(ec.presence_of_element_located((By.CSS_SELECTOR, ‘#mainsrp-itemlist .items .item‘)),
‘ not find element‘)
html = driver.page_source
doc = pq(html)
# 獲取所有產品項數據
items = doc(‘#mainsrp-itemlist .items .item‘).items()
# 輪詢每個產品
for item in items:
product = {
# 產品圖片鏈接
‘image‘: item.find(‘.pic .img‘).attr(‘src‘),
# 產品價格
‘price‘: item.find(‘.price‘).text(),
# 付款人數
‘deal‘: item.find(‘.deal-cnt‘).text(),
# 產品主題
‘title‘: item.find(‘.title‘).text(),
# 產品商店
‘shop‘: item.find(‘.shop‘).text(),
# 產品所在地
‘location‘: item.find(‘.location‘).text(),
}
# print(product[‘title‘])
# 入MongoDB庫
client =mc()
db = client.taobao
set = db.xiezi
set.insert(product)


if __name__ == ‘__main__‘:
# 獲取總頁數
page_total = search()
# 獲取int 總頁數
pagenum = int(re.compile(‘(\d+)‘).search(page_total).group(1))
# 輪詢頁碼,獲取產品概要;測試需要,只取15頁
for i in range(3, 15):
print(str(i)+‘:‘)
page(i)
driver.quit()

Selenium爬取淘寶商品概要入mongodb