selenium和pyquery爬取淘寶美食商品信息

1、用selenium自動爬取淘寶美食的商品信息,先定義search方法,該方法用來在搜索框中輸入“美食”,然後點擊搜索按鈕。瀏覽器加載需要時間,要判斷瀏覽器加載成功再執行下一步的操作,其使用方法可在python-selenium官網查看waits相關的介紹,部分代碼複製粘貼即可。設置的條件要在指定的時間內加載出來,否則會拋出異常,使用try迴歸這個方法。

Input爲搜索框,submit爲搜索按鈕,判斷完成後搜索框中輸入“美食”,然後點擊搜索按鈕,最後main方法調用。

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

browser
=webdriver.Chrome()

def search():
   
try:
       
browser.get("https://www.taobao.com")
        input
= WebDriverWait(browser, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, "#q")))
        submit
= WebDriverWait(browser, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "#J_TSearchForm > div.search-button > button")))
        input.send_keys(
"美食")
        submit.click()

   
except TimeoutException :
       
search()

def main():
   
search()

if __name__ == '__main__':
   
main()

因爲search方法外還會有等待判斷,可以把WebDriverWait(browser, 10)放在代碼頭

2、在翻頁解析代碼之前,要先獲取總頁數,輸入“美食”點擊搜索後,需要等待頁數加載出來才能進行下一步操作,所以,還需要再加一個等待判斷,判斷放在search方法裏。

total = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "#mainsrp-pager > div > div > div > div.total")))
return total.text

在main函數中調用,因爲返回的total含有漢子,即漢子與數字共同存在,用re正則表達式解析,提取數字,並把字符串轉化爲整形。

total = search()
total = int(re.compile('(\d+)').search(total).group(1))
print(total)

3、進行翻頁,翻頁有兩種方法,一種是直接點擊下一頁,另一種是在頁數框中輸入

頁碼,點擊確定。


還需要判斷翻頁是否成功,通過高亮顯示的數字與頁數框中的數字比較判斷,可以在搜索框中輸入頁碼進行翻頁,然後判斷是否與高亮顯示的頁碼相同。

定義翻頁方法:input爲頁數框,submit爲確定按鈕,先清除頁數框,在傳入參數,點擊按鈕,然後判斷兩個是否相同。

next_page(page_number):
    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_number)
        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_number)))

    except TimeoutException:
        next_page(page_number)

在main函數中調用,需要遍歷總頁數

for i in range(1, total + 1):
    next_page(i)

4、解析網頁

分析網頁源代碼可知每個商品的信息在id爲mainsrp-itemlist下的items .item中,


所以先判斷所需商品的信息是否加載出來,所需商品信息都加載出來後,用page_source得到網頁源代碼,用pyquery解析,再調用items()方法獲得所有選擇的內容,然後再分別獲取product信息,用find獲取內部元素

def get_products():
    wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#mainsrp-itemlist .items .item')))
    html = browser.page_source
    doc = pq(html)
    items = doc('#mainsrp-itemlist .items .item').items()
    for item in items:
        product = {
                'price': item.find('.price').text()# 價格
                'image': item.find('.pic .img').attr('src')# 圖片
                'deal': item.find('.deal-cnt').text()[:-3]# 成交數,去掉末尾的人付款”
                'title': item.find('.title').text()#標題
                'location': item.find('.location').text()#地點
                'shop': item.find('.shop').text()  #店名
        }
        print(product)

5、調用

每次翻頁都要獲取頁面的商品信息,所以要在next_page()方法中調用

get_products()

運行結果:


6、存儲到mongodb數據庫

MONGO_URL = 'localhost'
MONGO_DB = 'taobao'
MONGO_TABLE = 'meishi'

client = pymongo.MongoClient(MONGO_URL)
db = client[MONGO_DB]
def save_to_mongo(result):
    try:
        if db[MONGO_TABLE].insert(result):
            print("存儲到mongodb成功",result)
    except Exception:
        print("存儲到mongodb失敗")

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章