1. 程式人生 > >使用selenium+BeautifulSoup 抓取京東商城手機資訊

使用selenium+BeautifulSoup 抓取京東商城手機資訊

1.準備工作:

  1. chromedriver  傳送門:國內:http://npm.taobao.org/mirrors/chromedriver/   vpn:
  2. selenium 
  3. BeautifulSoup4(美味湯)
pip3 install selenium              
pip3 install BeautifulSoup4

  chromedriver 的安裝請自行百度。我們直奔主題。

起飛前請確保準備工作以就緒...

2.分析網頁:

 目標網址:https://www.jd.com/

 

所有item均儲存在class="gl-item"裡面

需求:

  • 使用selenium 驅動瀏覽器自動偵測到input輸入框,輸入框中輸入“手機”,點選搜尋按鈕.
  • 使用seleinum抓取發揮頁面的總頁碼,並模擬手動翻頁
  • 使用BeautifulSoup分析頁面,抓取手機資訊

 從入口首頁進入查詢狀態

 1 # 定義入口查詢介面
 2 def search():
 3     browser.get('https://www.jd.com/')
 4     try:
 5         #
查詢搜尋框及搜尋按鈕,輸入資訊並點選按鈕 6 input = wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, "#key"))) 7 submit = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "#search > div > div.form > button"))) 8 input[0].send_keys('手機') 9 submit.click()
10 # 獲取總頁數 11 page = wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, '#J_bottomPage > span.p-skip > em:nth-child(1) > b'))) 12 return page[0].text 13 # 如果異常,遞迴呼叫本函式 14 except TimeoutException: 15 search()

查詢結束後模擬翻頁

 1 # 翻頁
 2 def next_page(page_number):
 3     try:
 4         # 滑動到網頁底部,加載出所有商品資訊
 5         browser.execute_script("window.scrollTo(0, document.body.scrollHeight);")
 6         time.sleep(4)
 7         html = browser.page_source
 8         # 當網頁到達100頁時,下一頁按鈕失效,所以選擇結束程式
 9         while page_number == 101:
10             exit()
11         # 查詢下一頁按鈕,並點選按鈕
12         button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '#J_bottomPage > span.p-num > a.pn-next > em')))
13         button.click()
14         # 判斷是否載入到本頁最後一款產品Item(每頁顯示60條商品資訊)
15         wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, "#J_goodsList > ul > li:nth-child(60)")))
16         # 判斷翻頁成功
17         wait.until(EC.text_to_be_present_in_element((By.CSS_SELECTOR, "#J_bottomPage > span.p-num > a.curr"), str(page_number)))
18         return html
19     except TimeoutException:
20         return next_page(page_number)

解析頁面上的a標籤

# 解析每一頁面上的a連結
def parse_html(html):
    """
    解析商品列表網頁,獲取商品的詳情頁
    """

    soup = BeautifulSoup(html, 'html.parser')
    items = soup.select('.gl-item')
    for item in items:
        a = item.select('.p-name.p-name-type-2 a')
        link = str(a[0].attrs['href'])
        if 'https:' in link:
            continue
        else:
            link = "https:"+link
        yield link

根據url 擷取商品id 獲取價格資訊

# 獲取手機價格,由於價格資訊是請求另外一個地址https://p.3.cn/prices/mgets?skuIds=J_+product_id
def get_price(product_id):
    url = 'https://p.3.cn/prices/mgets?skuIds=J_' + product_id
    response = requests.get(url,heeders)
    result = ujson.loads(response.text)
    return result

進入item商品詳情頁

# 進入詳情頁
def detail_page(link):
    """
    進入item詳情頁
    :param link: item link
    :return: html
    """
    browser.get(link)
    try:
        browser.execute_script("window.scrollTo(0, document.body.scrollHeight);")
        time.sleep(3)
        html = browser.page_source
        return html
    except TimeoutException:
        detail_page(link)
 1 # 獲取詳情頁的手機資訊
 2 def get_detail(html,result):
 3     """
 4     獲取詳情頁的資料
 5     :param html:
 6     :return:
 7     """
 8     dic ={}
 9     soup = BeautifulSoup(html, 'html.parser')
10     item_list = soup.find_all('div', class_='Ptable-item')
11     for item in item_list:
12         contents1 = item.findAll('dt')
13         contents2 = item.findAll('dd')
14         for i in range(len(contents1)):
15             dic[contents1[i].string] = contents2[i].string
16 
17     dic['price_jd '] = result[0]['p']
18     dic['price_mk '] = result[0]['m']
19     print(dic)

滴滴滴.. 基本上的思路就醬紫咯.. 傳送門依舊開啟直github: https://github.com/shinefairy/spider/tree/master/Crawler

end~