Python 无法获得最简单的管道示例以在scrapy中工作
这是我的简单代码,我没有得到它的工作 我正在从Python 无法获得最简单的管道示例以在scrapy中工作,python,scrapy,Python,Scrapy,这是我的简单代码,我没有得到它的工作 我正在从initspider 这是我的密码 class MytestSpider(InitSpider): name = 'mytest' allowed_domains = ['example.com'] login_page = 'http://www.example.com' start_urls = ["http://www.example.com/ist.php"] def init_request(sel
initspider
这是我的密码
class MytestSpider(InitSpider):
name = 'mytest'
allowed_domains = ['example.com']
login_page = 'http://www.example.com'
start_urls = ["http://www.example.com/ist.php"]
def init_request(self):
#"""This function is called before crawling starts."""
return Request(url=self.login_page, callback=self.parse)
def parse(self, response):
item = MyItem()
item['username'] = "mytest"
return item
管道
如果尝试打印项目,我会遇到相同的错误
我得到的错误是
File "crawler/pipelines.py", line 35, in process_item
myitem.username = item['username']
exceptions.TypeError: 'NoneType' object has no attribute '__getitem__'
I问题在于InitSpider
。我的Piepline没有获取项目对象
items.py
setting.py
BOT\u NAME='crawler'
SPIDER_模块=['SPIDER']
NEWSPIDER_模块='spider'
下载程序\u中间件={
“scrapy.contrib.downloadermiddleware.cookies.cookies中间件”:700#管道。TestPipeline
缺少订单号。它应该类似于ITEM_pipelines={'s pipelines.TestPipeline':900}
处理项目
函数的另一个问题。根据:
此方法为每个项目管道组件调用,并且必须返回包含数据、项目(或任何子类)对象的dict或引发DropItem异常。已删除的项目不再由其他管道组件处理
在您的情况下,可以在函数末尾添加一个return语句:
def process_item(self, item, spider):
print item['username']
return item
如果不包含return语句,则此管道的返回值为
None
。这就是为什么以下管道会抱怨-item['username']
为None
时,您不能执行item[/username']
,这就是我所做的,并且成功了:
MytestSpider
类中,只需以以下方式编写parse
函数:
def parse(self, response):
yield {'username': "mytest"}
items.py
,我没有创建任何Item类,它仍然有效class TestPipeline(object):
def process_item(self, item, spider):
print item['username']
产生的所有内容似乎都将成为管道中的项目过程中的项目
,但产生的结果必须是一个字典或项目对象……就像上面的第一个答案一样
在settings.py中,我不知道您的整个项目结构,因为这里的路径可能决定您是否将获得输出。
我假设“crawler”是一个文件夹,其中有另一个名为“spiders”的文件夹,您的spider代码在这个“spiders”文件夹中。您的pipelines.py也在“crawler”文件夹下
对我来说,这很有效:
BOT_NAME = 'crawler'
SPIDER_MODULES = ['crawler.spiders']
NEWSPIDER_MODULE = 'crawler.spiders'
ROBOTSTXT_OBEY = True
DOWNLOAD_DELAY = 3
ITEM_PIPELINES = {
'crawler.pipelines.ScrapeNewsPipeline': 400,
}
最后,为了运行代码,我使用了python终端,cd将代码文件夹中有爬虫文件夹的地方,然后执行
scrapy runspider crawler/spiders/my_test_spider.py
虽然我的测试代码与你的测试代码并非100%相同,但希望这能有所帮助你应该发布所有代码以确保完整性(即项目代码和设置文件).目前,您正在创建一个带有代码片段的问题,修改该片段,然后发布另一个问题。例如,我不知道您为什么要使用models.TestUser()在TestPipeline中创建MyItem的实例。@Talvalin,很抱歉,我还将发布其他代码。我的模型是Django模型。但我们可以删除该行以供参考testing@Talvalin,我发现如果我在设置中有上面提到的其他管道,那么我会得到这个错误您会得到与上面不同的错误吗?@Talvalin否错误相同。是第二条管道导致了问题。我从设置中删除了第二条管道,然后一切正常。即使清空没有process item函数的其他管道主体,它也可以正常工作。但我定义了process item函数,然后出现此错误。我暂时删除了其他管道,以便我的代码能正常工作吗
class TestPipeline(object):
def process_item(self, item, spider):
print item['username']
BOT_NAME = 'crawler'
SPIDER_MODULES = ['crawler.spiders']
NEWSPIDER_MODULE = 'crawler.spiders'
ROBOTSTXT_OBEY = True
DOWNLOAD_DELAY = 3
ITEM_PIPELINES = {
'crawler.pipelines.ScrapeNewsPipeline': 400,
}
scrapy runspider crawler/spiders/my_test_spider.py