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&notice=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

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Scrapy可以使用Selenium或Splash来爬取动态加载页面。其中,Selenium是一个自动化测试工具,也可以模拟用户在浏览器中的操作,从而获取页面内容。而Splash是一个JavaScript渲染服务,可以模拟浏览器渲染页面,并且提供了API接口,方便与Scrapy集成。下面分别介绍使用Selenium和Splash来爬取动态加载页面的方法。 1. 使用Selenium 首先需要安装selenium库和对应的浏览器驱动,如ChromeDriver。然后在Scrapy的Spider中使用Selenium来获取页面内容,示例代码如下: ``` from scrapy import Spider from selenium import webdriver class MySpider(Spider): name = 'myspider' def start_requests(self): url = 'http://example.com' yield webdriver.Request(url, self.parse) def parse(self, response): driver = response.request.meta['driver'] # 使用driver来操作页面,获取需要的内容 ... ``` 在start_requests方法中,使用webdriver.Request来发送请求,并将回调函数设置为parse。在parse方法中,通过response.request.meta['driver']获取到了Selenium的WebDriver对象,然后就可以使用该对象来获取页面内容。 2. 使用Splash 首先需要安装Splash服务,并启动该服务。然后在Scrapy的Spider中使用Splash来获取页面内容,示例代码如下: ``` import scrapy from scrapy_splash import SplashRequest class MySpider(scrapy.Spider): name = 'myspider' start_urls = ['http://example.com'] def start_requests(self): for url in self.start_urls: yield SplashRequest(url, self.parse, args={'wait': 0.5}) def parse(self, response): # 使用response来操作页面,获取需要的内容 ... ``` 在start_requests方法中,使用SplashRequest来发送请求,并将回调函数设置为parse。在args参数中,可以设置Splash的一些参数,如wait表示等待时间。在parse方法中,直接使用response来获取页面内容。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值