Опубликован: 14.06.2015 | Доступ: свободный | Студентов: 7375 / 1136 | Длительность: 09:49:00
Авторские права: Creative Commons Attribution 3.0
Лекция 12:

Сетевые программы

23.3. Получение веб-страниц с использованием библиотеки urllib

Библиотека urllib максимально упрощает получение веб-страниц и обработку их содержимого в программах Питона. Используя urllib, мы работаем с веб-страницами почти так же, как с файлами. Нужно всего лишь указать, какую веб-страницу мы хотим получить, дальше уже сама библиотека urllib отрабатывает все детали протокола HTTP.

Эквивалентный код для чтения файла romeo.txt из сети с помощью urllib записывается следующим образом:

import urllib
fhand = urllib.urlopen('http://www.py4inf.com/code/romeo.txt')
for line in fhand:
print line.strip()
  

После того, как веб-страница открыта с помощью метода urllib.urlopen, можно работать с ней как с файлом, читая ее содержимое в цикле for. На выходе программа выдает только содержимое файла. Заголовочная информация также пересылается, но код библиотеки urllib проглатывает заголовки и возвращает нам только данные:

But soft what light through yonder window breaks
It is the east and Juliet is the sun
Arise fair sun and kill the envious moon
Who is already sick and pale with grief
  

Для примера можно написать программу, получающую содержимое файла romeo.txt и подсчитывающую частоту каждого слова в тексте:

import urllib
counts = dict()
fhand = urllib.urlopen('http://www.py4inf.com/code/romeo.txt')
for line in fhand:
words = line.split()
for word in words:
counts[word] = counts.get(word,0) + 1
print counts
  

Еще раз: как только мы открыли веб-страницу, можно читать ее точно так же, как и локальный файл на компьютере.

23.4. Разбор HTML и извлечение информации из веб-страниц (Web scraping)

Очень часто возможности библиотеки urllib Питона используются при извлечении информации во всемирной паутине (Web scraping). Мы пишем программу, которая притворяется веб-браузером, получает Интернет-страницы и затем анализирует их содержимое, находя в них нужные текстовые шаблоны.

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

23.5. Разбор HTML-страниц с помощью регулярных выражений

Один из самых простых способов анализа HTML-страниц – использование регулярных выражений для поиска и извлечения подстрок, соответствующих определенным шаблонам. Рассмотрим простейшую веб-страницу:

<h1>The First Page</h1>
<p>
If you like, you can switch to the
<a href="http://www.dr-chuck.com/page2.htm">
Second Page</a>.
</p>

Можно построить регулярное выражение для нахождения и извлечения ссылок из приведенного выше текста:

href="http://.+?"

Это регулярное выражение соответсвует подстрокам, начинающимся с фрагмента "href="http://", за которым следует один или несколько произвольных символов ".+?" и далее закрывающая двойная кавычка. Вопросительный знак после плюса в ".+?" указывает, что сопоставление подстроки шаблону должно происходить в "нежадном" режиме вместо используемого по умолчанию "жадного". При "нежадном" сопоставлении мы пытаемся найти максимально короткую строку, соответствующую шаблону, при "жадном" – максимально длинную. Нужно еще добавить круглые скобки в наше регулярное выражение, чтобы указать, какую часть сопоставленной шаблону строки мы хотим извлечь. В результате получим следующую программу:

import urllib
import re
url = raw_input('Enter - ')
html = urllib.urlopen(url).read()
links = re.findall('href="(http://.*?)"', html)
for link in links:
print link

Метод findall из библиотеки работы с регулярными выражениями возвращает нам список всех подстрок, соответствующих нашему регулярному выражению, причем для каждой такой подстроки выдается только ее часть, заключенная между двумя двойными кавычками.

В результате работы программы получим:

python urlregex.py
Enter - http://www.dr-chuck.com/page1.htm
http://www.dr-chuck.com/page2.htm
python urlregex.py
Enter - http://www.py4inf.com/book.htm
http://www.greenteapress.com/thinkpython/thinkpython.html
http://allendowney.com/
http://www.py4inf.com/code
http://www.lib.umich.edu/espresso-book-machine
http:// www.py4inf.com/py4inf-slides.zip
  

Регулярные выражения прекрасно работают, когда HTML-текст правильно и предсказуемо отформатирован. Но, поскольку в сети огромное количество не вполне корректных страниц (формат HTML не является строгим), программа, основанная лишь на регулярных выражениях, либо пропускает некоторые допустимые ссылки, либо выдает неправильные данные. Эта проблема может быть решена путем использования библиотеки для надежного разбора HTML.

Алексей Виноградов
Алексей Виноградов

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

Петр Олейников
Петр Олейников

Данные файлы неоходимы не только для самостоятельных работ, но и для тестов. А по ссылкам в лекциях они не доступны, выдает ошибку 404.