Как получить ссылки внутри ссылок с веб-страницы в python? - PullRequest
0 голосов
/ 04 мая 2020

Как я могу go связать и получить его под-ссылки и снова получить его под-ссылки? Как, например,

Я хочу go до

"https://stackoverflow.com"

затем извлеките его ссылки, например

['https://stackoverflow.com/questions/ask', 'https://stackoverflow.com/?tab=bounties']

и снова go, к этой дополнительной ссылке и извлеките эти ссылки дополнительной ссылки.

1 Ответ

1 голос
/ 04 мая 2020

Я бы порекомендовал использовать Scrapy для этого. С помощью Scrapy вы создаете объект-паук, который затем запускается модулем Scrapy.

Сначала, чтобы получить все ссылки на странице, вы можете создать объект Selector и найти все объекты гиперссылок, используя XPath:

hxs = scrapy.Selector(response)
urls = hxs.xpath('*//a/@href').extract()

Поскольку hxs.xpath возвращает Итерируемый список путей, вы можете просто перебирать их напрямую, не сохраняя их в переменной. Также каждый найденный URL-адрес должен быть передан обратно в эту функцию с помощью аргумента обратного вызова, что позволяет ему рекурсивно находить все ссылки в каждом найденном URL-адресе:

hxs = scrapy.Selector(response)
for url in hxs.xpath('*//a/@href').extract():
    yield scrapy.http.Request(url=url, callback=self.parse)

Каждый найденный путь может не содержать исходный URL-адрес, поэтому необходимо выполнить проверку:

    if not ( url.startswith('http://') or url.startswith('https://') ):
        url = "https://stackoverflow.com/" + url

Наконец, каждый URL-адрес может быть передан в другую функцию для анализа, в этом случае он просто печатается:

    self.handle(url)

Все это вместе взятый объект Spider выглядит следующим образом:

import scrapy

class StackSpider(scrapy.Spider):
    name = "stackoverflow.com"
    # limit the scope to stackoverflow
    allowed_domains = ["stackoverflow.com"]
    start_urls = [
        "https://stackoverflow.com/",
    ]

    def parse(self, response):
        hxs = scrapy.Selector(response)
        # extract all links from page
        for url in hxs.xpath('*//a/@href').extract():
            # make it a valid url
            if not ( url.startswith('http://') or url.startswith('https://') ):
                url = "https://stackoverflow.com/" + url
            # process the url
            self.handle(url)
            # recusively parse each url
            yield scrapy.http.Request(url=url, callback=self.parse)

    def handle(self, url):
        print(url)

И паук будет работать так:

$ scrapy runspider spider.py > urls.txt

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

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