Как избежать нежелательных полей в ответ (скрап) - PullRequest
0 голосов
/ 15 ноября 2018

Привет и заранее спасибо:

Когда я запускаю scrapy, я помещаю предметы в .json, но вместо нужных мне предметов я получаю немного мусора:

задержка загрузки, загрузка связей, глубина и слот для загрузки нежелательны

 1 import scrapy
 2
 3 class LibresSpider(scrapy.Spider):
 4     name = 'libres'
 5     allowed_domains = ['www.todostuslibros.com']
 6     start_urls = ['https://www.todostuslibros.com/mas_vendidos/']
 7
 8     def parse(self, response):
 9         for tfg in response.css('li.row-fluid'):
10             doc={}
11             data = tfg.css('book-basics')
12             doc['titulo'] = tfg.css('h2 a::text').extract_first()
13             doc['url'] = response.urljoin(tfg.css('h2 a::attr(href)').extract_first())
14
15             yield scrapy.Request(doc['url'], callback=self.parse_detail, meta=doc)
16
17         next = response.css('a.next::attr(href)').extract_first()
18         if next is not None:
19            next_page = response.urljoin(next)
20            yield scrapy.Request(next_page, callback=self.parse)
21
22     def parse_detail(self, response):
23
24         detail = response.meta
25         detail['page_count'] = ' '.join(response.css('dd.page.count::text').extract())
26         detail['keywords'] = ' '.join(response.css('div.descripcio a::text').extract())
27
28         yield detail

Я знаю, что эти нежелательные данные пришли с ответом (строка 26), но я хотел бы знать, как избежать тех данных, которые заканчиваются в моем json.

1 Ответ

0 голосов
/ 16 ноября 2018

Пожалуйста, используйте более явный заголовок, чтобы помочь другим людям, которые могут иметь те же проблемы; «мусор» - очень расплывчатое слово.

Более подробную информацию об атрибуте meta вы можете найти в документации Scrapy здесь

Дикт, содержащий произвольные метаданные для этого запроса. Это дикт пуст для новых запросов и обычно заполняется разными Scrapy компоненты (расширения, промежуточное программное обеспечение и т. Д.). Итак, данные содержащиеся в этой инструкции зависят от включенных вами расширений.

Если вы не хотите, чтобы вся эта информация заполнялась Scrapy в вашем json, вы можете сделать следующее:

def parse(self, response):
  for tfg in response.css('li.row-fluid'):
    doc={}
    data = tfg.css('book-basics')
    doc['titulo'] = tfg.css('h2 a::text').extract_first()
    doc['url'] = response.urljoin(tfg.css('h2 a::attr(href)').extract_first())

    request = scrapy.Request(doc['url'], callback=self.parse_detail)
    request.meta['detail'] = doc
    yield request

  next = response.css('a.next::attr(href)').extract_first()
  if next is not None:
    next_page = response.urljoin(next)
    yield scrapy.Request(next_page, callback=self.parse)

def parse_detail(self, response):
  detail = response.meta['detail']
  detail['page_count'] = ' '.join(response.css('dd.page.count::text').extract())
  detail['keywords'] = ' '.join(response.css('div.descripcio a::text').extract())
  yield detail
...