Python+Scrapy+Selenium數據採集!超級詳細!

我是好人,一個大大的良民。

好與壞,關鍵在於使用者噢!

Scrapy 是一個常用的數據採集工具;

Selenium 是一個瀏覽器自動化測試工具;

結合 Scrapy 對數據的處理機制和 Selenium 模擬真實瀏覽器去獲取數據(如:自動化登錄,自動化翻頁等)。可以更好的完成採集。

About Scrapy

Scrapy 是開發者在網絡上用於常用的數據採集工具之一,對於通過 API 獲取數據我們已經司空見慣了,但是有些 WebSite 還是會為了“性能或者安全”等原因,通過某些技術手段特意避開 API 傳遞數據(比如頁面靜態化,一次性token等)。因此為了能夠採集到這些數據,我們可以通過分析站點和標籤結構,然後通過藉助 Scrapy 採集數據。

簡單的介紹了 Scrapy 框架的作用了,那具體如何幫助我們採集數據呢?一起看看 Scrapy 的結構吧:

Python+Scrapy+Selenium數據採集!超級詳細!

Scrapy 的數據流由 Scrapy Engine 控制,流程如下:

  1. Engine 初始化,並從 Spider 獲取請求。
  2. 將 Request 入調度器。
  3. 調度器將 Request 逐一發送給 Scrapy Engine 消費。
  4. Scrapy Engine 通過下載器中間件將請求發送給下載器。
  5. 下載器將用 Request 獲取的頁面作為 Response 結果返回給 Scrapy Engine 。
  6. Scrapy Engine 從 Downloader 接收 Response 併發送給 Spider 處理(Spider Middleware)。
  7. Spider 處理 Response 並向 Scrapy Engine 返回 Item 。
  8. Scrapy Engine 將處理好的 Item 發送給 Item Pipeline ,同時將已處理的信號一同發送給調度器( Scheduler ),請求下一個採集請求。

重複以上步驟處理採集請求,直至 Scheduler 沒有新的 Request 。

Scrapy 安裝教程: https://doc.scrapy.org/en/lat...

Scrapy 項目創建

今天就以 清博大數據 作為案例樣本,完成自動化登錄,自動化搜索以及數據採集。

在文件根目錄執行:

<code>scrapy startproject qingbo/<code>

然後進入目錄 qingbo/ 下執行:

<code>scrapy genspider crawl gsdata.cn/<code>

得出以下目錄:

<code>qingbo/
scrapy.cfg # deploy configuration file

qingbo/ # project's Python module, you'll import your code from here
__init__.py

items.py # project items definition file

middlewares.py # 瀏覽器的啟動和訪問方式在這操作

pipelines.py # 處理好後的數據在這做最後處理

settings.py # project settings file

spiders/ # a directory where you'll later put your spiders
__init__.py
crawl.py # 訪問的連接和爬取後的數據在這裡處理/<code>

其實如何在 Scrapy 結合 Selenium 最關鍵就是在 middlewares.py

具體如何封裝可以參考下這裡: https://www.osgeo.cn/scrapy/t...

About Selenium

Selenium 是一款開源的自動化測試框架,通過不同的瀏覽器和平臺對Web應用進行校驗,目前支持多個語言調用,如:Python、Java、PHP等。

Selenium 測試直接在瀏覽器中運行,就像真實用戶所做的一樣,所以利用這點,可以更好的進行數據採集。

Python Selenium安裝教程: https://selenium-python-zh.re...

Selenium 案例

如果沒有登錄態直接訪問 清博大數據的騰訊視頻

不出意外的話,會跳轉到登錄頁需要登錄。上面已經提到了 Selenium 的環境安裝,這裡就直接上代碼啦:

站點打開

<code>options = Options()
options.headless = False
driver = webdriver.Firefox(options=options)
driver.get('https://u.gsdata.cn/member/login')
driver.implicitly_wait(10) # 頁面打開需要加載時間,所以建議加個靜默等待/<code>


登錄操作

可以發現兩個tab,分別為:二維碼登錄、清博帳號登錄。

頁面已經打開了,如何到清博帳號登錄的tab呢?

這裡我們需要了解一下 Xpath (XML Path Language),它是一種用來確定XML文檔中某部分位置的語言。

簡單的說,就是我們可以用Xpath對“清博帳號登錄”這個Tab進行定位

Python+Scrapy+Selenium數據採集!超級詳細!

<code>driver.find_element_by_xpath(".//div[@class='loginModal-content']/div/a[2]").click()/<code>

然後定位到賬號密碼框,填入信息:

<code>driver.find_element_by_xpath(".//input[@name='username']").send_keys("username")
driver.find_element_by_xpath(".//input[@name='password']").send_keys("password")/<code>

最後點擊登錄按鈕:

<code>driver.find_element_by_xpath(".//div/button[@class='loginform-btn']").click()
driver.implicitly_wait(5)/<code>
Python+Scrapy+Selenium數據採集!超級詳細!

登錄成功!~

查詢操作

<code>driver.get('http://www.gsdata.cn/')
driver.find_element_by_xpath(".//input[@id='search_input']").send_keys("騰訊視頻")
driver.find_element_by_xpath(".//button[@class='btn no btn-default fl search_wx']").click()
driver.implicitly_wait(5)/<code>
Python+Scrapy+Selenium數據採集!超級詳細!

在搜索後得出以下結果:

Python+Scrapy+Selenium數據採集!超級詳細!

通過 Xpath 定位到騰訊視頻的 a 標籤,然後點擊進入騰訊視頻的數據內容頁:

<code>driver.find_element_by_xpath(
".//ul[@class='imgword-list']/li[1]/div[@class='img-word']/div[@class='word']/h1/a").click()
driver.implicitly_wait(5)/<code>

內容頁

Python+Scrapy+Selenium數據採集!超級詳細!

到了這裡,驚不驚喜?現在就可以通過 Xpath 定位並獲取需要的內容進行加工啦,就不細說了。

關閉操作

<code>driver.close()/<code>

數據獲取完,如果沒有其他操作了,就可以把瀏覽器關了。

總結

本章介紹了 Scrapy 和 Selenium 的基本概念和大致的使用方法,總的來說,可以幫助我們在解決一些問題的時候提供新的方案和思路。


分享到:


相關文章: