这是我的第一个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)了解我出了什么问题以及为什么您的修复程序可以工作。
答案 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