你會使用Scrapy-splash抓取js動態(tài)渲染內(nèi)容嗎?

最近想學習下scrapy-splash,之前用了seleium配合chrome總感覺有點慢,想要研究下scrapy-splash, 那知網(wǎng)上的內(nèi)容很多不靠譜的。綜合了好多文章,終于成功了。各位爬友,還沒用過scrapy-splash的,趕緊看看這篇吧。

一、軟件環(huán)境:

  • win 10 64位
  • python 3.6
  • scrapy 1.3.3
  • scrapy-splash 0.7.2

使用的是anaconda,忘了scrapy是自帶的還是后面裝的了,如果安裝好的anaconda沒有,就直接用pip install scrapy 安裝下好了。

二、ScrapySplash 安裝

注意,ScrapySplash需要使用docker,理解的人我就不用解釋,不理解的人和一樣,按操作執(zhí)行就好了。這里的ScrapySplash與上面軟件環(huán)境里的是不一樣的,上面那個是在scrapy中用import引入使用的時候用的,這里的相當于一個軟件,你要安裝了才能使用。

安裝 Docker

準備

由于ScrapySplash要在docker里使用,我們先安裝docker,安裝之前先檢查自己的電腦是不是win 10 64位,還有沒有開啟hyper虛擬化。

  • 查看電腦版本

win+x, 然后點擊系統(tǒng)(Y) :

64位系統(tǒng).png

  • 查看hyper是否啟用

ctrl+shift+esc 打開任務管理器,然后點擊性能,可以從圖片上看到。紅色框的地方。

查看hyper是否啟用.png

如果發(fā)現(xiàn)hyper沒有開啟,也沒關(guān)系,網(wǎng)上搜索一下有相關(guān)介紹,我這里簡單說一下。WIN+X 然后點擊應用與功能,進入后右邊有個程序與功能,點擊進入后點擊左側(cè)的啟用或關(guān)閉windows功能按鈕,在出現(xiàn)的應用里找到hyper-V然后勾選上。具體進入方法不同的win10可能有些不一樣,只要進入到程序與功能就好。
不過有的同學可能根據(jù)這個方法會找不到,這個就要進入到bios里去打開了。進入bios后找到Virtualization Technology,啟動(enable)就好了。 具體方法就不說了,不同電腦進入的方法都不一樣,請大家根據(jù)自己的電腦找相應資料。

正式安裝

win 10的版本不同會有很多問題。
常規(guī)安裝:從官網(wǎng)的下面地址可以下載
https://download.docker.com/win/stable/InstallDocker.msi
如果這種方式安裝出錯或者安裝好后報錯,請使用docker toolbox安裝:
https://docs.docker.com/toolbox/toolbox_install_windows/
注意: docker 使用的是虛擬化技術(shù),因此安裝的時候就一起安裝virtualbox, 請一定要勾選上,如果已經(jīng)安裝過則可以不用。
想要深入了解Docker,可以到Docker 官網(wǎng):https://docs.docker.com/

三、啟動環(huán)境

安裝好docker后,打開docker,正常安裝的可以直接用cmd進行操作,如果是toolbox安裝的,請使用Docker Quickstart Terminal操作。
我是用toolbox安裝的,因此后面命令行操作都是在Docker Quickstart Terminal里面。
打開命令行:
第一次打會比較慢,因為還在啟動virtualbox虛擬機。等待一段時間后,出現(xiàn)下面的界面,說明安裝成功了。


docker啟動后.png

里面有一個IP, 請記住,這是后面要用到的東西。

下載ScrapySplash

在命令行里輸入docker run -p 8050:8050 scrapinghub/splash, 這是docker的使用方式,表示啟動splash, 第一次啟動是本地沒有splash應用,會自動從docker hub去下載,這個過程我們不用管,慢慢等好了。
下載好后,會直接啟動應用,出現(xiàn)下面的界面:

啟動成功.png

這時我們可以在瀏覽器里輸入http://192.168.99.100:8050/,這里的IP就是前面出現(xiàn)的那個IP。出現(xiàn)下面的界面就說明啟動成功了。
splash啟動成功.png

注意:我參考相關(guān)文章時總能看到說是輸入http://localhost:8050/, 這是要設置虛擬機的端口轉(zhuǎn)發(fā)的,不然是沒辦法成功的,如果沒有設置可以直接用上面的http://192.168.99.100:8050/, 如果設置了端口轉(zhuǎn)發(fā)就可以使用http://localhost:8050/。

好了, 至此,整個環(huán)境已經(jīng)搭建好了,下面開始scrapy爬蟲設置了。

四、scrapy爬蟲設置

scrapy項目其實和正常的項目沒什么區(qū)別。如有不懂的,可以參看我另外的文章 Scrapy 抓取本地論壇招聘內(nèi)容 (一)
這里我創(chuàng)建一個新的項目做為學習用:

> scrapy startproject jdproject
> cd jdproject/
> scrapy genspider jd https://www.jd.com/

注意: 這里也是在命令行里操作,不過不用在 Docker Quickstart Terminal, 在正常的cmd里也可以

打開jdproject/spiders/jd.py, 修改內(nèi)容:

# -*- coding: utf-8 -*-
import scrapy
from scrapy.http import Request, FormRequest
from scrapy.selector import Selector
from scrapy_splash.request import SplashRequest, SplashFormRequest


class JdSpider(scrapy.Spider):
    name = "jd"

    def start_requests(self):
        splash_args = {"lua_source": """
                    --splash.response_body_enabled = true
                    splash.private_mode_enabled = false
                    splash:set_user_agent("Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36")
                    assert(splash:go("https://item.jd.com/5089239.html"))
                    splash:wait(3)
                    return {html = splash:html()}
                    """}
        yield SplashRequest("https://item.jd.com/5089239.html", endpoint='run', args=splash_args, callback=self.onSave)

    def onSave(self, response):
        value = response.xpath('//span[@class="p-price"]//text()').extract()
        print(value)

打開jdproject/settings.py, 修改:

# See http://scrapy.readthedocs.org/en/latest/topics/spider-middleware.html
SPIDER_MIDDLEWARES = {
   'scrapy_splash.SplashDeduplicateArgsMiddleware': 100,
}

# See http://scrapy.readthedocs.org/en/latest/topics/downloader-middleware.html
DOWNLOADER_MIDDLEWARES = {
    'scrapy_splash.SplashCookiesMiddleware': 723,
    'scrapy_splash.SplashMiddleware': 725,
    'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810,  # 不配置查不到信息
}

HTTPCACHE_ENABLED = True
HTTPCACHE_EXPIRATION_SECS = 0
HTTPCACHE_DIR = 'httpcache'

SPLASH_URL = "http://192.168.99.100:8050/"  # 自己安裝的docker里的splash位置
DUPEFILTER_CLASS = "scrapy_splash.SplashAwareDupeFilter"
HTTPCACHE_STORAGE = 'scrapy_splash.SplashAwareFSCacheStorage'

五、測試

這里我用的是https://item.jd.com/5089239.html做測試,要拿產(chǎn)品價格。

jd.png

運行爬蟲:


結(jié)果.png

可以很清楚的看到我們要的價格已經(jīng)出現(xiàn)了。

至此,我們成功的部署好ScrapySplash, 并且成功的實現(xiàn)了爬蟲項目。
如果對splash感興趣的話,可以參考官網(wǎng)http://splash.readthedocs.io/en/stable/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容