有时候我们发现,在网页中有些信息是靠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