python實戰

這個實戰內容包含,selenium、pyquery、re、pymongo
pymongo安裝去這裏:http://blog.51cto.com/13155409/2125020
實戰抓取淘寶美食信息並且存入MongoDB數據庫中

實現源碼如下:

import pymongo
from selenium import webdriver
import re
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from pyquery import PyQuery as pq

browser = webdriver.Chrome()         #導入瀏覽器驅動對象
wait = WebDriverWait(browser, 10)    #設置瀏覽器等待時間

client = pymongo.MongoClient('192.168.10.15')   #創建一個客戶端對象
db = client['taobao']   #設置數據庫名,會自動建立

def search():
        '''
        函數主要功能是:通過webdriver.Chrome打開淘寶網頁,並對“美食”這個關鍵詞進行搜索。
        :return: 返回網頁的響應碼
        '''
        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()
        return browser.page_source

def trun_page(page):
        '''
        該函數的功能是:實現翻頁
        :param page: 通過search頁面搜索到的內容頁數,返回到主函數,然後通過主函數傳遞到此處
        :return: 已經獲得了第一頁的內容了,第二頁開始就從這裏開始反覆調用
        '''
        index = 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'))
        )
        index.clear()   #清除輸入框的內容
        index.send_keys(page)   #輸入page頁碼
        submit.click()   #點擊跳轉的按鈕
        get_products(browser.page_source)

def get_products(html):
        wait.until(
                EC.presence_of_element_located((By.CSS_SELECTOR,'#mainsrp-itemlist .items .item'))
                             )
        html = pq(html)    #使用pyquery解析html代碼
        doc = html('#mainsrp-itemlist .items .item').items()  #通過item產生一個generator類型,使用for循環遍歷
        for item in doc:
                product={
                        "picture": item.find('.pic .img').attr('src'),
                        'name': item.find('.row.title').text().replace('\n',''),
                        'price':item.find('.price').text().replace('\n',''),
                        'deal':item.find('.deal-cnt').text()[:-3],
                        'location':item.find('.location').text()
                }
                print(product)
                #save_to_mongodb(product)
        return(html)

def save_to_mongodb(result):
        '''
        這個函數主要用於把每頁的信息寫入到MongoDB數據庫中
        '''
        try:
                if db['product'].insert(result):   #創建一個product的集合,類似於mysql中的表,然後插入數據
                                print('存儲到MongoDB成功')
        except Exception:
                print('存儲到MongoDB出錯')

def main():         #定義主函數
        # 調用搜索函數 (對關鍵詞搜索,本文中是以“美食”在淘寶搜索)
        html = search()

        # 調用該函用以獲取單頁的所有產品的信息
        html = get_products(html)

        #通過上面get_products()返回經過pyquery解析後的html代碼,用於獲取總頁數
        total = html('.total').text()
        total = int(re.search('(\d+)',total).group(1))
        print(total)  #打印出總頁數

        #對頁數進行循環,這裏是從 2 開始,因爲前面已經獲取一次了
        for page in range(2,total):
                #下面函數主要用於網頁翻頁
                trun_page(page)

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