selenium + Chrome 模擬瀏覽器爬淘寶資訊
阿新 • • 發佈:2019-01-09
環境:
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瀏覽器代替.這裡沒有做研究.