Python+Scrapy+Selenium數據采集


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

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

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

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

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

About Scrapy

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

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

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

  1. Engine初始化,並從Spider獲取請求。
  2. Request入調度器。
  3. 調度器將Request逐一發送給Scrapy Engine消費。
  4. Scrapy Engine通過下載器中間件將請求發送給下載器。
  5. 下載器將用Request獲取的頁面作為Response結果返回給Scrapy Engine
  6. Scrapy EngineDownloader接收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 項目創建

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

在文件根目錄執行:

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) # 頁面打開需要加載時間,所以建議加個靜默等待

image-20200327102210587

登錄操作

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

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

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

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

image-20200327111331243

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)

image-20200327112059788

登錄成功!~

查詢操作

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)

image-20200327112437222

在搜索后得出以下結果:

image-20200327112546457

通過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)

內容頁

image-20200327115153854

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

關閉操作

driver.close()

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

總結

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

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM