我是好人,一個大大的良民。
好與壞,關鍵在於使用者噢!
Scrapy 是一個常用的數據採集工具;
Selenium 是一個瀏覽器自動化測試工具;
結合 Scrapy 對數據的處理機制和 Selenium 模擬真實瀏覽器去獲取數據(如:自動化登錄,自動化翻頁等)。可以更好的完成採集。
About Scrapy
Scrapy 是開發者在網絡上用於常用的數據採集工具之一,對於通過 API 獲取數據我們已經司空見慣了,但是有些 WebSite 還是會為了“性能或者安全”等原因,通過某些技術手段特意避開 API 傳遞數據(比如頁面靜態化,一次性token等)。因此為了能夠採集到這些數據,我們可以通過分析站點和標籤結構,然後通過藉助 Scrapy 採集數據。
簡單的介紹了 Scrapy 框架的作用了,那具體如何幫助我們採集數據呢?一起看看 Scrapy 的結構吧:
Scrapy 的數據流由 Scrapy Engine 控制,流程如下:
- Engine 初始化,並從 Spider 獲取請求。
- 將 Request 入調度器。
- 調度器將 Request 逐一發送給 Scrapy Engine 消費。
- Scrapy Engine 通過下載器中間件將請求發送給下載器。
- 下載器將用 Request 獲取的頁面作為 Response 結果返回給 Scrapy Engine 。
- Scrapy Engine 從 Downloader 接收 Response 併發送給 Spider 處理(Spider Middleware)。
- Spider 處理 Response 並向 Scrapy Engine 返回 Item 。
- 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進行定位
<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>
登錄成功!~
查詢操作
<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>
在搜索後得出以下結果:
通過 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>
內容頁
到了這裡,驚不驚喜?現在就可以通過 Xpath 定位並獲取需要的內容進行加工啦,就不細說了。
關閉操作
<code>driver.close()/<code>
數據獲取完,如果沒有其他操作了,就可以把瀏覽器關了。
總結
本章介紹了 Scrapy 和 Selenium 的基本概念和大致的使用方法,總的來說,可以幫助我們在解決一些問題的時候提供新的方案和思路。
閱讀更多 地表嘴強程序員 的文章