Selenium爬取淘寶商品概要入mongodb

準備:css

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

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

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

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

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

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

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

基於: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 webdriverfrom selenium.webdriver.support.wait import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as ecfrom selenium.webdriver.common.by import Byfrom pyquery import PyQuery as pqimport reimport timefrom pymongo import MongoClient as mcdriver = 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()
相關文章
相關標籤/搜索