Python Scrapy NotImplementedError

Python Scrapy NotImplementedError,python,web-scraping,scrapy,Python,Web Scraping,Scrapy,我试图在从各个页面抓取数据之前获取一些链接,但得到了下面的NotImplementedError-回溯: Traceback (most recent call last): File "/usr/lib/python2.7/dist-packages/twisted/internet/defer.py", line 588, in _runCallbacks current.result = callback(current.result, *args, **kw) File

我试图在从各个页面抓取数据之前获取一些链接,但得到了下面的NotImplementedError-回溯:

Traceback (most recent call last):
  File "/usr/lib/python2.7/dist-packages/twisted/internet/defer.py", line 588, in _runCallbacks
    current.result = callback(current.result, *args, **kw)
  File "/usr/lib/python2.7/dist-packages/scrapy/spiders/__init__.py", line 76, in parse
    raise NotImplementedError
NotImplementedError
2017-10-13 06:03:58 [scrapy] INFO: Closing spider (finished)
2017-10-13 06:03:58 [scrapy] INFO: Dumping Scrapy stats:
{'downloader/request_bytes': 273,
 'downloader/request_count': 1,
 'downloader/request_method_count/GET': 1,
 'downloader/response_bytes': 81464,
 'downloader/response_count': 1,
 'downloader/response_status_count/200': 1,
 'finish_reason': 'finished',
 'finish_time': datetime.datetime(2017, 10, 13, 5, 3, 58, 550062),
 'log_count/DEBUG': 2,
 'log_count/ERROR': 1,
 'log_count/INFO': 7,
 'response_received_count': 1,
 'scheduler/dequeued': 1,
 'scheduler/dequeued/memory': 1,
 'scheduler/enqueued': 1,
 'scheduler/enqueued/memory': 1,
 'spider_exceptions/NotImplementedError': 1,
 'start_time': datetime.datetime(2017, 10, 13, 5, 3, 56, 552516)}
2017-10-13 06:03:58 [scrapy] INFO: Spider closed (finished)
我试过:

正在将下载\u处理程序={'s3':无,}添加到settings.py

这似乎没有什么作用,然后我从crapy.Spider切换到scrapy.spiders.crawbspider,它没有抛出错误消息,但是,它也没有打印出我的最终url-如果设置正确,我认为应该这样做是正确的吗?我的代码如下:

# -*- coding: utf-8 -*-
from scrapy import Spider
from scrapy.http import Request
import scrapy


class Test_spider(scrapy.spiders.CrawlSpider):
    name = "Spider_Testing"
    allowed_domains = ["http://www.example.com/"]
    start_urls = (
                       "http://www.example.com/followthrough",
    )

    def parse_links(self, response): 
            links = response.xpath('//form/table/tr/td/table//a[div]/@href').extract() 
            for link in links:
                base_url = "http://www.example.com/followthrough" # the full addresss after/ is slightly different than start urls but that should not matter?
                final_url = response.urljoin(base_url, links)
                print(final_url) #test 1
                print(Request(final_url, callback=self.parse_final)) #test 2
                yield Request(final_url, callback=self.parse_final)

    def parse_final(self, response):
        pass
所以我的问题是:

这是正确的逻辑吗? 最终url的测试打印是否正确我认为1不是2
错误源于缺少解析方法。由于您没有实现start_请求,其默认行为是:

默认实现生成Requesturl,dont\u filter=True 对于start_url中的每个url

它没有设置回调参数,因此它将尝试调用parse作为默认值:

如果请求没有指定回调,则spider的解析方法 将使用。请注意,如果在处理过程中引发异常, 改为调用errback

您可以通过实现并指定回调参数来修复它:

def start_requests:
    yield Request(start_url, callback=parse_links)
更新: response.urljoinurl仅接收一个参数:

通过将响应的url与 可能的相对url

您应该使用response.urljoinlink或urlparse.urljoinbase\u url,link。还要确保这里的链接是相对的URL

更新2: 您可以添加以下代码并运行它:

if __name__ == '__main__':
    from scrapy.crawler import CrawlerProcess
    process = CrawlerProcess({
        'USER_AGENT': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)'
    })

    process.crawl(Test_spider)
    process.start()

它允许您从脚本运行scrapy,这样您就可以使用ipdb或IDE中的调试工具进行调试。

谢谢@CtheSky-这解决了错误消息,但不幸的是,我以0页/分钟的速度抓取了0页,以0项/分钟的速度抓取了0项-我想这就是为什么printRequestfinal\u url,callback=parse_links不起作用?我想链接可能是空的,你能检查xpath表达式吗?当我使用response.xpath'//form/table/tr/td/table//a[div]/@href.在shell中提取它会返回我想要的结果,例如u'lphs.asp?id=279&city=london',当手动附加到我的基本url后,它会转到我想要的页面。我试着在我的蜘蛛中运行它,但它又没有返回任何结果,所以我有点困惑!我认为这可能与urljoin有关,请参阅更新。我想应该在某个地方有一条错误消息。啊,谢谢你!令人沮丧的是,我尝试了两种方法,但两种方法都没有奏效