1. 程式人生 > >爬蟲實例之selenium爬取淘寶美食

爬蟲實例之selenium爬取淘寶美食

獲取 web tex 匹配 ive cati def presence dea

這次的實例是使用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)

爬蟲實例之selenium爬取淘寶美食