折腾:
【记录】用Python的Scrapy去爬取Youtube中Humf的字幕
期间,
已经可以去用scrapy打开页面:
了,但是返回的页面,却是没有加载全部的内容:

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

scrapy page load not completed
python – Scrapy response incomplete – Stack Overflow
scrapy page loading
python – Wait until the webpage loads in Scrapy – Stack Overflow
还是去用chrome调试,看看到底加载了数据的js和请求是什么
找到了:
POST /loadvideo/23t1f8d2ISs HTTP/1.1
Host: www.yousubtitles.com
Connection: keep-alive
Content-Length: 0
Pragma: no-cache
Cache-Control: no-cache
Accept: application/json, text/javascript, */*; q=0.01
Origin: http://www.yousubtitles.com
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


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

需要反向解析后,才能方便获取其中的href的链接地址
所以现在清楚了:
实际上此处用Scrapy去抓取的页面,只是普通的静态网页,而其中想要的内容是通过js动态的额外的http的post请求获得的。
所以此处想要实现:Scrapy加载全部网页内容,需要自己去调试页面,找到对应的js的http的请求,然后代码中再去模拟即可。
此处找到的额外的js的http请求是:
Request URL:http://www.yousubtitles.com/loadvideo/23t1f8d2ISs
Request Method: POST
然后再去解析返回的内容。
代码:
<code>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)
</code>效果是:

可以获得返回的内容:

然后接着就可以去进行后续的解析等内容了。
【总结】
此处用Scrapy去抓取的页面,只是普通的静态网页,而其中想要的内容是通过js动态的额外的http的post请求获得的。
所以此处想要实现:Scrapy加载全部网页内容,需要自己去调试页面,找到对应的js的http的请求,然后代码中再去模拟即可。
而具体的额外的http请求是什么,需要自己调试页面去找的。
调试工具推荐Chrome/Firefox/Safari等,都可以。
转载请注明:在路上 » 【已解决】Scrapy如何加载全部网页内容