Веб-поиск или очистка или сканирование? Какой инструмент / библиотеку следует использовать?

Я хочу сканировать и сохранять некоторые веб-страницы в формате HTML. Скажем, зайдите на сотни популярных веб-сайтов и просто сохраните их страницы и страницы «О».

Я рассмотрел много вопросов, но не нашел ответа на это из веб-сканирования или веб-скрепок вопросов.

Какую библиотеку или инструмент следует использовать для построения решения? Или есть даже некоторые существующие инструменты, которые могут справиться с этим?

6 Solutions collect form web for “Веб-поиск или очистка или сканирование? Какой инструмент / библиотеку следует использовать?”

Здесь действительно нет хорошего решения. Вы правы, поскольку вы подозреваете, что Python, вероятно, лучший способ начать, потому что это невероятно сильная поддержка регулярного выражения.

Чтобы реализовать что-то подобное, сильные знания SEO (поисковая оптимизация) помогут, поскольку эффективная оптимизация веб-страницы для поисковых систем говорит о том, как ведут себя поисковые системы. Я бы начал с сайта, такого как SEOMoz .

Что касается определения страницы «о нас», у вас есть только два варианта:

a) Для каждой страницы вы можете получить ссылку на страницу о нас и подать ее вашему гусеничному процессу.

б) Разберите все ссылки на страницу для определенных ключевых слов, таких как «о нас», «о», «узнать больше» или что-то еще.

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

Наконец, я бы рекомендовал, чтобы ваши поисковые robot.txt уважали инструкции в файле robot.txt и, вероятно, отличная идея не следить за ссылками, отмеченными rel="nofollow" поскольку они в основном используются на внешних ссылках. Опять же, изучите это и многое другое, прочитав SEO.

С Уважением,

При переходе на Python вас может заинтересовать механизация и BeautifulSoup .

Механизируйте тип имитации браузера (включая опции для проксирования, фальсификации идентификаторов браузера, перенаправления страниц и т. Д.) И позволяет легко выбирать формы, ссылки, … Документация немного грубая / разреженная.

Пример кода (с сайта механизации), чтобы дать вам представление:

 import mechanize br = mechanize.Browser() br.open("http://www.example.com/") # follow second link with element text matching regular expression html_response = br.follow_link(text_regex=r"cheese\s*shop", nr=1) print br.title() print html_response 

BeautifulSoup позволяет легко анализировать html-контент (который вы могли бы получить с помощью механизации) и поддерживает регулярные выражения.

Пример кода:

 from BeautifulSoup import BeautifulSoup soup = BeautifulSoup(html_response) rows = soup.findAll('tr') for r in rows[2:]: #ignore first two rows cols = r.findAll('td') print cols[0].renderContents().strip() #print content of first column 

Таким образом, эти 10 строк, приведенных выше, в значительной степени скопированы, чтобы напечатать содержимое первого столбца каждой строки таблицы на веб-сайте.

Попробуйте пройти курс лечения . Это библиотека стирания веб-страниц для python. Если ожидается простой сценарий python, попробуйте urllib2 в python.

Python ==> Curl <- лучшая реализация искателя

Следующий код может сканировать 10 000 страниц за 300 секунд на хорошем сервере.

 #! /usr/bin/env python # -*- coding: iso-8859-1 -*- # vi:ts=4:et # $Id: retriever-multi.py,v 1.29 2005/07/28 11:04:13 mfx Exp $ # # Usage: python retriever-multi.py <file with URLs to fetch> [<# of # concurrent connections>] # import sys import pycurl # We should ignore SIGPIPE when using pycurl.NOSIGNAL - see # the libcurl tutorial for more info. try: import signal from signal import SIGPIPE, SIG_IGN signal.signal(signal.SIGPIPE, signal.SIG_IGN) except ImportError: pass # Get args num_conn = 10 try: if sys.argv[1] == "-": urls = sys.stdin.readlines() else: urls = open(sys.argv[1]).readlines() if len(sys.argv) >= 3: num_conn = int(sys.argv[2]) except: print "Usage: %s <file with URLs to fetch> [<# of concurrent connections>]" % sys.argv[0] raise SystemExit # Make a queue with (url, filename) tuples queue = [] for url in urls: url = url.strip() if not url or url[0] == "#": continue filename = "doc_%03d.dat" % (len(queue) + 1) queue.append((url, filename)) # Check args assert queue, "no URLs given" num_urls = len(queue) num_conn = min(num_conn, num_urls) assert 1 <= num_conn <= 10000, "invalid number of concurrent connections" print "PycURL %s (compiled against 0x%x)" % (pycurl.version, pycurl.COMPILE_LIBCURL_VERSION_NUM) print "----- Getting", num_urls, "URLs using", num_conn, "connections -----" # Pre-allocate a list of curl objects m = pycurl.CurlMulti() m.handles = [] for i in range(num_conn): c = pycurl.Curl() c.fp = None c.setopt(pycurl.FOLLOWLOCATION, 1) c.setopt(pycurl.MAXREDIRS, 5) c.setopt(pycurl.CONNECTTIMEOUT, 30) c.setopt(pycurl.TIMEOUT, 300) c.setopt(pycurl.NOSIGNAL, 1) m.handles.append(c) # Main loop freelist = m.handles[:] num_processed = 0 while num_processed < num_urls: # If there is an url to process and a free curl object, add to multi stack while queue and freelist: url, filename = queue.pop(0) c = freelist.pop() c.fp = open(filename, "wb") c.setopt(pycurl.URL, url) c.setopt(pycurl.WRITEDATA, c.fp) m.add_handle(c) # store some info c.filename = filename c.url = url # Run the internal curl state machine for the multi stack while 1: ret, num_handles = m.perform() if ret != pycurl.E_CALL_MULTI_PERFORM: break # Check for curl objects which have terminated, and add them to the freelist while 1: num_q, ok_list, err_list = m.info_read() for c in ok_list: c.fp.close() c.fp = None m.remove_handle(c) print "Success:", c.filename, c.url, c.getinfo(pycurl.EFFECTIVE_URL) freelist.append(c) for c, errno, errmsg in err_list: c.fp.close() c.fp = None m.remove_handle(c) print "Failed: ", c.filename, c.url, errno, errmsg freelist.append(c) num_processed = num_processed + len(ok_list) + len(err_list) if num_q == 0: break # Currently no more I/O is pending, could do something in the meantime # (display a progress bar, etc.). # We just call select() to sleep until some more data is available. m.select(1.0) # Cleanup for c in m.handles: if c.fp is not None: c.fp.close() c.fp = None c.close() m.close() 

Если вы собираетесь создать сканер, который вам нужен (для Java):

  1. Узнайте, как использовать классы java.net.URL и java.net.URLConnection или использовать библиотеку HttpClient
  2. Понять заголовки HTTP-запроса / ответа
  3. Понимать переадресацию (как HTTP, HTML, так и Javascript)
  4. Понять кодировки содержимого (кодировки)
  5. Используйте хорошую библиотеку для синтаксического анализа плохо сформированного HTML (например, cyberNecko, Jericho, JSoup)
  6. Сделайте одновременные HTTP-запросы для разных хостов, но убедитесь, что вы выдаете не более одного на один и тот же хост каждые ~ 5 секунд
  7. Персистируйте страницы, которые вы выберете, поэтому вам не нужно их обновлять каждый день, если они не так часто меняются (HBase может быть полезен).
  8. Способ извлечения ссылок с текущей страницы для последующего сканирования.
  9. Послушать robots.txt

Куча других вещей тоже.

Это не так сложно, но есть множество проблемных случаев (например, переадресация, обнаружение кодировки (проверка Tika)).

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

Идентификация О нас страницы могут быть сделаны с использованием различных эвристик:

  1. текст входящей ссылки
  2. Заголовок страницы
  3. содержание на странице
  4. URL

если вы хотите быть более количественными, вы можете использовать машинное обучение и классификатор (возможно, байесовский).

Сохранение титульной страницы, очевидно, проще, но переадресация на главную страницу (иногда в разные домены и часто реализуется в теге мета-перенаправления HTML или даже в JS) очень распространены, поэтому вам нужно справиться с этим.

Heritrix имеет немного крутую кривую обучения, но может быть настроена таким образом, что будет сканироваться только домашняя страница и страница, которая «выглядит» (с использованием фильтра регулярных выражений) на странице.

Более открытые сканеры Java (web): http://java-source.net/open-source/crawlers

  • Python BeautifulSoup findAll по атрибуту "class"
  • Веб-искатель Python с базой данных MySQL
  • Извлечение изображения src на основе атрибута с помощью BeautifulSoup
  • Подача формы механизации Python не работает
  • Как найти определенный атрибут данных из тега html в BeautifulSoup4?
  • Как преобразовать необработанный объект javascript в словарь python?
  • Статья соскабливание с помощью beautifulsoup: очистка всех тегов <p>
  • Скремблирование созданной javascript страницы с использованием Python
  •  
    Interesting Posts for Van-Lav
    Python - лучший язык программирования в мире.