1、用selenium自動爬取淘寶美食的商品信息,先定義search方法,該方法用來在搜索框中輸入“美食”,然後點擊搜索按鈕。瀏覽器加載需要時間,要判斷瀏覽器加載成功再執行下一步的操作,其使用方法可在python-selenium官網查看waits相關的介紹,部分代碼複製粘貼即可。設置的條件要在指定的時間內加載出來,否則會拋出異常,使用try迴歸這個方法。
Input爲搜索框,submit爲搜索按鈕,判斷完成後搜索框中輸入“美食”,然後點擊搜索按鈕,最後main方法調用。
from
selenium import
webdriver
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
browser=webdriver.Chrome()
def search():
try:
browser.get("https://www.taobao.com")
input = WebDriverWait(browser,
10).until(EC.presence_of_element_located((By.CSS_SELECTOR,
"#q")))
submit = WebDriverWait(browser,
10).until(EC.element_to_be_clickable((By.CSS_SELECTOR,
"#J_TSearchForm > div.search-button > button")))
input.send_keys("美食")
submit.click()
except TimeoutException
:
search()
def main():
search()
if __name__
== '__main__':
main()
因爲search方法外還會有等待判斷,可以把WebDriverWait(browser, 10)放在代碼頭
2、在翻頁解析代碼之前,要先獲取總頁數,輸入“美食”點擊搜索後,需要等待頁數加載出來才能進行下一步操作,所以,還需要再加一個等待判斷,判斷放在search方法裏。
total = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "#mainsrp-pager > div > div > div > div.total"))) return total.text
在main函數中調用,因爲返回的total含有漢子,即漢子與數字共同存在,用re正則表達式解析,提取數字,並把字符串轉化爲整形。
total = search() total = int(re.compile('(\d+)').search(total).group(1)) print(total)
3、進行翻頁,翻頁有兩種方法,一種是直接點擊下一頁,另一種是在頁數框中輸入
頁碼,點擊確定。
還需要判斷翻頁是否成功,通過高亮顯示的數字與頁數框中的數字比較判斷,可以在搜索框中輸入頁碼進行翻頁,然後判斷是否與高亮顯示的頁碼相同。
定義翻頁方法:input爲頁數框,submit爲確定按鈕,先清除頁數框,在傳入參數,點擊按鈕,然後判斷兩個是否相同。
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() 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))) except TimeoutException: next_page(page_number)
在main函數中調用,需要遍歷總頁數
for i in range(1, total + 1): next_page(i)
4、解析網頁
分析網頁源代碼可知每個商品的信息在id爲mainsrp-itemlist下的items .item中,
所以先判斷所需商品的信息是否加載出來,所需商品信息都加載出來後,用page_source得到網頁源代碼,用pyquery解析,再調用items()方法獲得所有選擇的內容,然後再分別獲取product信息,用find獲取內部元素
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() for item in items: product = { 'price': item.find('.price').text(), # 價格 'image': item.find('.pic .img').attr('src'), # 圖片 'deal': item.find('.deal-cnt').text()[:-3], # 成交數,去掉末尾的“人付款” 'title': item.find('.title').text(), #標題 'location': item.find('.location').text(), #地點 'shop': item.find('.shop').text() #店名 } print(product)
5、調用
每次翻頁都要獲取頁面的商品信息,所以要在next_page()方法中調用
get_products()
運行結果:
6、存儲到mongodb數據庫
MONGO_URL = 'localhost' MONGO_DB = 'taobao' MONGO_TABLE = 'meishi' client = pymongo.MongoClient(MONGO_URL) db = client[MONGO_DB]
def save_to_mongo(result): try: if db[MONGO_TABLE].insert(result): print("存儲到mongodb成功",result) except Exception: print("存儲到mongodb失敗")