Scrapy 中的空 .json 文件

Empty .json File in Scrapy

我写了这个非常短的蜘蛛去U.S。新闻 link 并获取此处列出的大学名称。

#!/usr/bin/python
# -*- coding: utf-8 -*-

import scrapy

class CollegesSpider(scrapy.Spider):
    name = "colleges"
    start_urls = [
        'http://colleges.usnews.rankingsandreviews.com/best-colleges/rankings/national-universities?_mode=list&acceptance-rate-max=20'
    ]

    def parse(self, response):
        for school in response.css('div.items'):
            yield {
                'name': school.xpath('//*[@id="view-1c4ddd8a-8b04-4c93-8b68-9b7b4e5d8969"]/div/div[1]/div[1]/h3/a').extract_first(),
            }

然而,当我 运行 这个蜘蛛程序并要求将名称存储在一个名为 schools.json 的文件中时,该文件是空白的。我做错了什么?

我在手机上,所以不记得确切的变量名称,但应该是 robots_follow

设置为假

您指的起始页面 url 不包含任何 ID 为 view-1c4ddd8a-8b04-4c93-8b68-9b7b4e5d8969 的元素- 它看起来很独特,似乎不是漂亮的选择通用 XPath 表达式。我建议使用 school.xpath('.//div[@data-view="colleges-search-results-card"]//h3/a/text()').extract()

之类的东西

知道了!是因为机器人检测。

编码

>>> r = requests.get('http://colleges.usnews.rankingsandreviews.com/best-colleges/rankings/national-universities?_mode=list&acceptance-rate-max=20', headers={'User-Agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'})
>>> r.status_code
200

那么您将拥有您需要的所有内容。做任何你需要的解析或提取。在Scrapy中编码header的过程应该非常相似。

scrapy doc for request with headers

Chrome

的用户代理
Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36