Python scrapy在shell中工作,但爬网0页

Python scrapy在shell中工作,但爬网0页,python,scrapy,Python,Scrapy,我使用scrapy解析以下站点:。当我通过shell一步一步地解析时,一切都很顺利,也就是说,这行代码可以工作: response.xpath("//script[contains(., 'banksData')]/text()").re(r'"name":"(.*?)","code"') 但当我开始爬行时,我会看到下面的日志 2017-06-16 20:59:27 [scrapy.utils.log] INFO: Scrapy 1.4.0 started (bot: banksru) 201

我使用scrapy解析以下站点:。当我通过shell一步一步地解析时,一切都很顺利,也就是说,这行代码可以工作:

response.xpath("//script[contains(., 'banksData')]/text()").re(r'"name":"(.*?)","code"')
但当我开始爬行时,我会看到下面的日志

2017-06-16 20:59:27 [scrapy.utils.log] INFO: Scrapy 1.4.0 started (bot: banksru)
2017-06-16 20:59:27 [scrapy.utils.log] INFO: Overridden settings: {'BOT_NAME': 'banksru', 'FEED_FORMAT': 'json', 'NEWSPIDER_MODULE': 'banksru.spiders', 'SPIDER_MODULES': ['banksru.spiders'], 'FEED_URI': 'banki.json'}
2017-06-16 20:59:27 [scrapy.middleware] INFO: Enabled extensions:
['scrapy.extensions.logstats.LogStats',
 'scrapy.extensions.telnet.TelnetConsole',
 'scrapy.extensions.corestats.CoreStats',
 'scrapy.extensions.feedexport.FeedExporter']
2017-06-16 20:59:28 [scrapy.middleware] INFO: Enabled downloader middlewares:
['scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware',
 'scrapy.downloadermiddlewares.downloadtimeout.DownloadTimeoutMiddleware',
 'scrapy.downloadermiddlewares.defaultheaders.DefaultHeadersMiddleware',
 'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware',
 'scrapy.downloadermiddlewares.retry.RetryMiddleware',
 'scrapy.downloadermiddlewares.redirect.MetaRefreshMiddleware',
 'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware',
 'scrapy.downloadermiddlewares.redirect.RedirectMiddleware',
 'scrapy.downloadermiddlewares.cookies.CookiesMiddleware',
 'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware',
 'scrapy.downloadermiddlewares.stats.DownloaderStats']
2017-06-16 20:59:28 [scrapy.middleware] INFO: Enabled spider middlewares:
['scrapy.spidermiddlewares.httperror.HttpErrorMiddleware',
 'scrapy.spidermiddlewares.offsite.OffsiteMiddleware',
 'scrapy.spidermiddlewares.referer.RefererMiddleware',
 'scrapy.spidermiddlewares.urllength.UrlLengthMiddleware',
 'scrapy.spidermiddlewares.depth.DepthMiddleware']
2017-06-16 20:59:28 [scrapy.middleware] INFO: Enabled item pipelines:
[]
2017-06-16 20:59:28 [scrapy.core.engine] INFO: Spider opened
2017-06-16 20:59:28 [scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)
2017-06-16 20:59:28 [scrapy.extensions.telnet] DEBUG: Telnet console listening on 127.0.0.1:6023
2017-06-16 20:59:28 [scrapy.core.engine] DEBUG: Crawled (429) <GET http://www.banki.ru/services/responses/> (referer: None)
2017-06-16 20:59:28 [scrapy.spidermiddlewares.httperror] INFO: Ignoring response <429 http://www.banki.ru/services/responses/>: HTTP status code is not handled or not allowed
2017-06-16 20:59:28 [scrapy.core.engine] INFO: Closing spider (finished)
2017-06-16 20:59:28 [scrapy.statscollectors] INFO: Dumping Scrapy stats:
{'downloader/request_bytes': 229,
 'downloader/request_count': 1,
 'downloader/request_method_count/GET': 1,
 'downloader/response_bytes': 119,
 'downloader/response_count': 1,
 'downloader/response_status_count/429': 1,
 'finish_reason': 'finished',
 'finish_time': datetime.datetime(2017, 6, 16, 17, 59, 28, 827696),
 'httperror/response_ignored_count': 1,
 'httperror/response_ignored_status_count/429': 1,
 'log_count/DEBUG': 2,
 'log_count/INFO': 8,
 'response_received_count': 1,
 'scheduler/dequeued': 1,
 'scheduler/dequeued/memory': 1,
 'scheduler/enqueued': 1,
 'scheduler/enqueued/memory': 1,
 'start_time': datetime.datetime(2017, 6, 16, 17, 59, 28, 573054)}
2017-06-16 20:59:28 [scrapy.core.engine] INFO: Spider closed (finished)
我尝试实现的代码很简单:

import scrapy

class BankRating(scrapy.Spider):
    name = "banki"
    start_urls = [
        "http://www.banki.ru/services/responses/",
    ]


    def parse(self, response):
        name = response.xpath("//script[contains(., 'banksData')]/text()").re(r'"name":"(.*?)","code"')
        rating = response.xpath("//script[contains(., 'ratingData')]/text()").re(r'"rating":(.*?),"responseCount"')
        avg_grade = response.xpath("//script[contains(., 'ratingData')]/text()").re(r'"middleGrade":(.*?),"middleRating"')
        checked_responses = response.xpath(
            "//script[contains(., 'ratingData')]/text()").re(r'"checkedResponseCount":(.*?),"checkedResponseCountForYear"')
        num_responses = response.xpath("//script[contains(., 'ratingData')]/text()").re(r'"responseCount":(.*?),"responseCountForYear"')
        solved_problems = response.xpath(
            "//script[contains(., 'ratingData')]/text()").re(r'"solvedResponseCount":(.*?),"withAgentAnswer"')
        bank_answers = response.xpath("//script[contains(., 'ratingData')]/text()").re(r'"withAgentAnswer":(.*?),"middleGrade"')
        yield name, rating, avg_grade, checked_responses,  num_responses, solved_problems, bank_answers

我的机器有win8.1,scrapy是为python 3.5安装的。提前感谢您的帮助

当请求出现问题时,站点会尝试保护自己,以响应不同的状态

这种特殊情况很常见,但很简单。您可以使用通用的
用户\u代理绕过它:

设置.py

USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:50.0) Gecko/20100101 Firefox/50.0'
因为默认情况下,
scrapy
使用如下内容:

"Scrapy/1.3.0 (+http://scrapy.org)"

当请求出现问题时,站点会尝试保护自己,以响应不同的状态

这种特殊情况很常见,但很简单。您可以使用通用的
用户\u代理绕过它:

设置.py

USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:50.0) Gecko/20100101 Firefox/50.0'
因为默认情况下,
scrapy
使用如下内容:

"Scrapy/1.3.0 (+http://scrapy.org)"

Scrapy作为一个bot,在服务器上非常资源密集型,因为它非常快速,并且进行异步调用,因此需要遵循一些明确的指导原则。这些都是为了使爬行工作在一个更宽容和友好的方式,而不会造成任何损害的网络。 小瓦尔迪尔·斯图姆(Valdir Stumm Jr.)在博客中漂亮地突出了这些

  • 网站所有者使用该文件向网络机器人提供有关其网站的说明;这被称为机器人排除协议。此文件通常在网站的根目录下可用,您的爬虫程序应遵循由此定义的规则

  • 网站可以处理的请求数量差别很大。根据当前web服务器负载自动调整请求之间的延迟。它首先计算一个请求的延迟。然后,它将调整同一域的请求之间的延迟,以使同时激活的AUTOTHROTTLE_TARGET_并发请求不超过个


在中启用这些应该允许scrapy在网站中爬行。感谢您指出“HTTP代码429:这意味着在给定的时间段内发送太多请求”

因为bot在服务器上非常资源密集型,因为它非常快速并进行异步调用,因此需要遵循一些明确的指导原则。这些都是为了使爬行工作在一个更宽容和友好的方式,而不会造成任何损害的网络。 小瓦尔迪尔·斯图姆(Valdir Stumm Jr.)在博客中漂亮地突出了这些

  • 网站所有者使用该文件向网络机器人提供有关其网站的说明;这被称为机器人排除协议。此文件通常在网站的根目录下可用,您的爬虫程序应遵循由此定义的规则

  • 网站可以处理的请求数量差别很大。根据当前web服务器负载自动调整请求之间的延迟。它首先计算一个请求的延迟。然后,它将调整同一域的请求之间的延迟,以使同时激活的AUTOTHROTTLE_TARGET_并发请求不超过个


在中启用这些应该允许scrapy在网站中爬行。感谢您指出“HTTP代码429:这意味着在给定的时间段内发送过多的请求”

您似乎收到了HTTP代码429,这意味着在给定的时间段内发送过多的请求。请尝试在设置中启用AUTOTHROTTLE_=True。py@KaushikNP谢谢。删除了#对于用户代理,ROBOTSTXT_服从,启用了自动锁定功能,运行正常。确定。很高兴为您提供帮助。将哈希标记删除到“取消注释”代码行以使其正常工作非常重要。看起来您得到的是HTTP代码429,这意味着在给定的时间段内发送了太多请求。请在“设置”中尝试启用AUTOTHROTTLE_=True。py@KaushikNP谢谢。删除了#对于用户代理,ROBOTSTXT_服从,启用了自动锁定功能,运行正常。确定。很高兴能提供帮助。删除hashtag以取消注释代码行以使其正常工作是一种重要的lol