scrapy - многократный анализ - PullRequest
2 голосов
/ 02 февраля 2020

Я пытаюсь разобрать домен, содержимое которого выглядит следующим образом
Страница 1 - содержит ссылки на 10 статей
Страница 2 - содержит ссылки на 10 статей
Страница 3 - содержит ссылки на 10 статей
и так далее ...

Моя работа заключается в том, чтобы разобрать все статьи на всех страницах.
Моя мысль - Разобрать все страницы и сохранить ссылки на все статьи в списке, а затем повторить список и разобрать ссылки.

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

Мой код до сих пор ...

import scrapy

class DhoniSpider(scrapy.Spider):
    name = "test"
    start_urls = [
            "https://www.news18.com/cricketnext/newstopics/ms-dhoni.html"
    ]
    count = 0
    def __init__(self, *a, **kw):
        super(DhoniSpider, self).__init__(*a, **kw)
        self.headers= {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:48.0) Gecko/20100101 Firefox/48.0'}
        self.seed_urls = []

    def start_requests(self):
        for url in self.start_urls:
            yield scrapy.Request(url, headers=self.headers, callback=self.parse)

    def parse(self, response):
        DhoniSpider.count += 1
        if DhoniSpider.count > 2 :
            # there are many pages, this is just to stop parsing after 2 pages
            return
        for ul in response.css('div.t_newswrap'):
            ref_links = ul.css('div.t_videos_box a.t_videosimg::attr(href)').getall()
            self.seed_urls.extend(ref_links)

        next_page = response.css('ul.pagination li a.nxt::attr(href)').get()
        if next_page is not None:
            next_page = response.urljoin(next_page)
            yield scrapy.Request(next_page, headers=self.headers, callback=self.parse)

    def iterate_urls(self):
        for link in self.seed_urls:
            link = response.urljoin(link)
            yield scrapy.Request(link, headers=self.headers, callback=self.parse_page)

    def parse_page(self, response):
        print("called")

как перебрать мой список self.seed_urls и проанализировать их? Откуда мне вызывать мою iterate_urls функцию?

Ответы [ 2 ]

1 голос
/ 02 февраля 2020

Обычно в этом случае нет необходимости настраивать внешние функции, такие как iterate_urls:

def parse(self, response):
    DhoniSpider.count += 1
    if DhoniSpider.count > 2 :
        # there are many pages, this is just to stop parsing after 2 pages
        return
    for ul in response.css('div.t_newswrap'):
        for ref_link in ul.css('div.t_videos_box a.t_videosimg::attr(href)').getall():
            yield scrapy.Request(response.urljoin(ref_link), headers=self.headers, callback=self.parse_page, priority = 5)

    next_page = response.css('ul.pagination li a.nxt::attr(href)').get()
    if next_page is not None:
        next_page = response.urljoin(next_page)
        yield scrapy.Request(next_page, headers=self.headers, callback=self.parse)

def parse_page(self, response):
    print("called")
0 голосов
/ 02 февраля 2020

Вам не нужно собирать ссылки на массив, вы можете просто yield a scrapy.Request сразу после их анализа. Поэтому вместо self.seed_urls.extend(ref_links) вы можете изменить следующую функцию:

    def iterate_urls(self, seed_urls):
        for link in seed_urls:
            link = response.urljoin(link)
            yield scrapy.Request(link, headers=self.headers, callback=self.parse_page)

и вызвать ее:

...
        for ul in response.css('div.t_newswrap'):
            ref_links = ul.css('div.t_videos_box a.t_videosimg::attr(href)').getall()
            yield iterate_urls(ref_links)
...
...