scrapy html页面加载未完成,【已解决】Scrapy如何加载全部网页内容

本文介绍了在Scrapy中遇到HTML页面加载不完全的问题,以及如何通过分析浏览器网络请求,找到动态加载内容的POST请求,并在Scrapy代码中模拟该请求以获取完整信息。通过调试工具发现额外的HTTP POST请求,然后在Scrapy中实现相同请求,从而成功加载全部网页内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

折腾:

期间,

已经可以去用scrapy打开页面:

了,但是返回的页面,却是没有加载全部的内容:

50a2db03149fcfcc5bf1b04b218a0c23.png

全部加载的应该是这样的:

bd2eab8dbe4a7db3c0f95e7238b08037.png

scrapy page load not completed

scrapy page loading

还是去用chrome调试,看看到底加载了数据的js和请求是什么

找到了:

POST /loadvideo/23t1f8d2ISs HTTP/1.1

Connection: keep-alive

Content-Length: 0

Pragma: no-cache

Cache-Control: no-cache

Accept: application/json, text/javascript, */*; q=0.01

X-Requested-With: XMLHttpRequest

User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36

Accept-Encoding: gzip, deflate

Accept-Language: zh-CN,zh;q=0.9,en;q=0.8

Cookie: _ym_uid=1519808696639134764; _ym_isad=2; _ym_visorc_40164390=w; __atuvc=13%7C9; __atuvs=5a98a5092e989c01003

HTTP/1.1 200 OK

Server: nginx

Date: Fri, 02 Mar 2018 01:55:54 GMT

Content-Type: text/html; charset=utf-8

Content-Length: 1907

Connection: keep-alive

Vary: Accept-Encoding

Content-Encoding: gzip

b0ff21bdc709401881c388dc8827262a.png

4db085452be00e2b73df2ae88c8569b1.png

而得到的其中links是html的encode后的内容:

fb98a35ac068594e15c51c6901c816b4.png

需要反向解析后,才能方便获取其中的href的链接地址

所以现在清楚了:

实际上此处用Scrapy去抓取的页面,只是普通的静态网页,而其中想要的内容是通过js动态的额外的http的post请求获得的。

所以此处想要实现:Scrapy加载全部网页内容,需要自己去调试页面,找到对应的js的http的请求,然后代码中再去模拟即可。

此处找到的额外的js的http请求是:

Request URL:http://www.yousubtitles.com/loadvideo/23t1f8d2ISs

Request Method: POST

然后再去解析返回的内容。

代码:import re

foundVideoId = re.search(r'v=(?P<videoId>[\w\-]+)', singleVideoUrl)

if foundVideoId:

videoId = foundVideoId.group("videoId")

self.logger.info("videoId=%s", videoId) # u'23t1f8d2ISs'

# http://www.yousubtitles.com/loadvideo/23t1f8d2ISs

loadVideoUrl = "http://www.yousubtitles.com/loadvideo/" + videoId

self.logger.info("loadVideoUrl=%s", loadVideoUrl) # u'http://www.yousubtitles.com/loadvideo/23t1f8d2ISs'

yield scrapy.Request(url=loadVideoUrl, callback=self.parseLoadVideoResp, method="POST")

def parseLoadVideoResp(self, response):

"""

parse response of yousubtitles load video for each youtube video id

:param response:

:return:

"""

# for debug

self.saveHtml("loadvideo", response.body)

respUrl = response.url

self.logger.info("respUrl=%s", respUrl)

效果是:

ee8a3ec41801b14dc3224b3f78281342.png

可以获得返回的内容:

867ca323a54804e891f756376d0fef5c.png

然后接着就可以去进行后续的解析等内容了。

【总结】

此处用Scrapy去抓取的页面,只是普通的静态网页,而其中想要的内容是通过js动态的额外的http的post请求获得的。

所以此处想要实现:Scrapy加载全部网页内容,需要自己去调试页面,找到对应的js的http的请求,然后代码中再去模拟即可。

而具体的额外的http请求是什么,需要自己调试页面去找的。

调试工具推荐Chrome/Firefox/Safari等,都可以。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值