我有这段代码
class MyImagesPipeline(ImagesPipeline):
def get_media_requests(self, item, info):
for image_url in item['image_urls']:
yield Request(image_url)
这是从BaseSpider子类化的蜘蛛。这个basespider给了我噩梦
def parse(self, response):
hxs = HtmlXPathSelector(response)
sites = hxs.select('//strong[@class="genmed"]')
items = []
for site in sites[:5]:
item = PanduItem()
item['username'] = site.select('dl/dd/h2/a').select("string()").extract()
item['number_posts'] = site.select('dl/dd/h2/em').select("string()").extract()
item['profile_link'] = site.select('a/@href').extract()
request = Request("http://www.example/profile.php?mode=viewprofile&u=5",
callback = self.parseUserProfile)
request.meta['item'] = item
return request
def parseUserProfile(self, response):
hxs = HtmlXPathSelector(response)
sites = hxs.select('//div[@id="current')
myurl = sites[0].select('img/@src').extract()
item = response.meta['item']
image_absolute_url = urljoin(response.url, myurl[0].strip())
item['image_urls'] = [image_absolute_url]
return item
这是我得到的错误。我无法找到。看起来像它的项目,但我不确定
ERROR
File "/app_crawler/crawler/pipelines.py", line 9, in get_media_requests
for image_url in item['image_urls']:
exceptions.TypeError: 'NoneType' object has no attribute '__getitem__'
答案 0 :(得分:2)
您缺少pipelines.py中的方法 该文件包含3种方法:
item_completed方法是处理将图像保存到指定路径的方法。此路径在settings.py中设置如下:
ITEM_PIPELINES = ['scrapy.contrib.pipeline.images.ImagesPipeline']
IMAGES_STORE = '/your/path/here'
如上所示,settings.py中还包含启用imagepipeline的行。
我试图以最好的方式解释它,尽可能地理解它。如需进一步参考,请查看官方scrapy documentation。
答案 1 :(得分:0)
嗯。在任何时候你都不会将item
附加到items
(尽管文档中的示例代码也没有附加,所以我可能会咆哮错误的树)。
尝试将其添加到parse(self, response)
,然后查看是否可以解决问题:
for site in sites:
item = PanduItem()
item['username'] = site.select('dl/dd/h2/a').select("string()").extract()
item['number_posts'] = site.select('dl/dd/h2/em').select("string()").extract()
item['profile_link'] = site.select('a/@href').extract()
items.append(item)
答案 2 :(得分:0)
并将IMAGES_STORE设置设置为将用于存储下载图像的有效目录。否则,管道将保持禁用状态,即使您将其包含在ITEM_PIPELINES设置中也是如此。
例如:
IMAGES_STORE = '/path/to/valid/dir'