Scrapy问题-TypeError:参数必须为字节或unicode,得到“列表”

时间:2019-01-05 20:59:36

标签: python unicode scrapy typeerror scrapy-spider

这是我的第一个Scrapy蜘蛛项目。我刚接触Python,请原谅我的无知。基本上,我想从www.doritos.com/products/页面上抓取图像。我将使用这些图像进行对象检测项目,因此我将构建训练数据集。到目前为止,这是代码:

import scrapy 
from scrapy.contrib.spiders import Rule, CrawlSpider   
from scrapy.contrib.linkextractors import LinkExtractor
from doritos.items import DoritosItem                   

class DoritosSpider(CrawlSpider):
    name = 'doritos'
    allowed_domains = ['doritos.com']                                      
    start_urls = ['https://www.doritos.com']                               
    rules = [Rule(LinkExtractor(allow=['/products/.*']), 'parse_doritos')] 

    def parse_doritos(self, response):
            image = DoritosItem()
            image['title'] = response.xpath(["//img[@id='alt'/text()"]).extract() 
            rel = response.xpath('//product_thumbnail/@src').extract() 
            image['image_urls'] = ['http:'+rel[0]]                     
            return image

我检查了这些参考文献,以试图拼凑出我的问题的答案。  如果答案在那里,我不会感到惊讶,但是我的代码与我很难解决的地方完全不同:

scrapy: request url must be str or unicode got list

Argument must be in bytes or unicode, got list

TypeError: argument 1 must be a string or unicode object

Argument must be bytes or unicode, got '_Element'

据这些参考资料了解,我需要将函数中的参数转换为字符串。这是显示错误的回溯屏幕截图: SCRAPY Traceback Error

我认为它在parse_doritos函数的第二行,但我不知道解决方法。如果有人可以帮助我完成这项工作,那么我真的很想:a)使这件事起作用,b)了解我出了什么问题以及为什么您的修复程序可以工作。

3 个答案:

答案 0 :(得分:1)

据我记得response.xpath-不接受列表参数

stage

答案 1 :(得分:0)

如果您要从网站上抓取图像,我认为您必须yield每个图像(Scrapy会将它们存储在输出文件中)。另外,请考虑到extract()方法将返回一个列表,即使您的抓取器找到一个元素还是根本找不到一个元素。您可能要使用extract_first(),它不会给出列表,而是给出值(这是我看到的唯一提供列表的地方,可能是引起问题的原因)。

编辑:在解析器函数中,我认为您应该产生image字典而不是返回它。

答案 2 :(得分:0)

首先,如果我忘记了您的问题,而我们专注于您想要的工作,那么我认为这对于下载图像会很有帮助。 here, download images in scrapy

第二,如果我们谈论您的问题,则可以使用xpath提取img源,但是如果您注意到它返回了/sites/doritos.com/files/styles/product_thumbnail/public/2018-08/new-blaze.png?itok=ZFZWWSIn,则此链接随后仅附加http,而原始图片链接为{ {1}}

您应该使用https://www.doritos.com/sites/doritos.com/files/styles/product_thumbnail/public/2018-08/collisions.png?itok=EZAydWWi或在urljoin前面添加 https://www.doritos.com