我是好人,一個大大的良民。
好與壞,關鍵在於使用者噢!
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 項目創建
今天就以清博大數據
作為案例樣本,完成自動化登錄,自動化搜索以及數據采集。
在文件根目錄執行:
scrapy startproject qingbo
然后進入目錄 qingbo/
下執行:
scrapy genspider crawl gsdata.cn
得出以下目錄:
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 # 訪問的連接和爬取后的數據在這里處理
其實如何在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
的環境安裝,這里就直接上代碼啦:
站點打開
options = Options() options.headless = False driver = webdriver.Firefox(options=options) driver.get('https://u.gsdata.cn/member/login') driver.implicitly_wait(10) # 頁面打開需要加載時間,所以建議加個靜默等待
登錄操作
可以發現兩個tab,分別為:二維碼登錄、清博帳號登錄。
頁面已經打開了,如何到清博帳號登錄的tab呢?
這里我們需要了解一下Xpath(XML Path Language),它是一種用來確定XML文檔中某部分位置的語言。
簡單的說,就是我們可以用Xpath對“清博帳號登錄”這個Tab進行定位
driver.find_element_by_xpath(".//div[@class='loginModal-content']/div/a[2]").click()
然后定位到賬號密碼框,填入信息:
driver.find_element_by_xpath(".//input[@name='username']").send_keys("username") driver.find_element_by_xpath(".//input[@name='password']").send_keys("password")
最后點擊登錄按鈕:
driver.find_element_by_xpath(".//div/button[@class='loginform-btn']").click() driver.implicitly_wait(5)
登錄成功!~
查詢操作
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)
在搜索后得出以下結果:
通過Xpath
定位到騰訊視頻的a
標簽,然后點擊進入騰訊視頻的數據內容頁:
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)
內容頁
到了這里,驚不驚喜?現在就可以通過Xpath
定位並獲取需要的內容進行加工啦,就不細說了。
關閉操作
driver.close()
數據獲取完,如果沒有其他操作了,就可以把瀏覽器關了。
總結
本章介紹了Scrapy
和Selenium
的基本概念和大致的使用方法,總的來說,可以幫助我們在解決一些問題的時候提供新的方案和思路。
Reference
https://www.cnblogs.com/luozx207/p/9003214.html
https://kite.com/blog/python/web-scraping-scrapy/
https://docs.scrapy.org/en/latest/intro/tutorial.html