1. 程式人生 > >selenium + Chrome 模擬瀏覽器爬淘寶資訊

selenium + Chrome 模擬瀏覽器爬淘寶資訊

環境:

ubuntu16.04
python3.5.2
版本 67.0.3396.87(正式版本) (64 位)
chromedriver 2.40

安裝所需工具:

  • 1 selenium三方庫安裝
pip install selenium  # 安裝selenium庫
mv chromedriver /usr/bin/
  • python下測試chromedriver:
from selenium import webdriver  # 引入驅動物件
driver = webdriver.Chrome()   # 生成谷歌瀏覽器物件
driver.get('http://www.baidu.com'
) #訪問百度

----瀏覽器會自動開啟一個新的頁面並訪問百度,成功說明安裝配置成功.----

分析淘寶頁面並執行selenium

#coding:utf-8
import re
from bs4 import BeautifulSoup
from selenium.common.exceptions import TimeoutException
from selenium import webdriver
#這幾個都是從selenium官網套用的
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import
WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 谷歌瀏覽器驅動物件 browser = webdriver.Chrome() # selenium和PhantomJS分手了,現在可以用無頭瀏覽器FireFox或者Chrome代替 # browser = webdriver.PhantomJS() wait = WebDriverWait(browser, 10) # 開啟淘寶頁面並輸入"美食" def search(): try: browser.get('https://www.taobao.com/'
) # 等待10秒直到找到輸入框 通過css選擇器語法來實現 input_button = wait.until( EC.presence_of_element_located((By.CSS_SELECTOR, "#q")) ) # 等待10秒直到找到搜尋按鈕 通過css選擇器語法來實現 submmit = wait.until( EC.presence_of_element_located((By.CSS_SELECTOR, "#J_TSearchForm > div.search-button > button")) ) # 用send_keys()方法輸入"美食" input_button.send_keys('美食') # 用click()方法點選搜尋按鈕 submmit.click() # 關鍵詞搜尋出來在淘寶中的頁數 total = wait.until( EC.presence_of_element_located((By.CSS_SELECTOR, "#mainsrp-pager > div > div > div > div.total")) ) return total.text # timeout報錯 遞迴呼叫自己 except TimeoutException: return search() # 翻頁函式 def next_page(page_number): try: # 等待10秒直到找到輸入框 通過css選擇器語法來實現 # 淘寶返回頁下面的跳轉的輸入框: 第 [1] 頁 input_button = wait.until( EC.presence_of_element_located((By.CSS_SELECTOR, "#mainsrp-pager > div > div > div > div.form > input")) ) # 等待10秒直到找到搜尋按鈕 通過css選擇器語法來實現 # 淘寶返回頁下面的跳轉按鈕:第 [1] 頁 確認 submmit = wait.until( EC.presence_of_element_located((By.CSS_SELECTOR, "#mainsrp-pager > div > div > div > div.form > span.btn.J_Submit")) ) # 清楚內容 input_button.clear() # 輸入跳轉頁碼 input_button.send_keys(page_number) # 點選跳轉 submmit.click() # 等待跳轉後 高亮的頁碼數字是不是page_number,一定注意引數((By.CSS_SELECTOR,'css語法'),(text)) wait.until( EC.text_to_be_present_in_element((By.CSS_SELECTOR, '#mainsrp-pager > div > div > div > ul > li.item.active > span'), str(page_number)) ) except TimeoutException: next_page(page_number) # 商品詳情解析,這裡只做了列印輸入並未儲存在資料庫 def get_products(): wait.until( EC.presence_of_element_located((By.CSS_SELECTOR, "#mainsrp-itemlist > div > div > div:nth-child(1) > div:nth-child(1) > div.ctx-box.J_MouseEneterLeave.J_IconMoreNew")) ) res = browser.page_source html = BeautifulSoup(res, 'html.parser') # 每個上坪詳情列表結果 items= html.find_all('div',{'class':'ctx-box J_MouseEneterLeave J_IconMoreNew'}) for item in items: print({ 'price':item.find('div',{'class':'price g_price g_price-highlight'}).find('strong').string, 'pay_nums':item.find('div',{'class':'deal-cnt'}).string, 'name':item.find('div',{'class':'row row-2 title'}).find('a').get_text().replace('\n','').replace(' ',''), 'location':item.find('div',{'class':'location'}).string }) # 主函式 def main(): total = search() # 返回的是字串,正則匹配返回頁碼數字 total = int(re.compile('(\d+)').search(total).group(1)) # print(type(total)) for i in range(2,total+1): get_products() next_page(i) if __name__ == '__main__': main()

總結:

本人大四小白,不喜勿碰.如有錯誤歡迎指正,一起學習,共同進步.

  • PhantomJS
    本來打算用Phantomjs代替介面化瀏覽器結果發現,selenium和PhantomJS分道揚鑣了,不過可以用無頭FireFox或者Chrome瀏覽器代替.這裡沒有做研究.