準備: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()