scrapy大成之路 -- 爬取动态加载页面的数据

有时候我们发现,在网页中有些信息是靠js加载的。比如百度图片。当采用在html页面上用xpath定位的方法时会发现定位不到资源。

但是考虑到资源加载到浏览器上并被我们看见这一过程,必定有资源的传输。所以一定有资源文件从后端传递到了前端。

因此我们可以通过查询传递的文件来定位资源。

具体的办法是,右键检查,在network选项卡中找到数据。

加载资源的name可以用如下方式解析:

如https://y.gtimg.cn/mediastyle/yqq/layout_0412.css?max_age=25920000&v=20190312

protocal+host+url

?以前的“.css”表示文件类型,以后的表示查询条件。

数据不会存放在js、css、html文件中。查找除了这些以外的文件(当然比如.png也可以排除),右边选择preview选项卡即可查看文件内容。如果是json则应进一步查看是否为需要的数据。

如果是,将域名右键copy下来,对于ajax加载的情况,可以进一步分析域名间的差异。

然后将域名作为start_urls发起请求。

通过response.text得到文件主体。

利用json.loads(str)转化为dict。

再通过dict['key']来索引。例如:

# -*- coding: utf-8 -*-
import scrapy
import json
from selenium_spider.items import SeleniumSpiderItem


class SpySpider(scrapy.Spider):
    name = 'spy'
    #allowed_domains = ['spy.com']
    start_urls = ['https://u.y.qq.com/cgi-bin/musics.fcg?-=getUCGI5277960422635535&g_tk=5381&sign=zzakzoefrc20r16c3y043b1ce033020c02a95c2f22890e044b&loginUin=0&hostUin=0&format=json&inCharset=utf8&outCharset=utf-8¬ice=0&platform=yqq.json&needNewCode=0&data=%7B%22detail%22%3A%7B%22module%22%3A%22musicToplist.ToplistInfoServer%22%2C%22method%22%3A%22GetDetail%22%2C%22param%22%3A%7B%22topId%22%3A4%2C%22offset%22%3A0%2C%22num%22%3A20%2C%22period%22%3A%222020-04-10%22%7D%7D%2C%22comm%22%3A%7B%22ct%22%3A24%2C%22cv%22%3A0%7D%7D']

    def parse(self, response):
        data = response.text
        data_dict = json.loads(data)
        it = SeleniumSpiderItem()
        for i in data_dict['detail']['data']['songInfoList']:
            it['name'] = i['name']
            it['singer'] = i['singer'][0]['name']
            yield it

 

你可能感兴趣的:(scrapy大成之路 -- 爬取动态加载页面的数据)