欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

scrapy爬蟲遇到j(luò)s動態(tài)渲染問題

 更新時間:2022年05月27日 10:56:42   作者:卑微小鐘  
本文主要介紹了scrapy爬蟲遇到j(luò)s動態(tài)渲染問題,通過js渲染出來的動態(tài)網(wǎng)頁的內(nèi)容與網(wǎng)頁文件內(nèi)容是不一樣的,本文就來解決一下這些問題,感興趣的可以了解一下

一、傳統(tǒng)爬蟲的問題

scrapy爬蟲與傳統(tǒng)爬蟲一樣,都是通過訪問服務(wù)器端的網(wǎng)頁,獲取網(wǎng)頁內(nèi)容,最終都是通過對于網(wǎng)頁內(nèi)容的分析來獲取數(shù)據(jù),這樣的弊端就在于他更適用于靜態(tài)網(wǎng)頁的爬取,而面對js渲染的動態(tài)網(wǎng)頁就有點力不從心了,因為通過js渲染出來的動態(tài)網(wǎng)頁的內(nèi)容與網(wǎng)頁文件內(nèi)容是不一樣的。

1.實際案例

騰訊招聘:https://careers.tencent.com/search.html

在這里插入圖片描述

這個網(wǎng)站第一眼看過去是非常中規(guī)中矩的,結(jié)構(gòu)也很鮮明,感覺是很好爬的樣子,但是當(dāng)你查看他的網(wǎng)頁文件的時候,就會發(fā)現(xiàn):

在這里插入圖片描述

網(wǎng)頁文件并沒有太多的內(nèi)容,全部是引用了js做的動態(tài)渲染,所有數(shù)據(jù)都在js中間,這就使我們無法對于網(wǎng)頁的結(jié)構(gòu)進(jìn)行分析來進(jìn)行爬取數(shù)據(jù)

那我們?nèi)绾?,獲取到它實際顯示的頁面,然后對頁面內(nèi)容進(jìn)行分析呢?

二、scrapy解決動態(tài)網(wǎng)頁渲染問題的策略

目前scrapy解決動態(tài)網(wǎng)頁渲染問題的主要有以下三種的解決方法:

seleium+chrome

就是傳統(tǒng)的結(jié)合瀏覽器進(jìn)行渲染,優(yōu)點就在于,瀏覽器能訪問什么,他就能夠獲取到什么,缺點也很明顯,因為它需要配合瀏覽器,所以它的速度很慢。

selenium+phantomjs

與上一種的方式一樣,但是不需要開瀏覽器。

scrapy-splash(推薦)

而scrapy-splash與以上兩種方法對比,它更加快速輕量,由于,他是基于twisted和qt開發(fā)的輕量瀏覽器引擎,并提供了http api,速度更快,最重要的是他能夠與scrapy非常完美的融合。

三、安裝使用scrapy-splash

1.安裝Docker

由于ScrapySplash要在docker里使用,我們先安裝docker,過程比較復(fù)雜痛苦,略。

在安裝的過程中有一個非常嚴(yán)峻的問題,那就是docker,需要開啟win10 hyper虛擬服務(wù),這與你在電腦上安裝的VM是相沖突的,所以在使用docker,的時候無法使用VM虛擬機(jī),而且每次切換時都需要重啟電腦,目前這個問題暫時無法解決。

2.安裝splash鏡像

docker run -p 8050:8050 scrapinghub/splash

這個過程異常異常的慢,而且必須是國內(nèi)的鏡像,才能夠下載下來。

所以我配置了兩個國內(nèi)的下載IP,一個網(wǎng)易的,一個阿里云的。

{
  "registry-mirrors": [
    "https://registry.docker-cn.com",
    "http://hub-mirror.c.163.com",
    "https://docker.mirrors.ustc.edu.cn"
  ],
  "insecure-registries": [],
  "debug": true,
  "experimental": false
}

下載完成過后,打開瀏覽器訪問:http://localhost:8050/

在這里插入圖片描述

這就表示已經(jīng)安裝完成了,命令行不能關(guān)閉哦

3.安裝scrapy-splash

pip install scrapy-splash

python沒有花里胡哨的安裝過程。

四、項目實踐

1.項目的創(chuàng)建和配置過程略

2.settings.py的配置

PIDER_MIDDLEWARES = {
   'scrapy_splash.SplashDeduplicateArgsMiddleware': 100,
}
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://localhost:8050/"  # 自己安裝的docker里的splash位置
# DUPEFILTER_CLASS = "scrapy_splash.SplashAwareDupeFilter"
HTTPCACHE_STORAGE = 'scrapy_splash.SplashAwareFSCacheStorage'

3.爬蟲的設(shè)計

    def start_requests(self):
        splah_args = {
            "lua_source": """
            function main(splash, args)
              assert(splash:go(args.url))
              assert(splash:wait(0.5))
              return {
                html = splash:html(),
                png = splash:png(),
                har = splash:har(),
              }
            end
            """
        }
        headers = {
            'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) '
                          'Chrome/72.0.3626.109 Safari/537.36',
        }
        yield SplashRequest(url=self.start_url, callback=self.parse, args=splah_args,
                            headers=headers)

這里我們編寫一個初始化的start_requests方法,這個方法是繼承父類的。

注意我們最后的請求方式SplashRequest,我們不再使用Request,而是使用scrapy-splash的請求方式,這里也體現(xiàn)了它與scope框架的完美融合。

至于里面的參數(shù),就沒有必要介紹了,其中要注意兩個參數(shù)argscallback。

  • args是配置信息可以參照http://localhost:8050/中的
  • callback下一級處理方法的函數(shù)名,最后的方法一定要指向self.parse,這是scrapy迭代爬取的靈魂。

4.解析打印數(shù)據(jù)

    def parse(self, response):
        print(response.text)
        job_boxs = response.xpath('.//div[@class="recruit-list"]')
        for job_box in job_boxs:
            title = job_box.xpath('.//a/h4/text()').get()
            print(title)

這是通過渲染以后的網(wǎng)頁數(shù)據(jù)

在這里插入圖片描述

這里我們直接獲取職位的標(biāo)題

在這里插入圖片描述

這就表明scrapy爬蟲應(yīng)對動態(tài)網(wǎng)頁渲染問題已經(jīng)解決,也就意味著scrapy能夠處理大部分的網(wǎng)頁,并可以應(yīng)對一些圖形驗證問題

五、總結(jié)與思考

之后遇到的問題,當(dāng)我們獲取到了,職位列表過后,當(dāng)我們需要訪問詳情頁的時候,我們就必須獲取詳情頁的鏈接,但是騰訊非常的聰明,并沒有采用超鏈接的方式進(jìn)行跳轉(zhuǎn),而是通過用戶點擊事件,然后通過js跳轉(zhuǎn),這就造成了我們無法獲取詳情頁的鏈接。

當(dāng)我沮喪的時候,我認(rèn)真的檢查了瀏覽器與服務(wù)器的數(shù)據(jù)交換中,其實它的數(shù)據(jù)也是通過js進(jìn)行后臺請求得到的,所以通過對大量的數(shù)據(jù)進(jìn)行采集,最終找到了他的數(shù)據(jù)接口(賊開心?。。。?/p>

在這里插入圖片描述

這時候我們就要做取舍了,我們想要的是所有數(shù)據(jù),并不是渲染出來的網(wǎng)頁,與解析網(wǎng)頁內(nèi)容相比,直接通過它的接口獲取json數(shù)據(jù),更加快捷方便,速度更快,所以我們就要做出取舍,在這里直接獲取接口數(shù)據(jù)將更好,錯誤率會更低,速度也會更快。

其實大部分的動態(tài)網(wǎng)頁的渲染,都存在與數(shù)據(jù)端進(jìn)行請求交互數(shù)據(jù),當(dāng)然也存在一些,直接把數(shù)據(jù)存在js中間,然后再通過js渲染到網(wǎng)頁上,這時候scrapy-splash就可以發(fā)揮價值了,尤其是在一些驗證碼,圖形驗證方面更加突出。隨著前端技術(shù)的不斷發(fā)展,前端對數(shù)據(jù)的控制更加靈活多樣,這也要求爬蟲的邏輯也需要不斷的跟進(jìn),也要求使用新的工具,新的技術(shù),在不斷的探索實踐中跟上時代的步伐。

到此這篇關(guān)于scrapy爬蟲遇到j(luò)s動態(tài)渲染問題的文章就介紹到這了,更多相關(guān)scrapy爬蟲js動態(tài)渲染內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python中Pycharm 輸出中文或打印中文亂碼現(xiàn)象的解決辦法

    python中Pycharm 輸出中文或打印中文亂碼現(xiàn)象的解決辦法

    本篇文章主要介紹了python中Pycharm 輸出中文或打印中文亂碼現(xiàn)象的解決辦法 ,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • Python socket實現(xiàn)的文件下載器功能示例

    Python socket實現(xiàn)的文件下載器功能示例

    這篇文章主要介紹了Python socket實現(xiàn)的文件下載器功能,結(jié)合實例形式分析了Python使用socket模塊實現(xiàn)的文件下載器客戶端與服務(wù)器端相關(guān)操作技巧,需要的朋友可以參考下
    2019-11-11
  • Python3標(biāo)準(zhǔn)庫之threading進(jìn)程中管理并發(fā)操作方法

    Python3標(biāo)準(zhǔn)庫之threading進(jìn)程中管理并發(fā)操作方法

    這篇文章主要介紹了Python3標(biāo)準(zhǔn)庫之threading進(jìn)程中管理并發(fā)操作方法,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-03-03
  • Python實現(xiàn)Event回調(diào)機(jī)制的方法

    Python實現(xiàn)Event回調(diào)機(jī)制的方法

    今天小編就為大家分享一篇Python實現(xiàn)Event回調(diào)機(jī)制的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-02-02
  • python用requests實現(xiàn)http請求代碼實例

    python用requests實現(xiàn)http請求代碼實例

    這篇文章主要介紹了python用requests實現(xiàn)http請求過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-10-10
  • Python爬蟲403錯誤的終極解決方案

    Python爬蟲403錯誤的終極解決方案

    爬蟲在爬取數(shù)據(jù)時,常常會遇到"HTTP Error 403: Forbidden"的提示,其實它只是一個HTTP狀態(tài)碼,表示你在請求一個資源文件但是nginx不允許你查看,下面這篇文章主要給大家介紹了關(guān)于Python爬蟲403錯誤的終極解決方案,需要的朋友可以參考下
    2023-05-05
  • python 判斷一組數(shù)據(jù)是否符合正態(tài)分布

    python 判斷一組數(shù)據(jù)是否符合正態(tài)分布

    這篇文章主要介紹了python 如何判斷一組數(shù)據(jù)是否符合正態(tài)分布,幫助大家更好的利用python分析數(shù)據(jù),感興趣的朋友可以了解下
    2020-09-09
  • Python如何將函數(shù)值賦給變量

    Python如何將函數(shù)值賦給變量

    這篇文章主要介紹了Python如何將函數(shù)值賦給變量,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-04-04
  • python之yield和return的對比分析

    python之yield和return的對比分析

    這篇文章主要介紹了python之yield和return的對比分析,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • Django ORM外鍵查詢與反向查詢技巧

    Django ORM外鍵查詢與反向查詢技巧

    Django 的 ORM(對象關(guān)系映射)是其最強(qiáng)大的功能之一,它使得數(shù)據(jù)庫操作變得直觀和簡潔,在復(fù)雜的數(shù)據(jù)庫結(jié)構(gòu)中,外鍵(Foreign Key)的使用及其對應(yīng)的反向查詢是 Django 開發(fā)中不可或缺的部分,本文將詳細(xì)介紹如何在 Django 中利用外鍵進(jìn)行數(shù)據(jù)查詢以及執(zhí)行反向查詢
    2023-11-11

最新評論