最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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è)方法是繼承父類(lèi)的。

注意我們最后的請(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ò)用戶(hù)點(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)文章

最新評(píng)論

鄂伦春自治旗| 北安市| 水富县| 金川县| 灌阳县| 枞阳县| 珠海市| 岱山县| 依兰县| 平罗县| 罗平县| 隆回县| 锦州市| 神木县| 青田县| 丹巴县| 福清市| 平安县| 株洲县| 静海县| 化州市| 五大连池市| 新丰县| 虹口区| 凭祥市| 枣强县| 嘉祥县| 武清区| 郯城县| 车险| 汤阴县| 大埔区| 克拉玛依市| 陵水| 汕头市| 六盘水市| 安义县| 都兰县| 福安市| 松潘县| 曲松县|