本次目標是爬取京東商品信息,包括商品的圖片,名稱,價格,評價人數,店鋪名稱。抓取入口就是京東的搜索頁面,這個連接能夠經過直接構造參數訪問https://search.jd.com/Search?keyword=iPhone,顯示的就是第一頁的搜索結果。web
頁面下方有一個分頁導航,包括前7頁的連接,下一頁的連接和跳轉任意頁面的連接。chrome
這裏的商品顯示結果通常都是100頁,要獲取每一頁的內容只須要將頁碼從1到100遍歷便可。因此,咱們直接在頁面輸入框中輸入要跳轉的頁面,點擊肯定按鈕就跳轉到對應的頁面。url
咱們在這裏不使用直接點擊「下一頁」,一旦爬取過程當中出現異常退出,就沒法切換到後續頁面了。而且,在爬取過程當中也須要記住當前的頁碼數。當咱們利用Selenium加載某一頁的商品後,在用相應的解析庫解析便可。spa
咱們首先須要構造一個抓取的URL:https://search.jd.com/Search?keyword=iPhone,參數keyword就是要搜索的關鍵字。只要改變這個參數,就能獲取不一樣商品的列表,這裏咱們能夠將它定義爲一個變量。code
# _*_ coding=utf-8 _*_ import pymongo from selenium import webdriver from selenium.common.exceptions import TimeoutException from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.wait import WebDriverWait from urllib.parse import quote # 配置Selenium browser = webdriver.Chrome(executable_path=r'D:\Google\Chrome\Application\chromedriver') wait = WebDriverWait(browser, 10) keyword = 'iPhone' # 配置MongoDB MONGO_URL = 'localhost' MONGO_DB = 'JD' MONGO_COLLECTION = 'goods' client = pymongo.MongoClient(MONGO_URL) db = client[MONGO_DB] def get_page(page): """ 獲取頁面 :param page: 頁碼 :return: """ print('正在爬取第', page, '頁') try: url = 'https://search.jd.com/Search?keyword=' + quote(keyword) browser.get(url) if page >= 1: # 頁碼搜索框加載成功 search_page = wait.until( EC.presence_of_element_located( (By.XPATH, '//div[@id="J_searchWrap"]//div[@id="J_bottomPage"]//span[2]/input')) ) # 頁碼確認按鈕加載成功 submit = wait.until( EC.element_to_be_clickable((By.XPATH, '//div[@id="J_searchWrap"]//div[@id="J_bottomPage"]//span[2]/a'))) print('button') search_page.clear() search_page.send_keys(page) submit.click() # 當前頁碼顯示標識加載成功,對比咱們傳入的page,結果一致就返回True,證實是跳轉到了傳入的page頁面 wait.until( EC.text_to_be_present_in_element( (By.XPATH, '//div[@id="J_searchWrap"]//div[@id="J_bottomPage"]/span//a[@class="curr"]'), str(page)) ) # 商品列表加載成功 wait.until( EC.presence_of_element_located((By.XPATH, '//div[@id="J_searchWrap"]//div[@id="J_goodsList"]/ul//li')) ) print('Goods show successfully') get_goods() except TimeoutException: get_page(page) def get_goods(): """ 獲取商品數據 :return: """ items = browser.find_elements_by_xpath('//div[@id="J_searchWrap"]//div[@id="J_goodsList"]/ul//li') for item in items: goods = { 'img': item.find_element_by_xpath('//div[@class="p-img"]/a/img').get_attribute('src'), 'price': item.find_element_by_xpath('//div[@class="p-price"]/strong').text, 'commit': item.find_element_by_xpath('//div[@class="p-commit"]/strong').text, 'title': item.find_element_by_xpath('//div[@class="p-name p-name-type-2"]/a').text, 'shop': item.find_element_by_xpath('//div[@class="p-shop"]/span/a').text, } print(goods) save_to_mongo(goods) def save_to_mongo(result): """ 保存到MongoDB :param result: 抓取到的結果:單個商品信息 :return: """ try: if db[MONGO_COLLECTION].insert(result): print('儲存到MongoDB成功!') except Exception: print('存儲到MongoDB失敗!') if __name__ == '__main__': for i in range(1, 10): get_page(i)