Как мне вернуться в скрапе? - PullRequest
0 голосов
/ 22 мая 2018

Вот мой код

import scrapy
class PvSpider(scrapy.Spider):
   name = 'pv'
   allowed_domains = ['www.piaov.com']
   start_urls = ['http://www.piaov.com/']

   def start_requests(self):
       yield scrapy.Request(url='http://www.piaov.com/list/7.html')

   def parse(self, response):
       names = response.xpath("//ul[@class='mlist']//li/a/@title").extract()
       on = response.meta.get("names", [])
       cmp_names = on + names
       for p in range(2, 7):
           yield scrapy.Request(url='http://www.piaov.com/list/7_{}.html'.format(p),
                                meta={"names": cmp_names},
                                callback=self.parse)

       yield scrapy.Request("http://www.piaov.com", meta={"names": cmp_names}, callback=self.parse_item)

   def parse_item(self, response):
       pass

Когда я отлаживаю свой код в функции 'parse_item', 'response.meta ["names"]' включает только данные первой страницы (в данном случае 12 заголовков)Как я могу получить список 6 страниц данных.

1 Ответ

0 голосов
/ 23 мая 2018

Это потому, что у вас есть URL http://www.piaov.com, и scrapy игнорирует дубликаты URL, если dont_filter=True не указано в Request как Request(url_here, dont_filter=True)

Также мне не нравится ваша логика скребказачем ты вообще звонишь parse_item?это не обязательно.Пожалуйста, посмотрите код ниже и сделайте это так.

import scrapy
class PvSpider(scrapy.Spider):
   name = 'pv'
   allowed_domains = ['www.piaov.com']
   start_urls = ['http://www.piaov.com/']

   def start_requests(self):
       yield scrapy.Request(url='http://www.piaov.com/list/7.html')

   def parse(self, response):
       for name in response.xpath("//ul[@class='mlist']//li/a/@title").extract():

            yield {"name": name}

       for p in range(2, 7):
           yield scrapy.Request(url='http://www.piaov.com/list/7_{}.html'.format(p),
                                callback=self.parse)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...