Я бы порекомендовал использовать 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
Кроме того, имейте в виду, что выполнение этого кода даст вам скорость ограничена из-за переполнения стека. Возможно, вы захотите найти другую цель для тестирования, в идеале - сайт, который вы размещаете самостоятельно.