Несколько URL для одного паука - PullRequest
0 голосов
/ 20 марта 2019

Я хотел знать, есть ли лучший способ поиска по нескольким URL-адресам внутри одной веб-страницы с одним и тем же пауком. У меня есть несколько URL-адресов, к которым я хочу получить доступ с индексом.

Код будет:

class MySpider(scrapy.Spider):
limit = 5
pages = list(range(1, limit))
shuffle(pages)
cat_a = 'http://example.com/a?page={}'
cat_b = 'http://example.com/b?page={}'

    def parse(self, response):
        for i in self.pages:
          page_cat_a = self.cat_a.format(i)
          page_cat_b = self.cat_b.format(i)
          yield response.follow(page_cat_a, self.parse_page)
          yield response.follow(page_cat_b, self.parse_page)

Функция parse_page продолжает сканировать другие данные на этих страницах.

В моем выходном файле я вижу, что данные собираются в повторяющихся последовательностях, поэтому у меня есть 10 веб-страниц из категории a и затем 10 веб-страниц из категории b с повторением. Интересно, заметил ли бы этот веб-сервер, который я сканирую, такое последовательное поведение и мог бы забанить меня?

Кроме того, у меня есть 8 URL на одной и той же веб-странице, которую я хочу сканировать, все с использованием индексов, поэтому вместо 2 категорий, которые я дал в примере, было бы 8. Спасибо.

1 Ответ

3 голосов
/ 20 марта 2019

Вы можете использовать метод паука start_requests вместо того, чтобы делать это внутри метода parse.

import scrapy
from random import shuffle

class MySpider(scrapy.Spider):
    categories = ('a', 'b')
    limit = 5
    pages = list(range(1, limit))
    base_url = 'http://example.com/{category}?page={page}'

    def start_requests(self):
        # Shuffle pages to try to avoid bans
        shuffle(pages)

        for category in categories:
            for page in pages:
                url = self.base_url.format(category=category, page=page)
                yield scrapy.Request(url)

    def parse(self, response):
        # Parse the page
        pass

Еще одна вещь, которую вы можете попытаться сделать - это поиск URL-адресов категорий на сайте. Допустим, вы хотите получить информацию из тегов, показанных на боковой панели http://quotes.toscrape.com/. Вы можете вручную скопировать ссылки и использовать их, как вы делаете, или вы могли бы сделать это:

import scrapy

class MySpider(scrapy.Spider):
    start_urls = ['http://quotes.toscrape.com/']

    def parse(self, response):
        for tag in response.css('div.col-md-4.tags-box a.tag::attr(href)').getall():
            yield response.follow(tag, callback=self.parse_tag)

    def parse_tag(self, response):
        # Print the url we are parsing
        print(response.url)

Интересно, заметил бы этот последовательный веб-сервер, который я сканирую? поведение и может забанить меня.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...