這次的實例是使用selenium爬取淘寶美食關鍵字下的商品信息,然后存儲到MongoDB。
首先我們需要聲明一個browser用來操作,我的是chrome。這里的wait是在后面的判斷元素是否出現時使用,第二個參數為等待最長時間,超過該值則拋出異常。
browser = webdriver.Chrome()
wait = WebDriverWait(browser,10)
聲明好之后就需要進行打開網頁、進行搜索的操作。
#使用webdriver打開chrome,打開淘寶頁面,搜索美食關鍵字,返回總頁數 def search(): try: browser.get('https://www.taobao.com') #判斷輸入框是否已經加載 input = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#q'))) #判斷搜索按鈕是否可以進行點擊操作 submit = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,'#J_TSearchForm > div.search-button > button'))) #輸入美食,點擊搜索按鈕 input.send_keys('美食') submit.click() #使用css_selector找到顯示總頁面的元素,判斷是否出現並獲取其中文字 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: print('timeout!') return search()
第一個頁面操作之后,我們需要進行翻頁操作,如下:
#進行頁面的跳轉,輸入下一頁的頁號,然后點擊確定按鈕,在高亮區域判定是否正確跳轉 def next_page(page_num): try: #判斷輸入框是否出現 input = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#mainsrp-pager > div > div > div > div.form > input'))) #判斷確定按鈕是否可點擊 submit = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,'#mainsrp-pager > div > div > div > div.form > span.btn.J_Submit'))) #清空輸入框現有內容然后輸入頁號,點擊確定 input.clear() input.send_keys(page_num) submit.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_num))) #跳轉成功則獲取該頁所有商品詳情 get_products() except TimeoutException: next_page(page_num)
寫完搜索操作和翻頁操作后,我們需要完成對每個頁面的商品信息獲取功能。
#獲取商品詳情 def get_products(): #判斷商品的item是否加載出來 wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#mainsrp-itemlist .items .item'))) #獲取該頁的源代碼 html = browser.page_source #使用pyquery進行解析,獲取需要的信息 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()[:-3], 'title':item.find('.title').text(), 'shop':item.find('.shop').text(), 'location':item.find('.location').text(), } print(product) save_to_mongo(product)
獲取信息之后則需要對信息進行存儲:
def save_to_mongo(result): try: if db[MONGO_TABLE].insert(result): print('存儲成功',result) except Exception: print('存儲失敗',result)
主函數:
def main(): total = search() total = int(re.search('(\d+)',total).group(1)) #'\d'表示匹配數字 for i in range(2,total+1): next_page(i)