Я относительно новичок в Scrapy, Python и объектно-ориентированном программировании, так что извиняюсь, если я получаю какую-либо терминологию некорректно или неясно каким-либо образом.Scrapy: изменение элементов и полей в ответе
Я пытаюсь написать паука, который, поскольку он сбрасывает элементы из ответа, также создаст модифицированную версию ответа для сохранения в файл. Например, я пытаюсь изменить ссылки 'src', чтобы указать на скопированные файлы, сохраненные локально.
В настоящее время я очищаю данные с помощью селекторов Scrapy и изменяя ответ с помощью lxml. Тем не менее, я хочу использовать методы Scrapy для модификации вместо lxml, поскольку использование селекторов Scrapy и lxml означает, по существу, удвоение кода для поиска тех же элементов в ответе.
Я добавил код ниже, чтобы проиллюстрировать мою мысль. Все происходит в функции анализа паука.
Защиту синтаксического анализа (сам, ответ):
# Scrape thumbnail URLs using Scrapy selectors
for post in response.css('.post'): # For each post
for thumb in post.css('.thumb'): # For each thumbnail
item = Item() # Create an image item
item['thumbnail_url'] = []
item['thumbnail_savepath'] = []
for x in thumb.xpath('img/@src').extract():
thumbnail_url = 'https:' + x
thumbnail_filename = re.search('.*/(.*)', thumbnail_url).group(1)
thumbnail_savepath = 'thumbnails/' + thumbnail_filename
item['thumbnail_url'] += [thumbnail_url]
item['thumbnail_savepath'] += [thumbnail_savepath]
# Make modified html using lxml
body_lxml = lxml.html.document_fromstring(response.body)
for thumbnail in body_lxml.xpath('//img'):
thumbnail_src = thumbnail.get('src') # Original link address
thumbnail_path = './thumbnails/' + basename(thumbnail_src) # New link address
thumbnail.set('src',image_path) # Setting new link address
Как показывает код, он перебирает изображения, чтобы очистить элементы с помощью селекторов Scrapy, то итерация второго раза с помощью LXML для изменения ответа. Я должен использовать два разных метода для циклического перехода по тем же элементам, которые я пытаюсь избежать. Я бы хотел сделать скребок и модификацию в том же цикле, если это возможно.
Я думал, что можно использовать метод response.request(), но я стараюсь понять, как использовать это из документации и поиска в Интернете. Есть ли какой-то метод, позволяющий Scrapy модифицировать отдельные элементы или поля в ответе? Любая помощь будет оценена по достоинству.
Спасибо.
Прочтите документацию [scrapy pipelines] (http://doc.scrapy.org/en/latest/topics/item-pipeline.html#item-pipeline) и постарайтесь быть более конкретными с вашим вопросом. См. [Ask] –
Привет, Франк. Спасибо, что обратили внимание на мой вопрос. Я добавил несколько примеров кода и попытался сделать вопрос более конкретным и понятным. Все происходит в основной функции анализа паука (т.е. перед конвейерами). Дайте мне знать, если я еще могу сделать вопрос более понятным для вас/других. Marcus – Marcus
@FrankMartin Я считаю, что это пример вопроса, который следует всем рекомендациям, перечисленным на этой странице.Это ясно, специфично, правильно помечено, хорошо написано с точки зрения грамматики и выбора слов, и от первого пользователя. – Borealid