这是我的简单代码,我无法正常工作。
我是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
class TestPipeline(object):
def process_item(self, item, spider):
print item['username']
如果尝试打印商品,我会发出同样的错误
我得到的错误是
File "crawler/pipelines.py", line 35, in process_item
myitem.username = item['username']
exceptions.TypeError: 'NoneType' object has no attribute '__getitem__'
问题在于InitSpider
。我的pieplines没有获取项目对象
class MyItem(Item):
username = Field()
BOT_NAME = 'crawler'
SPIDER_MODULES = ['spiders']
NEWSPIDER_MODULE = 'spiders'
DOWNLOADER_MIDDLEWARES = {
'scrapy.contrib.downloadermiddleware.cookies.CookiesMiddleware': 700 # <-
}
COOKIES_ENABLED = True
COOKIES_DEBUG = True
ITEM_PIPELINES = [
'pipelines.TestPipeline',
]
IMAGES_STORE = '/var/www/htmlimages'
答案 0 :(得分:3)
pipelines.TestPipeline
缺少订单号。它应该是ITEM_PIPELINES = {'pipelines.TestPipeline': 900}
。
答案 1 :(得分:1)
这就是我所做的并且有效:
在MytestSpider
课程中,只需以这种方式编写parse
函数:
def parse(self, response):
yield {'username': "mytest"}
删除items.py
,我没有创建任何Item类,但仍然有效
在您的管道代码中:
class TestPipeline(object):
def process_item(self, item, spider):
print item['username']
在我的测试代码中,似乎蜘蛛中的所有yield
都将成为Pipeline process_item
中的项目,但yield结果必须是字典或Item对象......像上面的第一个答案。
在settings.py中,我不知道您的整个项目结构,因为此处的路径可能决定您是否获得输出。 我认为&#39; crawler&#39;是一个文件夹,你有另一个名为&#39; spiders&#39;的文件夹,你的蜘蛛代码在这个&#39;蜘蛛&#39;夹。您的pipelines.py位于&#39; crawler&#39;文件夹也是 对我来说,这很有效:
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到你有crawler文件夹的代码文件夹,然后执行
scrapy runspider crawler/spiders/my_test_spider.py
虽然我的测试代码与您的测试代码不是100%相同,但希望这可能会有所帮助