selenium+phantomjs爬取京東商品信息

来源:https://www.cnblogs.com/cany/archive/2019/05/21/10903189.html
-Advertisement-
Play Games

selenium+phantomjs爬取京東商品信息 今天自己實戰寫了個爬取京東商品信息,和上一篇的思路一樣,附上鏈接:https://www.cnblogs.com/cany/p/10897618.html 打開 https://www.jd.com/ 首先不需要登陸就可搜索,淘寶不一樣,所以淘寶 ...


selenium+phantomjs爬取京東商品信息

今天自己實戰寫了個爬取京東商品信息,和上一篇的思路一樣,附上鏈接:https://www.cnblogs.com/cany/p/10897618.html

打開 https://www.jd.com/ 首先不需要登陸就可搜索,淘寶不一樣,所以淘寶我還沒試過。

開啟F12 定位一下搜索框和搜索按鈕

input = WAIT.until(EC.presence_of_element_located((By.XPATH,'//*[@id="key"]')))
        submit = WAIT.until(EC.element_to_be_clickable((By.XPATH,'//*[@id="search"]/div/div[2]/button')))
        input.send_keys(goods)
        submit.click()

接下來我們要的是按銷量排名,那就要點擊這個 onclick事件
enter description here

發現使用click()還是無法進行點擊,因為這是個js跳轉 所以得用下麵代碼

submit_js = WAIT.until(EC.element_to_be_clickable((By.XPATH, '//*[@id="J_filter"]/div[1]/div[1]/a[2]')))
browser.execute_script("$(arguments[0]).click()", submit_js)

接下來就還是檢測是否載入了下麵的元素
enter description here

開始分析各項 怎麼獲取裡面的數據就不說了
enter description here

這時候可能爬的不完全,因為京東是動態載入的 需要去模擬一下把頁面拉到底部

browser.execute_script("window.scrollTo(0,document.body.scrollHeight)")

按照這樣子進行迴圈遍歷,把每一個值添加到goods_data列表裡去,但也保證不了可能會出現找不到對象的屬性,拋出AttributeError異常,這裡已經嘗試過了,所以寫下這個異常處理!

然後獲取完一頁就下一頁,然後得寫個代碼來檢查是否跳轉到指定頁面

WAIT.until(EC.text_to_be_present_in_element((By.CSS_SELECTOR,'#J_bottomPage > span.p-num > a.curr'),str(page_num)))

再獲取每一頁當前頁面源碼進行解析提取內容,保存到 goods_data 列表中,最後寫入xls文件!

Tips:裡面sleep 時間視情況而定,太快會導致獲取不全,但如果網速快能彌補這一點,目前測試情況來看是這樣子的問題!

附上代碼:

from selenium import webdriver
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from bs4 import BeautifulSoup
import xlwt
import time


goods = input('請輸入你要爬取的商品名稱:')
goods_data = []
browser = webdriver.PhantomJS()
WAIT = WebDriverWait(browser,10)
browser.set_window_size(1000,600)


def seach(goods):
    try:
        print('開始自動化爬取京東商品信息......')
        browser.get('https://www.jd.com/')
        input = WAIT.until(EC.presence_of_element_located((By.XPATH,'//*[@id="key"]')))
        submit = WAIT.until(EC.element_to_be_clickable((By.XPATH,'//*[@id="search"]/div/div[2]/button')))
        input.send_keys(goods)
        submit.click()
        submit_js = WAIT.until(EC.element_to_be_clickable((By.XPATH, '//*[@id="J_filter"]/div[1]/div[1]/a[2]')))
        browser.execute_script("$(arguments[0]).click()", submit_js)
        time.sleep(1)
        get_source()
    except TimeoutException:
        return seach(goods)


def get_source():
    browser.execute_script("window.scrollTo(0,document.body.scrollHeight)")
    time.sleep(1)
    WAIT.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#J_goodsList > ul')))
    html = browser.page_source
    soup = BeautifulSoup(html,'lxml')
    save_data(soup)


def save_data(soup):
    html = soup.find_all(class_='gl-i-wrap')
    for item in html:
        try:
            goods_name = item.find(class_='p-name').find('em').text
            goods_link = 'https:' + item.find(class_='p-img').find('a').get('href')
            goods_evaluate = item.find(class_='p-commit').text
            goods_store = item.find(class_='curr-shop').text
            goods_money = item.find(class_='p-price').find('i').text
            print(('爬取: ' + goods_name))
            goods_data.append([goods_name,goods_link,goods_evaluate,goods_store,goods_money])
        except AttributeError:
            pass


def next_page(page_num):
    try:
        print('獲取下一頁數據')
        next_btn = WAIT.until(EC.element_to_be_clickable((By.CSS_SELECTOR,'#J_bottomPage > span.p-num > a.pn-next')))
        next_btn.click()
        WAIT.until(EC.text_to_be_present_in_element((By.CSS_SELECTOR,'#J_bottomPage > span.p-num > a.curr'),str(page_num)))
        get_source()
    except TimeoutException:
        browser.refresh()
        return next_page(page_num)


def save_to_excel():
    book = xlwt.Workbook(encoding='utf-8', style_compression=0)
    sheet = book.add_sheet(goods, cell_overwrite_ok=True)
    sheet.col(0).width = 256 * 80
    sheet.col(1).width = 256 * 40
    sheet.col(2).width = 256 * 20
    sheet.col(3).width = 256 * 25
    sheet.col(4).width = 256 * 20
    sheet.write(0, 0, '商品名稱')
    sheet.write(0, 1, '商品鏈接')
    sheet.write(0, 2, '評價人數')
    sheet.write(0, 3, '店名')
    sheet.write(0, 4, '價格')
    for item in goods_data:
        n = goods_data.index(item) + 1
        sheet.write(n, 0, item[0])
        sheet.write(n, 1, item[1])
        sheet.write(n, 2, item[2])
        sheet.write(n, 3, item[3])
        sheet.write(n, 4, item[4])
    book.save(str(goods) + u'.xls')


def main():
    try:
        seach(goods)
        for i in range(2,11):
            next_page(i)
        print('-'*50)
        print('數據爬取完畢,正在寫入xls.....')
        save_to_excel()
        print('寫入成功!!!')
    finally:
        browser.close()
        browser.quit()


if __name__ == '__main__':
    main()

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Collection集合 數組的長度是固定的,集合的長度是可變的 數組中存儲的是同一類型的元素,可以存儲基本數據類型值。集合存儲的都是對象。而且對象的類型可以不一致。 集合框架 java import java.util. ; public class IteratorDemo{ public st ...
  • 111
    1. 內容大綱 1. 自定義模塊 2. 模塊是什麼? 3. 為什麼要有模塊? 什麼是腳本? 4. 模塊的分類 5. import的使用 第一次導入模塊執行三件事 被導入模塊有獨立的名稱空間 為模塊起別名 導入多個模塊 6. from ... import ... from ... import .. ...
  • 一、TCP簡介 1、TCP介紹 TCP協議,傳輸控制協議(英語:Transmission Control Protocol,縮寫為 TCP)是一種面向連接的、可靠的、基於位元組流的傳輸層通信協議。 TCP通信需要經過創建連接、數據傳送、終止連接三個步驟。 TCP通信模型中,在通信開始之前,一定要先建立 ...
  • 下載安裝 官網https://golang.google.cn/dl/下載,安裝 環境變數配置 參考https://www.jianshu.com/p/5c1873eaf3ca Bash 編輯~/.bash_profile文件(vim ~/.bash_profile,進入vim的正常模式,在正常模式 ...
  • 第一個爬蟲程式——豆瓣新書信息爬取。主要用到 soup 的 find 和 find_all 方法。 ...
  • 前言: 我們在操作資料庫時候一般都是通過sql代碼來操作mysql資料庫中相關數據,這就需要懂得sql語句,那麼怎麼樣才能在不懂sql語句的情況下通過我們所學的python代碼來實現對mysql資料庫的操作? 當然有這種神奇的操作,其中之一就是今天深入瞭解的ORM對象關係映射(Object Rela ...
  • 運行結果: ...
  • Jenkins 的前身是 Hudson 是一個可擴展的持續集成引擎。 1.安裝JDK環境: 1.1配置環境變數信息如下:切記一定要找對jdk的安裝目錄 2.安裝Maven環境 2.1環境變數配置如下:註意找到maven的安裝目錄 3.安裝Jenkins CenOS版本 3.2修改配置文件如下: 3. ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...