【问题标题】:Scrapy shell does not return anythingScrapy shell 不返回任何东西
【发布时间】:2018-07-13 06:41:40
【问题描述】:

我想从this website 中提取组织名称和有关他们的基本详细信息。我正在使用scrapy提取信息。我尝试使用scrapy shell提取第一个组织名称腾讯控股并写了scrapy scrapy shell中的命令为 response.css('div.flex-no-grow.cb-overflow-ellipsis.identifier-label::text').extract_first() 这个命令什么也没返回。我是网络报废的新手。谁能帮我写命令或纠正我哪里出错了?

【问题讨论】:

  • 当我试图在 scrapy shell 中删除您的链接时,我收到了响应代码 416 和一个网页,上面写着“当您浏览 www.crunchbase.com 时,您的浏览器的某些内容让我们认为您是机器人。有几个原因可能会发生这种情况......”。基本上,这是一种安全措施,您需要先绕过它,然后才能废弃此网站。因此,只需在开始选择元素之前检查您的响应文本,以确保您解决了正确的问题。
  • 感谢您的回复。当我编写命令时,我在 Scrapy shell 中没有收到任何错误响应,它既不返回错误响应也不返回任何结果。我们如何使用 scrapy 绕过此安全措施?
  • 在scrapy shell 上运行print(response.text) 并确认您是否获得了我发布的实际网页数据或带有上述消息的网页。
  • 是的,我得到了与您在消息中指出的相同的响应,我们如何绕过它?

标签: python html css web-scraping scrapy


【解决方案1】:

我检查了您的网站,一切正常且运行良好,但是 scrapy shell 存在问题。 scrapy shell 将标头作为Scrapy/{version}(+http://scrapy.org) 传递,这个网站会抛出 403 错误,您可以通过打印响应对象来验证。

您需要做的是更改请求的标头,比如说更合适的标头headers = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:48.0) Gecko/20100101 Firefox/48.0'} 并将其与请求一起传递,然后您将获得响应。

要在 shell 中尝试,请执行以下操作:

headers = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:48.0) Gecko/20100101 Firefox/48.0'}
url = 'https://www.crunchbase.com/search/organization.companies'

请求如下:

req = scrapy.Request(url=url, headers=headers)
fetch(req)

现在您将获得 200 作为响应并使用您的 CSS 路径。

【讨论】: