Интересно, есть ли способ получить все URL-адреса всего веб-сайта. Кажется, что Scrapy с CrawSpider и LinkExtractor - хороший выбор. Рассмотрим этот пример:

from scrapy.item import Field, Item
from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors import LinkExtractor


class SampleItem(Item):
    link = Field()


class SampleSpider(CrawlSpider):
    name = "sample_spider"
    allowed_domains = ["domain.com"]
    start_urls = ["http://domain.com"]

    rules = (
        Rule(LinkExtractor(), callback='parse_page', follow=True),
    )

    def parse_page(self, response):
        item = SampleItem()
        item['link'] = response.url
        return item

Этот паук не дает мне того, что я хочу. Он дает мне только все ссылки на одной веб-странице, а именно start_url. Но мне нужна каждая ссылка на этом веб-сайте, в том числе те, которых нет в начальном URL. Правильно ли я понял пример? Есть ли решение моей проблемы? Большое спасибо!

2
Joseph Zhou 28 Окт 2015 в 07:43

2 ответа

Лучший ответ

Вы можете создать паука, который собирает все ссылки на странице, а затем для каждой из этих ссылок проверьте домен: если он совпадает, проанализируйте эти ссылки, промойте, повторите.

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

class SampleSpider(scrapy.Spider):
name = "sample_spider"
allowed_domains = ["domain.com"]
start_urls = ["http://domain.com"]


def parse(self, response):
    hxs = HtmlXPathSelector(response)

    urls = hxs.select('//a/@href').extract()

    # make sure the parsed url is the domain related.
    for u in urls:
        # print('response url:{} | link url: {}'.format(response.url, u))
        if urlsplit(u).netloc == urlsplit(response.url).netloc:
            yield scrapy.Request(u, self.parse)
1
Community 23 Май 2017 в 11:51

Экспортируйте каждый элемент с помощью экспорта фида. В результате появится список всех ссылок, найденных на сайте.

Или напишите свой собственный Item Pipeline, чтобы экспортировать все свои ссылки. в файл, базу данных или что угодно по вашему выбору.

Другой вариант - создать список уровня паука, в который вы добавляете каждый URL, вместо того, чтобы использовать элементы вообще. Как вы поступите, действительно будет зависеть от того, что вам нужно от паука и как вы собираетесь его использовать.

2
Rejected 25 Ноя 2015 в 14:20