利用selenium爬取淘寶美食內容
阿新 • • 發佈:2018-05-07
pycharm pid dea int mpi bubuko Go con port
1、啟動pycharm
首先咱們新建一個項目名字大家可以自己設定
接著新建一個spider.p文件
#author: "xian" #date: 2018/5/4 import re #導入re庫 from selenium import webdriver #導入selenium庫 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 #預定義條件供WebDriverWait調用 from pyquery import PyQuery as pq #導入pyquery解析網頁源代碼 import pymongo #導入pymongo庫用於操作mongddb數據庫 MONGO_URL = ‘localhost‘ #指定本機的mongodb數據庫 MONGO_DB = ‘taobao‘ #指定數據庫名稱為taobao MONGO_TABLE = ‘meishi‘ #指定存儲表名稱為meishi client = pymongo.MongoClient(MONGO_URL) #創建一個連接 db = client[MONGO_DB] #訪問一個名為taobao的數據庫並賦值給本地變量db browser = webdriver.Chrome() #驅動Chrome瀏覽器 wait = WebDriverWait(browser,10)#設置等待時間為10s並賦值給wait變量 #定義一個搜索函數search def search(): #異常處理模塊 try ... except... try: browser.get(‘https://www.taobao.com‘) #請求淘寶首頁 #顯示選擇具體見官網:http://selenium-python-zh.readthedocs.io/en/latest/waits.html#id2 # 以下用CSS選擇器設定等待條件 input = wait.until( EC.presence_of_element_located((By.CSS_SELECTOR, ‘#q‘)) #EC.*** ,***為加載條件 具體小夥伴們參見官方文檔即可 ) submit = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,‘#J_TSearchForm > div.search-button > button‘))) #用CSS選擇器(打開chrome找到輸入框右鍵審查元素右擊copy css selector 復制即可 ) #設定Action Chains即動作鏈 input.send_keys(‘美食‘) #相當於輸入關鍵字:美食 submit.click() #相當於模擬點擊動作 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: #引入timeout異常 return search() #如果超時將再請求一次 #執行翻頁操作函數 def 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() #清空框中內容,方便重新填入 (比如你先填了2 就翻到第二頁,現在我當然先清空內容,再填入3才能進入第3頁) 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))) get_products() except TimeoutException: next_page(page_number) #商品詳情解析函數 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() #參見官網http://pyquery.readthedocs.io/en/latest/api.html for item in items: #以下使用pyquery選擇器選擇元素 product = { ‘image‘:item.find(‘.pic .img‘).attr(‘src‘), ‘price‘:item.find(‘.price‘).text().replace(‘\n‘,‘‘), ‘deal‘:item.find(‘.deal-cnt‘).text()[:-3], ‘title‘:item.find(‘.title‘).text().replace(‘\n‘,‘‘), ‘shop‘:item.find(‘.shop‘).text(), ‘location‘:item.find(‘.location‘).text(), } print(product) save_to_mongo(product) #存儲到mongodb數據庫 def save_to_mongo(result): try: if db[MONGO_TABLE].insert(result): print(‘存儲到mongodb成功!‘,result) except Exception: print(‘存儲到mongodb失敗!‘,result) #主函數 def main(): total = search() #打印結果為:共100頁 total = int(re.compile(‘(\d+)‘).search(total).group(1)) #使用正則表達式抽取其中的數字100 int()將字符串轉為整數 for i in range(2,total + 1): next_page(i) browser.close() #該函數的作為為只在當前py執行,方便調試 if __name__ == ‘__main__‘: main()
運行結果:
小夥伴們可是將其中的美食字樣該為其他想要獲取的淘寶商品數據嘗試運行下,是不是挺有意思的,哈哈!
利用selenium爬取淘寶美食內容