Python 未调用Scrapy parse_项回调

Python 未调用Scrapy parse_项回调,python,scrapy,web-crawler,Python,Scrapy,Web Crawler,我在让我的Scrapy spider运行其回调方法时遇到问题 我不认为这是一个缩进错误,这似乎是其他以前的文章的情况,但也许是这样,我不知道?有什么想法吗 from scrapy.contrib.spiders import CrawlSpider, Rule from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor from scrapy.selector import HtmlXPathSelector from scr

我在让我的Scrapy spider运行其回调方法时遇到问题

我不认为这是一个缩进错误,这似乎是其他以前的文章的情况,但也许是这样,我不知道?有什么想法吗

from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.selector import HtmlXPathSelector
from scrapy import log
import tldextract

class CrawlerSpider(CrawlSpider):
  name = "crawler"

  def __init__(self, initial_url):
    log.msg('initing...', level=log.WARNING)
    CrawlSpider.__init__(self)

    if not initial_url.startswith('http'):
      initial_url = 'http://' + initial_url

    ext = tldextract.extract(initial_url)
    initial_domain = ext.domain + '.' + ext.tld
    initial_subdomain = ext.subdomain + '.' + ext.domain + '.' + ext.tld
    self.allowed_domains = [initial_domain, 'www.' + initial_domain, initial_subdomain]
    self.start_urls = [initial_url]
    self.rules = [
        Rule(SgmlLinkExtractor(), callback='parse_item'),
        Rule(SgmlLinkExtractor(allow_domains=self.allowed_domains), follow=True),
    ]
    self._compile_rules()

  def parse_item(self, response):
    log.msg('parse_item...', level=log.WARNING)
    hxs = HtmlXPathSelector(response)
    links = hxs.select("//a/@href").extract()
    for link in links:
      log.msg('link', level=log.WARNING)
样本输出如下;它应该显示一条带有“parse_item…”的警告消息,但它没有显示

$ scrapy crawl crawler -a initial_url=http://www.szuhanchang.com/test.html
2013-02-19 18:03:24+0000 [scrapy] INFO: Scrapy 0.16.4 started (bot: crawler)
2013-02-19 18:03:24+0000 [scrapy] DEBUG: Enabled extensions: LogStats, TelnetConsole, CloseSpider, WebService, CoreStats, SpiderState
2013-02-19 18:03:24+0000 [scrapy] DEBUG: Enabled downloader middlewares: HttpAuthMiddleware, DownloadTimeoutMiddleware, UserAgentMiddleware, RetryMiddleware, DefaultHeadersMiddleware, RedirectMiddleware, CookiesMiddleware, HttpCompressionMiddleware, ChunkedTransferMiddleware, DownloaderStats
2013-02-19 18:03:24+0000 [scrapy] DEBUG: Enabled spider middlewares: HttpErrorMiddleware, OffsiteMiddleware, RefererMiddleware, UrlLengthMiddleware, DepthMiddleware
2013-02-19 18:03:24+0000 [scrapy] DEBUG: Enabled item pipelines: 
2013-02-19 18:03:24+0000 [scrapy] WARNING: initing...
2013-02-19 18:03:24+0000 [crawler] INFO: Spider opened
2013-02-19 18:03:24+0000 [crawler] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)
2013-02-19 18:03:24+0000 [scrapy] DEBUG: Telnet console listening on 0.0.0.0:6023
2013-02-19 18:03:24+0000 [scrapy] DEBUG: Web service listening on 0.0.0.0:6080
2013-02-19 18:03:25+0000 [crawler] DEBUG: Crawled (200) <GET http://www.szuhanchang.com/test.html> (referer: None)
2013-02-19 18:03:25+0000 [crawler] DEBUG: Filtered offsite request to 'www.20130219-0606.com': <GET http://www.20130219-0606.com/>
2013-02-19 18:03:25+0000 [crawler] INFO: Closing spider (finished)
2013-02-19 18:03:25+0000 [crawler] INFO: Dumping Scrapy stats:
        {'downloader/request_bytes': 234,
         'downloader/request_count': 1,
         'downloader/request_method_count/GET': 1,
         'downloader/response_bytes': 363,
         'downloader/response_count': 1,
         'downloader/response_status_count/200': 1,
         'finish_reason': 'finished',
         'finish_time': datetime.datetime(2013, 2, 19, 18, 3, 25, 84855),
         'log_count/DEBUG': 8,
         'log_count/INFO': 4,
         'log_count/WARNING': 1,
         'request_depth_max': 1,
         'response_received_count': 1,
         'scheduler/dequeued': 1,
         'scheduler/dequeued/memory': 1,
         'scheduler/enqueued': 1,
         'scheduler/enqueued/memory': 1,
         'start_time': datetime.datetime(2013, 2, 19, 18, 3, 24, 805064)}
2013-02-19 18:03:25+0000 [crawler] INFO: Spider closed (finished)
$scrapy crawl crawler-初始url=http://www.szuhanchang.com/test.html
2013-02-19 18:03:24+0000[scrapy]信息:scrapy 0.16.4已启动(机器人:爬虫)
2013-02-19 18:03:24+0000[scrapy]调试:启用的扩展:LogStats、TelnetConsole、CloseSpider、WebService、CoreStats、SpiderState
2013-02-19 18:03:24+0000[scrapy]调试:启用的下载中间件:HttpAuthMiddleware、DownloadTimeoutMiddleware、UserAgentMiddleware、RetryMiddleware、DefaultHeadersMiddleware、RedirectMiddleware、Cookies中间件、HttpCompressionMiddleware、ChunkedTransferMiddleware、DownloadersStats
2013-02-19 18:03:24+0000[scrapy]调试:启用的spider中间件:HttpErrorMiddleware、OffsiteMiddleware、referermidleware、urlengthmiddleware、DepthMiddleware
2013-02-19 18:03:24+0000[scrapy]调试:启用的项目管道:
2013-02-19 18:03:24+0000[刮屑]警告:初始化。。。
2013-02-19 18:03:24+0000[爬虫]信息:蜘蛛已打开
2013-02-19 18:03:24+0000[爬网器]信息:爬网0页(以0页/分钟的速度),刮取0项(以0项/分钟的速度)
2013-02-19 18:03:24+0000[scrapy]调试:Telnet控制台在0.0.0.0上侦听:6023
2013-02-19 18:03:24+0000[scrapy]调试:在0.0.0.0:6080上侦听Web服务
2013-02-19 18:03:25+0000[爬网程序]调试:已爬网(200)(参考:无)
2013-02-19 18:03:25+0000[爬虫]调试:过滤到“www.20130219-0606.com”的场外请求:
2013-02-19 18:03:25+0000[爬虫]信息:关闭蜘蛛(完成)
2013-02-19 18:03:25+0000[爬虫]信息:正在倾倒刮擦统计数据:
{'downloader/request_bytes':234,
“下载程序/请求计数”:1,
“downloader/request\u method\u count/GET”:1,
“下载程序/响应字节”:363,
“下载程序/响应计数”:1,
“下载程序/响应状态\计数/200”:1,
“完成原因”:“完成”,
“完成时间”:datetime.datetime(2013,2,19,18,3,2584855),
“日志计数/调试”:8,
“日志计数/信息”:4,
“日志计数/警告”:1,
“请求深度最大值”:1,
“响应\u已接收\u计数”:1,
“调度程序/出列”:1,
“调度程序/出列/内存”:1,
“调度程序/排队”:1,
“调度程序/排队/内存”:1,
“开始时间”:datetime.datetime(2013,2,19,18,3,24,805064)}
2013-02-19 18:03:25+0000[爬行器]信息:爬行器关闭(完成)

提前谢谢

将回调名称更改为
parse_start_url
似乎有效,但由于提供的测试url非常小,我无法确定这是否仍然有效。试试看,让我知道。:)

start\u URL
只有一个锚链接,即:

<a href="http://www.20130219-0606.com">Test</a>
此请求由
OffsiteMiddleware
过滤:

2013-02-19 18:03:25+0000 [crawler] DEBUG: Filtered offsite request to 'www.20130219-0606.com': <GET http://www.20130219-0606.com/>
2013-02-19 18:03:25+0000[crawler]调试:过滤到“www.20130219-0606.com”的场外请求:

因此,不会为此url调用
parse\u项。

您如何运行此爬行器?通过sidekiq(排队)工作人员,使用
scrapy crawl crawler
?从命令行,但我也在命令行上尝试过,但没有成功。为了更加清晰,我已将问题改为包含命令行输出。请提供一个简短、自包含的示例()。如果我将此代码粘贴到一个新的spider中,它将无法工作,而且我必须安装tldextract模块,这使得测试有点棘手。不过,我有两条规则,一条规则包含允许的域,不应遵循异地URL,另一个说对找到的每个URL运行回调。第二个规则永远不会被处理,因为一个链接只会被它满足的第一个规则处理一次,而第一个规则被所有链接满足(默认情况下锚标记中的href)。另一件事是链接提取器将根据其参数拉出链接,在您的例子中,
allow\u domains
参数(如果说这个规则是第一个),但是这个链接列表不会覆盖
OffsiteMiddleware
,在这种情况下,它会被过滤掉。不幸的是,这不起作用;如果是这样的话,那就太奇怪了,因为“parse_item”在任何爬虫父类中都不是一个实现的方法,而且很多在线示例都使用了这个确切的回调方法名称。它在我的类中起作用,但是后来我不得不硬编码
initial\u domain
initial\u subdomain
来删除
tldextract
引用,因此它与上面的代码不同。如果您可以在不使用该模块的情况下发布一个不起作用的示例,那就更好了。
2013-02-19 18:03:25+0000 [crawler] DEBUG: Filtered offsite request to 'www.20130219-0606.com': <GET http://www.20130219-0606.com/>