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

scrapy爬蟲(chóng)遇到j(luò)s動(dòng)態(tài)渲染問(wèn)題

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

一、傳統(tǒng)爬蟲(chóng)的問(wèn)題

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

1.實(shí)際案例

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

在這里插入圖片描述

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

在這里插入圖片描述

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

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

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

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

seleium+chrome

就是傳統(tǒng)的結(jié)合瀏覽器進(jìn)行渲染,優(yōu)點(diǎn)就在于,瀏覽器能訪問(wèn)什么,他就能夠獲取到什么,缺點(diǎn)也很明顯,因?yàn)樗枰浜蠟g覽器,所以它的速度很慢。

selenium+phantomjs

與上一種的方式一樣,但是不需要開(kāi)瀏覽器。

scrapy-splash(推薦)

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

三、安裝使用scrapy-splash

1.安裝Docker

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

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

2.安裝splash鏡像

docker run -p 8050:8050 scrapinghub/splash

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

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

{
  "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
}

下載完成過(guò)后,打開(kāi)瀏覽器訪問(wèn):http://localhost:8050/

在這里插入圖片描述

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

3.安裝scrapy-splash

pip install scrapy-splash

python沒(méi)有花里胡哨的安裝過(guò)程。

四、項(xiàng)目實(shí)踐

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

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.爬蟲(chóng)的設(shè)計(jì)

    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)

這里我們編寫(xiě)一個(gè)初始化的start_requests方法,這個(gè)方法是繼承父類的。

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

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

  • args是配置信息可以參照http://localhost:8050/中的
  • callback下一級(jí)處理方法的函數(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)

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

在這里插入圖片描述

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

在這里插入圖片描述

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

五、總結(jié)與思考

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

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

在這里插入圖片描述

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

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

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

相關(guān)文章

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

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

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

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

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

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

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

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

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

    python用requests實(shí)現(xiàn)http請(qǐng)求代碼實(shí)例

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

    Python爬蟲(chóng)403錯(cuò)誤的終極解決方案

    爬蟲(chóng)在爬取數(shù)據(jù)時(shí),常常會(huì)遇到"HTTP Error 403: Forbidden"的提示,其實(shí)它只是一個(gè)HTTP狀態(tài)碼,表示你在請(qǐng)求一個(gè)資源文件但是nginx不允許你查看,下面這篇文章主要給大家介紹了關(guān)于Python爬蟲(chóng)403錯(cuò)誤的終極解決方案,需要的朋友可以參考下
    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ù)值賦給變量,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • python之yield和return的對(duì)比分析

    python之yield和return的對(duì)比分析

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

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

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

最新評(píng)論