淘寶頁面比較複雜,含有各類請求參數和加密參數,若是直接請求或者分析Ajax將會很是繁瑣。Selenium是一個自動化測試工具,能夠驅動瀏覽器去完成各類工做,好比模擬點擊、輸入和下拉等多種功能,這樣咱們只需關心操做,不須要關心後臺發生了怎麼樣的請求下面對具體操做步驟進行詳述。html
建立webdriver對象web
#建立一個WebDriver對象 from Selenium import webdriver browser = webdriver.Chrome()
大多數網絡應用程序都使用AJAX技術。當瀏覽器加載頁面時,該頁面中的元素可能會以不一樣的時間間隔進行加載。這使得定位元素變得困難:若是一個元素還沒有存在於DOM中,則定位函數將引起ElementNotVisibleException異常。使用等待,咱們能夠解決這個問題。等待在執行的動做之間提供了一些鬆弛 - 主要是定位元素或任何其餘操做與元素。正則表達式
等待示例mongodb
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC driver = webdriver.Firefox() driver.get("http://somedomain/url_that_delays_loading") try: element = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, "myDynamicElement")) ) finally: driver.quit()
目標網站分析瀏覽器
查看CSS選擇器網絡
分別獲取這四個元素的CSS選擇器,方法爲動圖所示dom
代碼ide
主程序函數
import re from pyquery import PyQuery as pq from selenium import webdriver from selenium.common.exceptions import TimeoutException from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from config import * import pymongo #MogoDB配置 client = pymongo.MongoClient(MONGO_URL) db = client[MONGO_DB] #建立WebDriver對象 browser = webdriver.Chrome() #等待變量 wait = WebDriverWait(browser,10) #模擬搜索美食 def search(): try: browser.get('https://www.taobao.com/')#打開淘寶首頁 tb_input = wait.until( EC.presence_of_element_located((By.CSS_SELECTOR, '#q')) )#等待輸入框加載完成 search_btn = wait.until( EC.element_to_be_clickable((By.CSS_SELECTOR, '#J_TSearchForm > div.search-button > button')) )#等待搜索按鈕加載完成 tb_input.send_keys('美食')#輸入框中傳入「美食」 search_btn.click()#點擊搜索 total = wait.until( EC.presence_of_element_located((By.CSS_SELECTOR, '#mainsrp-pager > div > div > div > div.total')) )#加載完成,獲取頁數元素 get_products() return total.text#獲取元素中的文本 except TimeoutException: return search()#若發生異常,從新調用本身 #翻頁函數 def next_page(page_number): try: page_input = wait.until( EC.presence_of_element_located((By.CSS_SELECTOR, '#mainsrp-pager > div > div > div > div.form > input')) )#等待翻頁輸入框加載完成 confirm_btn = wait.until( EC.element_to_be_clickable((By.CSS_SELECTOR, '#mainsrp-pager > div > div > div > div.form > span.btn.J_Submit')) )#等待確認按鈕加載完成 page_input.clear()#清空翻頁輸入框 page_input.send_keys(page_number)#傳入頁數 confirm_btn.click()#確認點擊翻頁 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)) )#確認已翻到page_number頁 get_products() except TimeoutException: next_page(page_number)#若發生異常,從新調用本身 #獲取商品信息 def get_products(): wait.until( EC.presence_of_element_located((By.CSS_SELECTOR, '#mainsrp-itemlist .items .item')) )#等待商品信息加載完成,商品信息的CSS選擇器分析HTML源碼獲得 html = browser.page_source#獲得頁面HTML源碼 doc = pq(html)#建立PyQuery對象 items = doc('#mainsrp-itemlist .items .item').items()#獲取當前頁全部商品信息的html源碼 for item in items: product = { 'image':item.find('.pic .img').attr('src'), 'price':item.find('.price').text(), 'deal':item.find('.deal-cnt').text()[:-3], 'title':item.find('.title').text(), 'shop':item.find('.shop').text(), 'location':item.find('.location').text() } print(product) save_to_mongoDB(product)#保存到MongoDB #保存到MongoDB def save_to_mongoDB(product): try: if db[MONGO_TABLE].insert(product): print('存儲到MongoDB成功',product) except Exception: print('存儲到MongoDB失敗',product) def main(): total = search()#獲取商品頁數,字符串類型 total = int(re.compile('(\d+)').search(total).group(1))#利用正則表達式提取數字,並強制轉換爲int類型 for i in range(2, total+1): next_page(i) browser.close() if __name__ == '__main__': main()
MongoDB配置代碼工具
MONGO_URL = 'localhost' MONGO_DB = 'taobao' MONGO_TABLE = 'meishi'
運行結果