Почему Scrapy.response.follow () случайно отбирает список ссылок в итерации? Из-за рекурсии? Как решить? - PullRequest
0 голосов
/ 26 марта 2020

Я вычеркнул названия курсов из Datacamp, но он печатал названия случайно. Я создал простого паука, который отбрасывает названия курсов на datacamp.com.

import scrapy
from scrapy.crawler import CrawlerProcess

Это класс, который является настоящим пауком:

class DataOfDatacamp(scrapy.Spider):
    name = "DataOfDatacamp"

    def start_requests(self):
        yield scrapy.Request(url="https://www.datacamp.com/courses/all?embedded=true", callback=self.parse)

    def parse(self, response):
        links = response.css('a.course-block__link::attr(href)').extract()
        print(links)
        for link in links:
            yield response.follow(url=link, callback=self.parse2)

    def parse2(self, response):
        print(response.css("h1.header-hero__title::text").extract_first())

Здесь он запускает паука:

process = CrawlerProcess()
process.crawl(DataOfDatacamp)
process.start()

1 Ответ

0 голосов
/ 26 марта 2020

Попробуйте следующее, чтобы получить их все последовательно. Оказывается, что класс, ответственный за выбор заголовка, отличается в нескольких контейнерах, как в header-hero__title, dc-course__header-title et c. К счастью, есть часть класса, которая является общей для всех из них, title, поэтому я воспользовался этим. Принося изменения, выручает их всех.

import scrapy
from scrapy.crawler import CrawlerProcess

class DataOfDatacamp(scrapy.Spider):
    name = "DataOfDatacamp"

    def start_requests(self):
        yield scrapy.Request(url="https://www.datacamp.com/courses/all?embedded=true", callback=self.parse)

    def parse(self, response):
        for link in response.css('a.course-block__link::attr(href)').getall():
            yield response.follow(url=link, callback=self.parse2)

    def parse2(self, response):
        print(response.css("h1[class*='title']::text").get())

if __name__ == "__main__":
    process = CrawlerProcess({'LOG_LEVEL':'ERROR'})
    process.crawl(DataOfDatacamp)
    process.start()
...