python實戰
阿新 • • 發佈:2018-06-15
Go btn 美食 RM 所有 ML row 寫入 產品 這個實戰內容包含,selenium、pyquery、re、pymongo
pymongo安裝去這裏:http://blog.51cto.com/13155409/2125020
實戰抓取淘寶美食信息並且存入MongoDB數據庫中
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()
python實戰