Part 0 安装
采用Anaconda版本的Python可以直接使用conda install -c scrapinghub scrapy进行安装,采用pip install Scrapy有的环境需要其他的依赖,可能会报错。
Part 1 信息获取
打开番剧索引链接https://www.bilibili.com/anime/index/
F12打开浏览器控制台,inspect in,点到对应的番剧发现信息列表如图,虽然点右键可以复制Xpath,不过这样获得的Xpath经常在Scrapy里面无法获取。这里我们手工来填,就根据属性 class="bangumi-item"就行。(在使用Xpath helper输入Xpath查询之前是不带xh-highlight的,这里是因为插件高亮显示的原因)
获取结果如下:
由于这里是按追番人数分的,切换到按更新时间和评分分信息又会不一样。再细分一下,各个信息Xpath如下。是否会员观看就没管了…也差不多。
标题 //*[@class="bangumi-item"]//*[@class="bangumi-title"]
人数 //*[@class="bangumi-item"]//*[@class="shadow"]
集数 //*[@class="bangumi-item"]//*[@class="pub-info"]
命令行测试
这里是在浏览器里面获得的,再来测试一下Scrapy里面能否成功获取。
开cmd输入scrapy shell "https://www.bilibili.com/anime/index",命令行方式测试一下是否能正常获取。
需要注意有的时候因为反爬虫机制不能正确返回Response,查询一下帮助scrapy shell -h,加上-s USER_AGENT='Mozilla/5.0'就可以更改对应的设置,即
scrapy shell "https://www.bilibili.com/anime/index" -s USER_AGENT='Mozilla/5.0'
In [1]: response.xpath('//*[@class="bangumi-item"]//*[@class="bangumi-title"]').extract()
Out[1]: []
获取失败了?再输入view(response),在浏览器里面看一下返回的结果是怎样的。结果发现弹出一个:“没有找到这样的番剧”。是哪里出错了?输入response.text查看一下源代码,发现里面并没有出现具体信息,所以光用这个网址来获得信息是不行的。
API获取
F12里面Network抓包看一下,为了找出是在哪里出现了具体信息,我们需要在Response里面批量搜索,比如追番人数391.9。按照网上的方法,点右键先把抓下来的包存成har,然后搜索391.9
出现在4527行
它的request请求格式出现在与之最近的4124行
https://bangumi.bilibili.com/media/web_api/search/result?season_version=-1&area=-1&is_finish=-1&c