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


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

 

附上完整源碼


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM