Извлечение ссылок из числового диапазона веб-страниц

978

Я хотел бы извлечь ссылки из числовой последовательности страниц, как это:

http://example.com/page001.html
http://example.com/page002.html
http://example.com/page003.html
...
http://example.com/page329.html

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

http://www.test.com/index.html
http://www.google.com
http://www.superuser.com/questions

Чтобы было ясно, я не хочу загружать страницы, я просто хочу список ссылок.

Программное обеспечение Windows было бы идеей, но с Linux тоже все было бы в порядке. Все, что я могу придумать, это написать длинный пакетный скрипт с Xidel, но он не будет очень устойчивым при возникновении ошибок. Керл может скачать диапазон страниц, но тогда мне нужно как-то разобрать их.


Спасибо Enigman за то, что поставили меня на правильный путь. Я создал Perl-скрипт, который читает URL-адреса из файла и выплевывает ссылки, соответствующие строке, хранящейся в $ site:

use warnings; use LWP; $site = "twitter.com";  my $browser = LWP::UserAgent->new; my @ns_headers = ( 'User-Agent' => 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36', 'Accept' => 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8', 'Accept-Language' => 'en-GB,en;q=0.8', );  open (URLLIST, 'urls.txt'); while (<URLLIST>) { chomp; print "# $_\n"; my $response = $browser->get($_, @ns_headers); die "Can't get $_ -- ", $response->status_line unless $response->is_success;  my @urls = $response->content =~ /\shref="?([^\s>"]+)/gi ; foreach $url(@urls) { if ($url =~ /$site/) { print("$url\n"); } } } close(URLLIST); 

Для генерации списка URL я сделал небольшой пакетный скрипт:

@echo off for /l %%i in (0, 15, 75) do @echo http://www.example.com/page_%%i.html 

Скрипт Perl просто останавливается на ошибке, которую я предпочитаю. Было бы тривиально изменить его, чтобы просто продолжить. Пользовательский агент и принимаемые данные извлекаются из Chrome, потому что некоторым сайтам не нравится что-то похожее на бот. Если вы собираетесь сканировать сайты, которые вам не принадлежат, пожалуйста, уважайте robots.txt и настройте пользовательский агент.

2
Я не понимаю, что вы имеете в виду. Не могли бы вы объяснить это более подробно? Какие URL вы хотите проанализировать? Вы хотите просто извлечь свойство `href` элементов` `? Где вы получаете числовую последовательность? Birei 9 лет назад 0
Скажем, на страницах есть ссылки на файлы, хранящиеся на randomfilehost.com. Я хочу проанализировать диапазон страниц и извлечь все эти ссылки. Просто URL-адреса, нет необходимости для любого HTML. Благодарю. 9 лет назад 0
Таким образом, вы имеете в виду, что вы волшебным образом знаете список URL-адресов, построенный вокруг однозначного числа, и вы *** действительно хотите загрузить страницы, но затем вы хотите проанализировать их, извлекая свойства `href` из` `элементы, сохраните их и отбросьте остальную часть HTML. Правильно? G-Man 9 лет назад 0
Я просто хочу ссылки, которые включают загрузку страниц, но мне не нужно хранить их, если вы это имеете в виду. 9 лет назад 0
как глубоко вам нужно идти? Просто что на главной странице? Journeyman Geek 9 лет назад 0

3 ответа на вопрос

3
Enigman

If you wanted to use code to do this you can do it in Perl using LWP::Simple or Mechanize modules.

The following might have what you are after Find All Links from a web page using LWP::Simple module

This is assuming you are comfortable with using a command line solution using Perl. This works the same on both Windows and Linux platforms. It wouldn't take much to modify to take URL's as parameters from the command line to parse.

Спасибо, это похоже на то, что я могу найти в подходящем решении. 9 лет назад 0
3
Sam Washington

Yep, it's a good ol' bash script. This uses the lynx browser to extract the URLs from the pages and dump them to a text file:

#!/bin/bash # # Usage: # # linkextract <start> <end> <pad> <url> # # <start> is the first number in the filename range. Must be an integer # <stop> is the last number in the filename range. Must be an integer # <pad> is the number of digits the number in the filename is zero-padded to. # <url> is the URL. Insert "<num>" where you want the number to appear. You'll # need to enclose the entire argument in quotes for (( i=$ ; i<=$ ; i++ )); do { num=$(printf "%04d" $) url=$(echo $ | sed "s/<num>/$/") lynx -dump -listonly "$" | sed -r -n "/^ +[0-9]/s/^ +[0-9]+\. //p" }; done 

You'll need to install the lynx browser, which is available on Debian as the package 'lynx'. The script prints the extracted URLs to stdout. So for the example in your question you would do (assuming you save the script to a file called linkextract):

$ linkextract 1 329 3 "http://example.com/page<num>.html" 
1
Oleg

You can use the Site Visualizer crawler for this work. Download and install it, then click New Project, type your website's URL, click OK, then Start Crawl toolbutton.

After the crawling is completed, double-click All Links report of the Reports tab. You'll be given all links that are present on the website, as well as other info: source/target link URLs, content type (HTML, image, pdf, css, etc.), response, and so on. Select all the table (context menu, or Ctrl+A shortcut), then click Copy Rows with Headers context menu item. After that you can paste the data into an Excel sheet, or a simple text document:

extract all website links

The program has 30-day trial period, but it's full-featured, so you can use it for free for 1 month.

Благодарю. Единственная проблема, которую я вижу, заключается в том, что она не поддерживает диапазон нужных мне страниц. Доступно множество приложений для сканирования, но они охватывают весь сайт, который насчитывает десятки тысяч страниц. Я просто хочу сделать диапазон из нескольких сотен и ничего больше. 9 лет назад 0
Вы можете установить такой диапазон URL-адресов, используя параметр [Включить сканирование URL-адресов] (http://site-visualizer.com/sitemap/crawling#IncludeExcludeURLs). Oleg 9 лет назад 0

Похожие вопросы