Я делаю паука с помощью Scrapy (1.1.2) для утилизации продуктов. Мне удалось заставить его работать и очистить достаточно данных, но теперь я хочу, чтобы каждый элемент делал новый запрос к product page
и лому, например описание продукта.Scrapy: TypeError: объект «Запрос» не итерируется
Во-первых, вот мой последний рабочий код
spider.py (кроме)
class ProductScrapSpider(Spider):
name = "dmoz"
allowed_domains = ["example.com"]
start_urls = [
"http://www.example.com/index.php?id_category=24"
# ...
]
def parse(self, response):
for sel in response.xpath("a long string"):
mainloader = ProductLoader(selector=sel)
mainloader.add_value('category', 'Category Name')
mainloader.add_value('meta', self.get_meta(sel))
# more data
yield mainloader.load_item()
# Follows the pagination
next_page = response.css("li#pagination_next a::attr('href')")
if next_page:
url = response.urljoin(next_page[0].extract())
yield scrapy.Request(url, self.parse)
def get_meta(self, response):
metaloader = ProductMetaLoader(selector=response)
metaloader.add_value('store', "Store name")
# more data
yield metaloader.load_item()
Выход
[
{
"category": "Category Name",
"price": 220000,
"meta": {
"baseURL": "",
"name": "",
"store": "Store Name"
},
"reference": "100XXX100"
},
...
]
После прочтения документации и ответы на некоторые вопросы здесь, я 'изменил метод get_meta
и добавил обратный вызов для запроса get_product_page
:
new_spider.py (кроме)
def get_meta(self, response):
metaloader = ProductMetaLoader(selector=response)
metaloader.add_value('store', "Store name")
# more data
items = metaloader.load_item()
new_request = scrapy.Request(items['url'], callback=self.get_product_page)
# Passing the metadata
new_request.meta['item'] = items
# The source of the problem
yield new_request
def get_product_page(self, response):
sel = response.selector.css('.product_description')
items = response.meta['item']
new_meta = items
new_meta.update({'product_page': sel[0].extract()})
return new_meta
Ожидаемый выход
[
{
"category": "Category Name",
"price": 220000,
"meta": {
"baseURL": "",
"name": "",
"store": "Store Name",
"product_page": "<div> [...] </div>"
},
"reference": "100XXX100"
},
...
]
Ошибка
TypeError: 'Request' object is not iterable
Я ничего не мог найти об этой ошибке, поэтому, пожалуйста, помогите мне исправить это.
Большое спасибо.
Где 'get_meta' вызывается? Вы пытались вернуть новый объект запроса внутри конвейера элементов? – starrify
Извините, я добавил отсутствующий вызов 'get_meta' внутри поля товара' meta'. – Be0wulf