Scrapy Issue - TypeError: Аргумент должен быть байтами или юникодом, получил 'список' - PullRequest
0 голосов
/ 05 января 2019

Это мой первый проект Scrapy Spider. Я новичок в 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: URL-адрес запроса должен быть str или Unicode получил список

Аргумент должен быть в байтах или юникоде, список получен

TypeError: аргумент 1 должен быть объектом строки или Unicode

Аргумент должен быть байтами или юникодом, получил '_Element'

Насколько я понимаю из этих ссылок, мне нужно преобразовать аргумент в моей функции в строку. Вот скриншот трассировки, показывающий ошибку: Ошибка трассировки SCRAPY

Я думаю, что это вторая строка функции parse_doritos, но я не могу понять, как это исправить. Если кто-то может помочь мне разобраться с этим, мне бы очень хотелось: а) заставить эту штуку работать, и б) понять, где я ошибся и почему ваше исправление работает.

Ответы [ 3 ]

0 голосов
/ 06 января 2019

Во-первых, если я забуду о вашем вопросе и мы сосредоточимся на вашей работе, что вы хотите, я думаю, что это может быть очень полезно для загрузки изображений. здесь, скачать изображения в scrapy

Во-вторых, если мы поговорим о вашем вопросе, ваш xpath для извлечения источника img будет в порядке, но если вы заметите, он возвращает /sites/doritos.com/files/styles/product_thumbnail/public/2018-08/new-blaze.png?itok=ZFZWWSIn эту ссылку, после которой вы добавляете только http, тогда как ссылка на оригинальное изображение https://www.doritos.com/sites/doritos.com/files/styles/product_thumbnail/public/2018-08/collisions.png?itok=EZAydWWi

Вы должны использовать urljoin или prepend https://www.doritos.com как image['image_urls'] = ['https://www.doritos.com'+rel[0]]

0 голосов
/ 08 января 2019

Насколько я помню response.xpath - не принимает аргумент списка

def parse_doritos(self, response):
        image = DoritosItem()
        image['title'] = response.xpath(["//img[@id='alt'/text()"]).extract() # extra square brackets in response.xpath arguments - list argument instead of str
        rel = response.xpath('//product_thumbnail/@src').extract() # this function looks OK
        image['image_urls'] = ['http:'+rel[0]]                     
        return image
0 голосов
/ 06 января 2019

Если вы копируете изображения с веб-сайта, я думаю, что вы должны yield каждое изображение (Scrapy сохранит их в выходном файле). Кроме того, примите во внимание, что метод extract() возвращает список, даже если ваш скребок находит один элемент или не находит его вообще. Возможно, вы захотите использовать extract_first(), это даст не список, а значение вместо этого (это единственное место, которое я вижу, где представлен список, возможно, это вызывает проблему).

РЕДАКТИРОВАТЬ: в вашей функции парсера, я думаю, вы должны выдать свой image dict вместо того, чтобы возвращать его.

...