LinkExtractor с использованием scrapy в Python - PullRequest
0 голосов
/ 26 ноября 2018

Я пытаюсь прочитать индексную страницу, чтобы вычеркнуть категории цитат с сайта цитат, чтобы изучить скрап.Я новичок в этом!

Я могу читать отдельные страницы (категории) с моим кодом, однако я хотел бы прочитать страницу индекса, чтобы прочитать страницы цитаты.

Часть def parse_item работает с отдельными страницами.Однако я не могу получить часть LinkExtractor для экстраполяции ссылок.

import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import Rule

class QuotesSpider(scrapy.Spider):
    name = "quotes"
    allowed_domains = ['website.com']
    start_urls = [
        'https://www.website.com/topics'
    ]

    rules = (
        Rule(LinkExtractor(allow=('^\/topics.*', )), callback='parse_item')  
    )


    def parse_item(self, response):
        for quote in response.css('#quotesList .grid-item'):                                       
           yield {
              'text': quote.css('a.oncl_q::text').extract_first(),
              'author': quote.css('a.oncl_a::text').extract_first(),
              'tags': quote.css('.kw-box a.oncl_list_kc::text').extract(),
              'category' : response.css('title::text').re(r'(\w+).*')  
            }

        next_page = response.css('div.bq_s.hideInfScroll > nav > ul > li:nth-last-child(1) a::attr(href)').extract_first()
        if next_page is not None:
          next_page = response.urljoin(next_page)
          yield scrapy.Request(next_page, callback=self.parse)

Ответы [ 2 ]

0 голосов
/ 03 декабря 2018

Я понял эту проблему.Хотя, возможно, был способ решить эту проблему с помощью Rule(LinkExtractor, я вместо этого использовал каскад запросов response.css для перехода по ссылкам на странице тем.

Это окончательная рабочая версия ...

import scrapy

class QuotesBrainy(scrapy.Spider):
    name = 'Quotes'

start_urls = ['https://www.website.com/topics/']

def parse(self, response):
    # follow links to topic pages
    for href in response.css('a.topicIndexChicklet::attr(href)'):
        yield response.follow(href, self.parse_item)


def parse_item(self, response):
    # iterate through all quotes
    for quote in response.css('#quotesList .grid-item'):                                       
       yield {
          'text': quote.css('a.oncl_q::text').extract_first(),
          'author': quote.css('a.oncl_a::text').extract_first(),
          'tags': quote.css('.kw-box a.oncl_list_kc::text').extract(),
          'category' : response.css('title::text').re(r'(\w+).*')  
        }

    # go through the pagination links to access infinite scroll           
    next_page = response.css('div.bq_s.hideInfScroll > nav > ul > li:nth-last-child(1) a::attr(href)').extract_first()
    if next_page is not None:
      next_page = response.urljoin(next_page)
      yield scrapy.Request(next_page, callback=self.parse_item)
0 голосов
/ 29 ноября 2018

Здесь ваша ошибка:

yield scrapy.Request(next_page, callback=self.parse)

где ваш метод разбора?

Изменить как это ---->

 yield scrapy.follow(url=next_page, callback=self.parse_item)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...