оригинальный:https://automatetheboringstuff.com/2e/chapter12/ среди тех, у кого нет Wi-Fi Один из тех редких и пугающих моментов, когда я понимаю, как много из того, что я делаю на компьютере, я делаю в Интернете. По чистой привычке я пытался проверить свою электронную почту, прочитать сообщения друзей. Twitter информацию или ответьте на вопрос: «Кертвуд Смит играет главную роль в 1987 Были ли до него в оригинальном «Робокопе» какие-то главные персонажи? " [1]
Поскольку многие Работа на компьютере предполагает серфинг в Интернете.,если твойпрограмма Было бы здорово иметь доступ к Интернету。захват сетидаиспользоватьпрограммаотсетьскачатьи Терминология для работы с контентом。Например,Google запускает множество сетевых сканеров,Индексируйте веб-страницы для своих поисковых систем. В этой главе существуют,Вы изучите несколько модулей,Эти модули позволяют использовать Python Парсинг веб-страниц становится простым.
WebbrowserPython поставляется вместе с ним и открывает браузер для входа на определенную страницу.
Запрос из Интернета на загрузку файлов и веб-страниц.
bs4
анализировать HTML, формат для написания веб-страниц.
selenium
Запускайте и управляйтесеть Браузер。selenium
модуль можетсуществоватьэтот Браузер Заполнятьповерхностьсеткаи Имитировать щелчок мышью。
webbrowser
МодульныйmapIt.py
webbrowser
Модульныйopen()
функция может начать новую Браузерк указанному URL-адрес. в интерактивном Shell Введите следующее:
>>> import webbrowser
>>> webbrowser.open('https://inventwithpython.com/')
веб-страница Браузер Этикеткаоткроется по URLinventwithpython.com
。Это, вероятно,даwebbrowser
Единственное, что может сделать модуль。несмотря на это,open()
Функция позволяет Некоторыйинтересные вещи становятся возможными。Например,Сохраните адрес, скопировать в буфер обмена,Затем существующие Google Maps изображение показывает его местоположение.,Это очень скучная вещь. Вы можете автоматически запускать содержимое буфера обмена, написав простой скрипт.,от И выполните это задание. так,Вам просто нужно скопировать адрес копировать в буфер обмена и запустить скрипт.,Картина места сделает это за вас.
*Вот что делает ваша программа:
Это означает, что ваш код должен делать следующее:
sys.argv
Прочитайте параметры командной строки в。webbrowser.open()
функция Открыть сеть Браузер。Открыть новую вкладку редактора файлов,и сохраните его какmapIt.py
。
Согласно приложению B Описание в,настраиватьmapIt.py
,Таким образом, когда вы запускаете его из командной строки,Вот так…
C:\> mapit 870 Valencia St, San Francisco, CA 94110
…скрипт будет использовать аргументы командной строки, а не буфер обмена. Если аргументы командной строки отсутствуют, программа будет знать, что нужно использовать содержимое буфера обмена.
Сначала вам нужно выяснить, что использовать для данного адреса. URL。когда тысуществовать Браузерсерединанагрузкаmaps.google.com
и при поиске адреса,адресстолбецсерединаизURL-адресдатакиз:www.google.com/maps/place/870+Valencia+St/@37.7590311,-122.4215096,17z/data=!3m1!4b1!4m2!3m1!1s0x808f7e3dadc07a37:0xc86b0b2bb93b73d8
。
Адрес находится по адресу URL , но есть и много лишнего текста. Веб-сайт обычно будет URL серединадобавить дополнительныйизданные,чтобы помочь отслеживать посетителейили Индивидуальный веб-сайт。Но если ты попытаешься просто уйтиwww.google.com/maps/place/870+Valencia+St+San+Francisco+CA
,Вы обнаружите, что по-прежнему открывается правильная страница.。так что твойпрограмма Можетнастраивать Открытьодин Web Браузерприезжать'https://www.google.com/maps/place/your_address_string'
(Чтосерединаyour_address_string
давы хотите нанести на картуизадрес)。
Сделайте свой код таким:
#! python3
# mapIt.py - Launches a map in the browser using an address from the
# command line or clipboard.
import webbrowser, sys
if len(sys.argv) > 1:
# Get address from command line.
address = ' '.join(sys.argv[1:])
# TODO: Get address from clipboard.
существоватьпрограммаиз#!
shebang ХОРОШОпосле,Вам нужно импортировать для запуска Браузеризwebbrowser
модульидля чтения скрытогосуществовать Заказ ХОРОШОженьшеньчислоизsys
модуль。sys.argv
Переменная сохраняетсяпрограммаимя файлаи Заказ ХОРОШОженьшеньчислоиз Списокповерхность。еслиэтот Списокповерхность Неттолько Включатьимя файла,Такlen(sys.argv)
вычислит значение, большее, чем1
извсечисло,Это означает, что параметры командной строки действительно были предоставлены.
Аргументы командной строки обычно разделяются пробелами.,Но существуют в этом случае,Вы хотите, чтобы все аргументы интерпретировались как одна строка.。потому чтоsys.argv
даодиннить Списокповерхность,Вы можете передать егоjoin()
метод,Последний возвращает строковое значение. Вы не хотите, чтобы имя программы появлялось в строке существования.,Так что тебе стоит пройтиsys.argv[1:]
Приходитьотрезатьчисло Группаизпервыйэлемент,инетsys.argv
。Долженповерхностьвычисление выраженияизфинальныйнитьхранилищесуществоватьaddress
переменнаясередина。
Если вы введете следующую команду в командной строке для запуска программы…
mapit 870 Valencia St, San Francisco, CA 94110
…sys.argv
переменная Воля Включатьэтот Списокповерхностьценить:
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
address
Переменная будет содержать строку'870 Valencia St, San Francisco, CA 94110'
。
Сделайте свой код таким:
#! python3
# mapIt.py - Launches a map in the browser using an address from the
# command line or clipboard.
import webbrowser, sys, pyperclip
if len(sys.argv) > 1:
# Get address from command line.
address = ' '.join(sys.argv[1:])
else:
# Get address from clipboard.
address = pyperclip.paste()
webbrowser.open('https://www.google.com/maps/place/' + address)
Если нет параметров командной строки,программа Сохраните предполагаемый адрессуществоватьбуфер обмена。доступныйpyperclip.paste()
Получить содержимое буфера обмена,и хранитьсуществовать Человек по имениaddress
изпеременнаясередина。наконец,Запустить сеть Браузер с локацией Google картинка URL,пожалуйставызовwebbrowser.open()
。
Хотя некоторые программы, которые вы пишете, выполняют большое количество задач, чтобы сэкономить ваше время, не менее приятно использовать программу, которая экономит несколько секунд каждый раз, когда она выполняет обычную задачу (например, получение карты адреса). поверхность 12-1 по сравнениюиспользоватьи НетиспользоватьmapIt.py
место показакартина Местонуждатьсяизшаг。
поверхность 12-1: использоватьи НетиспользоватьmapIt.py
получить землюкартина
Получите карту вручную:
https://maps.google.com/
。использоватьmapIt.py
:
mapIt.py
взгляниmapIt.py
нравиться Как сделать эту задачу Нет Такскучный?
если бы только У вас есть сайт,webbrowser
модульмогу позволитьиспользовать Провинция Хуидти Открыть Браузеризшаг,Перейдите непосредственно на веб-сайт. Другая программа может использовать эту функцию для выполнения следующих задач:
requests
модульотсетьскачатьдокументrequests
модульоблегчи тебе задачуотсетьскачатьдокумент,и Нет Должен беспокоитьсясетьошибка、Проблемы с подключением, сжатием данных и другие сложные вопросы. Питон Не предусмотреноrequests
модуль,Поэтому сначала вам придется установить его. из командной строки,транспорт ХОРОШО PIP Установка — по запросу пользователя. (приложение A Подробнее о том, как устанавливать сторонние модули, читайте здесь. )
Писатьrequests
модульдапотому чтодля Python изurllib2
модульслишком сложно,Непрост в использовании. фактически,использовать记号笔Пучокэтотодинвсе段涂掉。Забыл, что когда-либо упоминалприезжать Проходитьurllib2
。если тебе нужноотсетьскачатьвещь,Толькоиспользоватьrequests
модуль。
Следующий,Делатьодин Простойизтест Приходитьубеждатьсяrequests
модуль Правильная установка。существоватьинтерактивный Shell Введите следующее:
>>> import requests
Если сообщение об ошибке не отображается,ноrequests
модуль Установлен успешно。
requests.get()
функцияскачатьвеб-страницаrequests.get()
функцияприниматьодин URL нить Входить ХОРОШОскачать。проходитьверноrequests.get()
извозвращатьсяценитьвызовtype()
,ты Можетсмотретьприезжатьэтовозвращаться ПонятноодинResponse
вернослон,Чтосередина Включать Web сервервернотыизпожалуйста求данныйизответ。Я объясню это более подробно позжеResponse
вернослон,носейчассуществовать,Когда ваш компьютер подключен к Интернету,существоватьинтерактивный Shell Введите следующее:
>>> import requests
>>> res = requests.get('https://automatetheboringstuff.com/files/rj.txt') # ➊
>>> type(res)
<class 'requests.models.Response'>
>>> res.status_code == requests.codes.ok # ➋
True
>>> len(res.text)
178981
>>> print(res.text[:250])
The Project Gutenberg EBook of Romeo and Juliet, by William Shakespeare
This eBook is for the use of anyone anywhere at no cost and with
almost no restrictions whatsoever. You may copy it, give it away or
re-use it under the terms of the Proje
Сайт книги ➊ поставлять Понятно《Ромео и Джульетта》всеотделение剧изтекствеб-страница。проходитьисследоватьResponse
вернослонизstatus_code
свойство,Это можно увидетьверноэтот Web Страницалапшаизпожалуйста求成功Понятно。если оно равноrequests.codes.ok
изценить,Таквсего наилучшего ➋. (Кстати, HTTP Код состояния «ОК» в протоколе: 200. Возможно, вы уже знакомы со словом «не найдено». 404 состояниекод。)ты можешьсуществоватьen.wikipedia.org/wiki/List_of_HTTP_status_codes
попытаться найтиприезжать HTTP Полный список кодов состояний и их значениеповерхность.
Если запрос успешен,скачатьизвеб-страница ВоляделатьдлянитьхранилищесуществоватьResponse
вернослонизtext
переменнаясередина。этотпеременнаядержать Понятновсеотделение剧из Куча;верноlen(res.text)
извызовпоказыватьэто超Проходить Понятно 178,000 персонажи.наконец,вызовprint(res.text[:250])
Показать только до 250 персонажи.
Если запрос завершается неудачно с сообщением об ошибке, например «Не удалось установить новое соединение» или «Превышено максимальное количество повторов», проверьте подключение к Интернету. Подключение к серверу может быть довольно сложным, и я не могу описать здесь все возможные проблемы. Распространенные причины ошибок можно найти, выполнив поиск в Интернете по цитируемым сообщениям об ошибках.
как вы видете,Response
вернослонесть одинstatus_code
свойство,Можетверно В соответствии сrequests.codes.ok
(одиниметьвсечислоценить200
изпеременная)Приходитьисследоватьскачатьда Успех или нет。исследовать成功изодин Даже ПростойизметоддасуществоватьResponse
вернослонначальствовызовraise_for_status()
метод。еслискачатьдокументчасвнесейчасошибка,Это вызовет исключение,Если загрузка прошла успешно,Никаких действий выполняться не будет. существуетInteractive Shell Введите следующее:
>>> res = requests.get('https://inventwithpython.com/page_that_does_not_exist')
>>> res.raise_for_status()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Users\Al\AppData\Local\Programs\Python\Python37\lib\site-packages\requests\models
.py", line 940, in raise_for_status
raise HTTPError(http_error_msg, response=self)
requests.exceptions.HTTPError: 404 Client Error: Not Found for url: https://inventwithpython
.com/page_that_does_not_exist.html
методraise_for_status()
даодиночень хорошийизметод,Можетубеждатьсякогдаодинплохойизскачатьпроисходитьчаспрограммаостанавливаться。этотдахорошая вещь:ты хочешьпрограммасуществоватьпроисходить意外ошибкачаснемедленноостанавливаться。еслиодиннеудачаизскачатьнетвернотыизпрограммаизодин交易破плохой ВОЗ,тыдоступныйtry
иexcept
упаковка операторовraise_for_status()
ХОРОШОПриходитьиметь дело сэтотошибка Состояниеи Нетвстречакрах。
import requests
res = requests.get('https://inventwithpython.com/page_that_does_not_exist')
try:
res.raise_for_status()
except Exception as exc:
print('There was a problem: %s' % (exc))
этотraise_for_status()
методвызовпривести кпрограмма Выведите следующее:
There was a problem: 404 Client Error: Not Found for url: https://
inventwithpython.com/page_that_does_not_exist.html
общийдасуществовать Завершен звонокrequests.get()
Позвонить позжеraise_for_status()
。существоватьтыизпрограмма继续транспорт ХОРОШОДо,Вам необходимо убедиться, что загрузка действительно работает.
существоватьздесь,ты Можетиспользоватьстандартныйизopen()
функцияиwrite()
метод Волявеб-страницадержатьприезжатьжесткий дискначальствоиздокументсередина。Нет Проходить,Есть еще тонкие различия. первый,тыдолженпроходить Волянить'wb'
передается в качестве второго аргументаopen()
,существоватьЗаписать двоичный файлОткрыть файл в режиме。即делать Страницалапшадачистыйтекст(напримерты Доскачатьиз《Ромео и Джульетта》текст),для обслуживаниятекстиз Unicode кодирование,тытакженуждатьсяхотеть Писать二Входить制данныеинеттекстданные。
Запись веб-страницы в файл,МожетиспользоватьодинсResponse
вернослонизiter_content()
методизfor
цикл。
>>> import requests
>>> res = requests.get('https://automatetheboringstuff.com/files/rj.txt')
>>> res.raise_for_status()
>>> playFile = open('RomeoAndJuliet.txt', 'wb')
>>> for chunk in res.iter_content(100000):
playFile.write(chunk)
100000
78981
>>> playFile.close()
iter_content()
методпроходитьциклсуществоватькаждая итерациясерединавозвращаться Внутри Позволятьиз“кусок”。каждыйкусок Вседабайтизданныетип,Вы можете указать, сколько байт будет содержать каждый блок. Сто тысяч байт обычно являются хорошим размером.,Так будет100000
передается как параметр вiter_content()
。
документRomeoAndJuliet.txt
сейчассуществовать Сохранюсуществоватьв настоящий момент Работа Оглавлениесередина。пожалуйста, обрати внимание,虽Однакосеть站начальствоизимя файладаrj.txt
,但тыжесткий дискначальствоиздокументиметь Неттакой жеизимя файла。requests
модуль Толькодаиметь дело сскачатьвеб-страница Внутри Позволять。Как только страница будет загружена,Это данные в вашей программе. Даже если вы существовали после загрузки веб-страницы, у вас пропало подключение к Интернету.,Все веб-данные по-прежнему останутся на вашем компьютере.
UNICODE-кодировка
Кодирование Unicode выходит за рамки этой книги, но вы можете узнать больше на следующих веб-страницах:
write()
методвозвращаться Писатьвходитьдокументизбайтчисло。существоватьвпередлапшаиз Примерсередина,первыйкусоксерединаиметь 100,000 байт, остальной части файла нужно только 78,981 байты.
Напомним, вот полный процесс загрузки и сохранения файла:
requests.get()
скачатьдокумент。'wb'
вызовopen()
к Писать二Входить制模式создаватьодинновыйдокумент。Response
вернослонизiter_content()
метод。write()
Воля Внутри Позволять Писатьвходитьдокумент。close()
закрытиедокумент。этот Сразудаrequests
Модульныйвсе Внутри Позволять!итыодин直использовать Приходитькомпилировать Писатьтекстдокументизopen()
/ write()
/ close()
Работапоток по сравнению с,for
циклиiter_content()
извещьвозможныйсмотреть起Приходитьсложный,但этотдадля Понятноубеждатьсяrequests
модуль Нетвстречазаниматьиспользоватьслишком Внутрижить,即делатьтыскачать Понятно大количестводокумент。ты можешьотrequests.readthedocs.org
середина Понятно解requests
Модульный Что Другие характеристики。
HTML
Прежде чем выбрать веб-страницу, вы узнаете некоторые HTML базовые знания. Вы также увидите, как получить доступ Web Мощные инструменты разработки Браузера, которые позволят Web Получение информации становится проще.
Язык гипертекстовой разметки (HTML) Это формат, в котором пишутся веб-страницы. В этой главе предполагается, что вы заинтересованы в HTML Есть некоторый базовый опыт, но если вам нужен учебник для начинающих, я рекомендую вам перейти на следующий сайт:
Если вы давно не смотрели это HTML Хорошо, вот краткий обзор основ. HTML документдасhtml
документ Расширятьимяизчистыйтекстдокумент。этот些документсерединаизтекст Зависит отЭтикеткаокружать,Эти теги представляют собой слова, заключенные в угловые скобки. Теги сообщают Браузеру, как форматировать веб-страницу. Начальный и конечный тег могут содержать текст Некоторый,формаэлемент。текст(илиВнутренний HTML ) — это содержимое между открывающим и закрывающим тегами. Например, следующее HTML встречасуществовать БраузерсерединапоказыватьHello, world
,Hello
Смелый:
<strong>Hello</strong>, world!
В браузере этот HTML-код будет выглядеть так, как показано на рисунке 12-1.
картина 12-1: существовать Браузерсерединарендерингиз<strong>Hello</strong>, world!
начинатьиз<strong>
Этикеткаповерхность Показывать Включатьизтекстбудет выделено жирным шрифтом。Заканчивать Этикетка Рассказывать Браузер Смелыйтекстиз Заканчивать Расположение。
HTML серединаиметь许多Неттакой жеиз Этикетка。Чтосередина Некоторый Этикеткасуществоватьугловые скобки Внутрииметь额外изсвойство,Формасвойство。Например,<a>
Этикетка Включать Понятноотвечать Долженда Связьизтекст。текст Связьприезжатьиз URL Зависит отhref
свойство Решать。здесьесть одинпример:
Al's free <a href="https://inventwithpython.com">Python books</a>.
В браузере это HTML похоже на картину 12-2 。
картина 12-2: Ссылки, отображаемые в браузере
некоторыйэлементесть одинid
свойство,использовать Приходить惟один地标识Страницалапшасерединаизэлемент。тычастовстреча指Показыватьтыизпрограммапроходитьэлементизid
свойствоприди и найдиэлемент,потому чтоэтотиспользовать Браузеризразвиватьинструмент Приходитьвычислитьэлементизid
свойстводакомпилировать Писать Web Общие задачи для сканеров.
Вам необходимо проверить веб-страницу, которую будет использовать ваша программа. HTML источниккод。дляэтот,существоватьтыизсеть Браузерсерединащелкните правой кнопкой мыши(илиCTRL
и нажмите MacOS)любойвеб-страница,и выберитеПосмотреть источникилиПосмотреть исходный код страницык查смотреть Страницалапшаиз HTML текст (см. картинку 12-3 )。этотдатыиз Браузер Фактическая оплатаприезжатьизтекст。Браузерзнаю, как показать,илирендерингПриходитьсэтот HTML веб-страница.
картина 12-3: Просмотр исходного кода веб-страницы
Я настоятельно рекомендую посетить некоторые из ваших любимых сайтов. HTML Исходный код. Если вы не до конца понимаете, что видите, когда смотрите исходник, ничего страшного. вам не нужно быть опытным HTML Приходитькомпилировать Писать Простойизвеб-страницаползтипрограмма——после всего,ты Нетвстреча Писатьс己изсеть站。ты Только Будь достаточноиз Знание Приходитьотсейчасиметьизсеть站середина Выбиратьданные。
Помимо просмотра исходного кода веб-страницы, вы также можете использовать инструменты разработки браузера для просмотра HTML. существовать Chrome и Internet Explorer середина,Уже установлен инструмент Разработчик,ты можешьв соответствии сF12
позволятьэто们внесейчас(Видетькартина 12-4 )。Нажмите еще разF12
сделаю Разработчик Инструмент исчезает。существовать Chrome середина,тытакже Можетпроходитьвыбирать择视картина -> Разработчик -> РазработчикинструментПриходитьвызывать Разработчикинструмент。существовать MacOS середина,нажиматьCmd+Option
Открыть Chrome из Разработчикинструмент。
изображение 12-4: Окно инструментов разработчика в Chrome Браузер
существовать Firefox , вы можете использовать существование Windows и Linux начальствонажиматьCTRL-SHIFT-C
или ВОЗсуществовать MacOS начальствонажиматьCmd-OPTION-C
Приходить Открыть Web Перехватчик для инструмента Разработчик. Планировка и Chrome Инструмент Разработчик практически идентичен.
существовать Safari середина,Открыть окно настроек,исуществовать Премиум окносеткасерединавыбиратьсередина菜одинстолбецсерединаизПоказать меню разработкиПараметры。начинатьиспользоватьназад,ты можешьпроходитьв соответствии сCmd-OPTION-I
вызывать Разработчикинструмент。
существующий Браузер включить или после установки инструментов разработки,Вы можете щелкнуть правой кнопкой мыши по любой части веб-страницы.,иотначальствоконтекстное менюсерединавыбирать择Проверить элементквызывать Ответственный Долженчасть Страницалапшаиз HTML. Когда вы начинаете анализировать веб-скребок HTML Это будет полезно.
Не используйте регулярные выражения поверхности для анализа HTML.
существуют найти конкретную строку HTML Этот фрагмент кажется прекрасным примером регулярного выражения поверхности. Однако я советую вам этого не делать. Существует много разных способов форматирования. HTML и по-прежнему считается действительным HTML, но попытка уловить все эти возможные варианты в регулярном выражении поверхности может быть утомительной и подверженной ошибкам. специально для разбора HTML развиватьизмодуль,напримерbs4
,Появляться BUG Вероятность будет меньше.
Вы можете найти расширенный аргумент, объясняющий, почему существование не следует анализировать с помощью регулярных выражений поверхности.
один旦тыизпрограммаиспользоватьrequests
модульскачать Понятновеб-страница,ты Волядержатьиметьэтотвеб-страницаиз HTML Содержимое как отдельное строковое значение. Теперь существуют, тебе нужно во всем разобраться HTML Какая часть соответствует информации на интересующей вас веб-странице.
В этом может помочь инструмент Разработчик Браузера. Допустим, вы хотите написать программуот получения данных прогноза погоды. существования Прежде чем писать какой-либо код, проведите небольшое исследование. Если вы зайдете на сайт и выполните поиск 94105 Почтовый индекс, сайт перенаправит вас на страницу с прогнозом погоды для этого. регион.
Что делать, если вы заинтересованы в сборе информации о погоде для этого поста? Щелкните правой кнопкой мыши по местоположению на странице (илисуществовать). MacOS Нажмите наCtrl
,иотвнесейчасизначальствоконтекстное менюсерединавыбирать择Проверить элемент。Это открыть окно инструмента «Разработчик», в котором показаны сгенерированные Web этой конкретной части страницы HTML。картина 12-5 Показаны последние прогнозы инструмента Разработчик верно HTML открыть。Уведомление,еслиweather.gov
сеть站改变Понятноэтоизвеб-страницадизайн,Вам необходимо повторить этот процесс, чтобы проверить новый элемент.
картина 12-5. Используйте инструменты разработки для проверки элемента, содержащего интеллектуальный текст.
Как вы можете видеть в инструменте «От Разработчик», человек, ответственный за часть прогнозирования веб-страницы, HTML да<div class="col-sm-10 forecast-text">Sunny, with a high near 64\. West wind 11 to 16 mph, with gusts as high as 21 mph.</div>
。этоттолькодатыхотетьпопытаться найтииз!Похоже, информация о прогнозе содержитсуществоватьсforecast-text
CSS добрыйиз<div>
элементсередина。существовать Браузеризразвивать人员контроль台серединащелкните правой кнопкой мышиэтотэлемент,иотвнесейчасизначальствоконтекстное менюсерединавыбирать择Копировать селектор CSS。Это преобразует строку типа'div.row-odd:nth-child(1) > div:nth-child(2)'
копироватьприезжатьбуфер обмена。ты можешь Воляэтотнитьиспользовать В BeautifulSoup изselect()
или Selenium изfind_element_by_css_selector()
метод,Это будет объяснено позже в этой главе. Теперь ты знаешь, что ты существуешь,BeautifulSoup Модуль поможет найти его в существующей строке.
bs4
модульанализировать HTMLBeautifulSoup это от HTML Модуль извлечения информации со страницы (существовать в этом плане гораздо лучше обычного выражения поверхности). Красивая Суп Модульныйимя Слово называетсяbs4
(BeautifulSoup,4-е издание). чтобы установить его,тебе нуженот Заказ ХОРОШОтранспорт ХОРОШОpip install --user beautifulsoup4
。(查смотретьприложение A Понятно解Установить第三方Модульныйиллюстрировать。)иbeautifulsoup4
даиспользовать ВУстановитьизимя Характер,Чтобы импортировать BeautifulSoup тытранспорт ХОРОШОimport bs4
。
Для этой главы BeautifulSoup В основе будет проанализирован HTML-файл. Откройте новую вкладку редактора файлов в Mu.,Введите следующее,сохранить какexample.html
。или ВОЗ,отnostarch.com/automatestuff2
скачать。
<!-- This is the example.html example file. -->
<html><head><title>The Website Title</title></head>
<body>
<p>Download my <strong>Python</strong> book from <a href="https://
inventwithpython.com">my website</a>.</p>
<p class="slogan">Learn Python the easy way!</p>
<p>By <span id="author">Al Sweigart</span></p>
</body></html>
Как видите, даже простой HTML Файлы также привязаны к множеству различных тегов, и их можно быстро спутать со сложными веб-сайтами. Приятно, что красивый суп можно использовать HTML Стало намного проще.
BeautifulSoup
вернослонНужно включить, он будет анализировать HTML изнить Приходитьвызовbs4.BeautifulSoup()
функция。bs4.BeautifulSoup()
функциявозвращатьсяодинBeautifulSoup
вернослон。когдатыизвычислить机соединятьприезжать互联сетьчас,существоватьинтерактивный Shell Введите следующее:
>>> import requests, bs4
>>> res = requests.get('https://nostarch.com')
>>> res.raise_for_status()
>>> noStarchSoup = bs4.BeautifulSoup(res.text, 'html.parser')
>>> type(noStarchSoup)
<class 'bs4.BeautifulSoup'>
этот кодиспользоватьrequests.get()
от无淀粉вне版社сеть站скачать Домашняя страницалапша,Затем Воляответизtext
свойствоперешел кbs4.BeautifulSoup()
。этовозвращатьсяизBeautifulSoup
вернослонхранилищесуществовать Человек по имениnoStarchSoup
изпеременнаясередина。
Вы также можете снять нагрузку с жесткого диска HTML документ,методда ВоляодинFile
вернослонперешел кbs4.BeautifulSoup()
,Также передайте второй параметр,Рассказывать BeautifulSoup Какой парсер использовать для анализа HTML。
существоватьвзаимодействие Shell середина Введите следующее(убеждатьсяexample.html
документсуществовать Работа Оглавлениесерединапосле):
>>> exampleFile = open('example.html')
>>> exampleSoup = bs4.BeautifulSoup(exampleFile, 'html.parser')
>>> type(exampleSoup)
<class 'bs4.BeautifulSoup'>
здесьиспользоватьиз'html.parser'
анализироватьустройствода Python с带из。Однакои,еслиты Установить Понятно第三方изlxml
модуль,ты можешьиспользовать Быстрееиз'lxml'
анализироватьустройство。в соответствии с В соответствии сприложение A Описание в,проходитьтранспорт ХОРОШОpip install --user lxml
Установить Долженмодуль。забывать Включать第二个женьшеньчисло Воляпривести кодинUserWarning: No parser was explicitly specified
предупреждать。
Как только у вас есть одинBeautifulSoup
вернослон,Вы можете использовать его для поиска HTML Отдельный раздел документа.
select()
метод寻попытаться найтиэлементты Можетпроходитьвызовselect()
методидлятытолькосуществовать寻попытаться найтиизэлементпередача CSS селекторизнить ПриходитьотBeautifulSoup
вернослонсередина Поиск Web Элемент страницы. селекторы подобны регулярным выражениям: они определяют шаблон поверхности для Нахождения — в данном случае существует, существует. HTML Страницалапшасередина,инетсуществоватьв целомизтекстнитьсередина。
верно CSS Полное обсуждение синтаксиса селектора выходит за рамки этой книги (хорошее руководство по селектору есть в существующих ссылках, существующих), но здесь дается краткое введение в селектор. поверхность 12-2 Показывает самые распространенные CSS Пример шаблона селектора.
поверхность 12-2:CSS Пример селектора
Селектор передается методу select() | соответствовать… |
---|---|
soup.select('div') | все<div>элемент |
soup.select('#author') | Элементы, атрибут id которых является автором |
soup.select('.notice') | Все элементы, атрибут класса CSS которых имеет значение уведомления. |
soup.select('div span') | Включать<span>извсе<div>элемент |
soup.select('div > span') | прямой Включать<span>(середина间没иметь Чтоонэлемент)извсе<div>элемент |
soup.select('input[name]') | nameсвойстводляпроизвольныйценитьизвсе<input>элемент |
soup.select('input[type="button"]') | typeдляbuttonизвсе<input>элемент |
Различные шаблоны селектора можно комбинировать для создания сложного соответствия. Например,soup.select('p #author')
Волясоответствоватьлюбое наличиеauthor
изid
свойствоизэлемент,если бы толькоэто такжесуществовать<p>
элемент Внутри。тытакже Можетсуществовать Браузерсерединащелкните правой кнопкой мышиэлементи выберитеПроверить элемент,Вместо того, чтобы писать селектор самостоятельно. Когда открывается консоль разработчика Браузера,щелкните правой кнопкой мышиэлементиз HTML и выберитеКопировать селектор CSSВоляселекторнитькопироватьприезжатьбуфер обменаи Вставитьприезжатьисточниккодсередина。
select()
метод ВолявозвращатьсяодинTag
вернослониз Списокповерхность,этот Сразуда BeautifulSoup Как показать HTML элемент。верно ВBeautifulSoup
вернослониз HTML серединаизкаждыйсоответствовать,Должен Списокповерхность Воля ВключатьодинTag
вернослон。Этикеткаценить Можетперешел кstr()
функция Приходитьпоказыватьэто们Местопоколениеповерхностьиз HTML Этикетка。Этикеткаценитьвозвращатьсяесть одинattrs
свойство,это Воля Этикеткаизвсе HTML свойствопоказыватьдлясловарь。использоватьвпередлапшаизexample.html
документ,существоватьинтерактивный Shell Введите следующее:
>>> import bs4
>>> exampleFile = open('example.html')
>>> exampleSoup = bs4.BeautifulSoup(exampleFile.read(), 'html.parser')
>>> elems = exampleSoup.select('#author')
>>> type(elems) # elems is a list of Tag objects.
<class 'list'>
>>> len(elems)
1
>>> type(elems[0])
<class 'bs4.element.Tag'>
>>> str(elems[0]) # The Tag object as a string.
'<span id="author">Al Sweigart</span>'
>>> elems[0].getText()
'Al Sweigart'
>>> elems[0].attrs
{'id': 'author'}
Этот код будет в нашем примере HTML серединаизвлекатьсid="author"
изэлемент。насиспользоватьselect('#author')
возвращатьсяодин Включатьвсеid="author"
элементиз Списокповерхность。нас Воляэтот Этикеткавернослониз Списокповерхностьхранилищесуществоватьпеременнаяelems
середина,len(elems)
Рассказыватьнас Списокповерхностьсерединаесть один Этикеткавернослон;есть одинсоответствовать。существоватьэлементначальствовызовgetText()
встречавозвращатьсяэлементизтекст,или ВОЗВнутренний HTML。элементизтекстданачинатьи Заканчиватьмежду маркерамииз Внутри Позволять:существовать Этот примерсерединада'Al Sweigart'
。
Воляэлементперешел кstr()
встречавозвращатьсяодинсначинатьи Заканчивать Этикеткаа такжеэлементтекстизнить。наконец,attrs
данныйсловарь,Чтосередина Включатьэлементизсвойство'id'
исвойствоid
изценить'author'
。
тывозвращаться МожетотBeautifulSoup
вернослонсередина拉вневсеиз<p>
элемент。существоватьинтерактивный Shell Введите следующее:
>>> pElems = exampleSoup.select('p')
>>> str(pElems[0])
'<p>Download my <strong>Python</strong> book from <a href="https://
inventwithpython.com">my website</a>.</p>'
>>> pElems[0].getText()
'Download my Python book from my website.'
>>> str(pElems[1])
'<p class="slogan">Learn Python the easy way!</p>'
>>> pElems[1].getText()
'Learn Python the easy way!'
>>> str(pElems[2])
'<p>By <span id="author">Al Sweigart</span></p>'
>>> pElems[2].getText()
'By Al Sweigart'
на этот раз,select()
данныйтрисоответствоватьиз Списокповерхность,нас ВоляэтохранилищесуществоватьpElems
середина。существоватьpElems[0]
、pElems[1]
иpElems[2]
начальствоиспользоватьstr()
Волякаждыйэлементпоказыватьдляодиннить,существоватькаждыйэлементначальствоиспользоватьgetText()
Воляпоказывать Чтотекст。
Tag
вернослонизget()
методделатьотэлементсерединадоступсвойствоценить变得Простой。КДолженметодпередачаодинсвойствоимясказатьнить,ивозвращаться Долженсвойствоизценить。использоватьexample.html
,существоватьвзаимодействие Shell Введите следующее:
>>> import bs4
>>> soup = bs4.BeautifulSoup(open('example.html'), 'html.parser')
>>> spanElem = soup.select('span')[0]
>>> str(spanElem)
'<span id="author">Al Sweigart</span>'
>>> spanElem.get('id')
'author'
>>> spanElem.get('some_nonexistent_addr') == None
True
>>> spanElem.attrs
{'id': 'author'}
здесьнасиспользоватьselect()
Приходить Находитьлюбой<span>
элемент,Затем ВоляпервыйсоответствоватьизэлементхранилищесуществоватьspanElem
середина。Волясвойствоимя'id'
перешел кget()
встречавозвращатьсясвойствоизценить'author'
。
Всякий раз, когда я существую в Google, тема,я Нетвстречаодин次Толькосмотретьодин Результаты поиска。проходитьсерединаударятьодин Результаты поиска Связь(или ВОЗсуществовать Нажмите и удерживайтеCTRL
изтакой жечас点ударять),Я буду открывать первые несколько ссылок в куче новых вкладок,чтобы прочитать позже. Я часто ищу в Google,Этот процесс работы - открыть мой Браузер,Поиск по теме,Потом кликать по нескольким ссылкам одну за другой – очень утомительно. Что, если бы я мог просто ввести поисковый запрос в командную строку,Пусть мой компьютер автоматически открывает Браузер,существовать Показать все популярные результаты поиска в новой вкладке,Это было бы здорово. Давайте напишем сценарий,существоватьpypi.org
использовать Python Это делают страницы результатов поиска, проиндексированные пакетом. подобная программа может работать для многих других веб-сайтов, хотя Google и DuckDuckGo Часто предпринимайте шаги, чтобы затруднить сканирование страниц результатов поиска.
Вот что делает ваша программа:
Это означает, что ваш код должен делать следующее:
sys.argv
Прочитайте параметры командной строки в。requests
модульполучать Результаты поиска Страницалапша。webbrowser.open()
функция Открыть сеть Браузер。Открыть новую вкладку редактора файлов,Воля Что Другойжитьдляsearchpypi.py
。
существовать до написания любого кода,Сначала вам нужно знать URL-адрес страницы результатов поиска. Посмотреть адресную строку Браузера после поиска,Можетсмотретьприезжатьрезультат Страницалапшаесть одиндобрый似Вpypi.org/search/?q=<SEARCH_TERM_HERE>
изURL-адрес。модуль Можетскачатьэтот Страницалапша,Затем вы можете найти ссылку на результат поиска в использовании BeautifulSoup существующего HTML. наконец,ты Воляиспользоватьwebbrowser
модульсуществовать Браузер Этикеткасередина Открытьэтот些Связь。
Сделайте свой код таким:
#! python3
# searchpypi.py - Opens several search results.
import requests, sys, webbrowser, bs4
print('Searching...') # display text while downloading the search result page
res = requests.get('https://google.com/search?q=' 'https://pypi.org/search/?q='
+ ' '.join(sys.argv[1:]))
res.raise_for_status()
# TODO: Retrieve top search result links.
# TODO: Open a browser tab for each result.
использоватьсемья Волясуществоватьзапускатьпрограммачасиспользовать Заказ ХОРОШОженьшеньчисло Укажите условия поиска。этот些женьшеньчисло Воляделатьдлянитьхранилищесуществоватьsys.argv
из Списокповерхностьсередина。
сейчассуществоватьвам нужноиспользовать BeautifulSoup от Вы скачали HTML серединаизвлекать排имя靠впередиз Результаты поиска Связь。нотынравитьсячтодляэтот项Работапопытаться найтиприезжатьподходящийиз人выбирать Шерстяная ткань?Например,ты Нет能Только搜索всеиз<a>
Этикетка,Потому что в HTML существует множество ссылок, которые вас не волнуют. Напротив,Вы должны проверить страницу результатов поиска, используя инструменты разработчика Браузера.,Попробуйте картинунайти селектор,Выбирайте только те ссылки, которые вам нужны.
Поиск завершен BeautifulSoup После этого вы можете открыть инструменты разработчика вашего браузера.,Просмотрите элемент ссылки Некоторый на странице. они выглядят сложными,Такая страница.
Не беда, если элементы выглядят очень сложными. Вам просто нужно найти шаблон во всех ссылках результатов поиска.
Сделайте свой код таким:
#! python3
# searchpypi.py - Opens several google results.
import requests, sys, webbrowser, bs4
--snip--
# Retrieve top search result links.
soup = bs4.BeautifulSoup(res.text, 'html.parser')
# Open a browser tab for each result.
linkElems = soup.select('.package-snippet')
но,еслиты查смотреть<a>
элемент,Ссылки на результаты поиска доступныclass="package-snippet"
。Просматривать HTML источниккодиз Что Оставатьсячасть,смотреть起Приходитьpackage-snippet
добрый Толькоиспользовать ВРезультаты поиска Связь。ты Нет Должен знать CSS добрыйpackage-snippet
да Чтоили ВОЗэто Делать Что。ты Толькода Воляэтоиспользоватьделатьтытолькосуществовать寻попытаться найтииз<a>
элементизотметка。ты Можетотскачать Страницалапшаиз HTML текстсерединасоздаватьодинBeautifulSoup
вернослон,Затемиспользоватьселектор'.package-snippet'
Приходить Находитьиметьpackage-snippet
CSS добрыйизэлементсерединаизвсе<a>
элемент。Уведомление,если PyPI На сайте изменился макет, возможно, вам придется использовать новый CSS селекторнить Приходить Даженовыйэтотпрограмма,кперешел кsoup.select()
。программаиз Что Оставатьсячастьвсе еще Волядабольшинствоновыйиз。
Наконец, мы сообщим программе открыть вкладку веб-браузера для наших результатов. Добавьте в конец программы следующее:
#! python3
# searchpypi.py - Opens several search results.
import requests, sys, webbrowser, bs4
--snip--
# Open a browser tab for each result.
linkElems = soup.select('.package-snippet')
numOpen = min(5, len(linkElems))
for i in range(numOpen):
urlToOpen = 'https://pypi.org' + linkElems[i].get('href')
print('Opening', urlToOpen)
webbrowser.open(urlToOpen)
По умолчанию,использоватьwebbrowser
модульсуществоватьновый Этикеткасередина Открытьвпередпять Результаты поиска。Однакои,использоватьсемьявозможный已经搜索Понятновнесейчаснемного Впять результатовизвещь。soup.select()
вызоввозвращатьсяитыиз'.package-snippet'
селекторсоответствоватьизвсеэлементиз Списокповерхность,потому чтоэтотты想хотеть Открытьиз Этикеткачисло Количество илида5
Илидаэтот Списокповерхностьиздлина(кменьше ВОЗдляпозволять)。
встроенный Python функцияmin()
возвращатьсяперешел кэтоизбольшинство小всечислоили浮点женьшеньчисло。(возвращатьсяесть одинвстроенныйизmax()
функция,этовозвращатьсяперешел кэтоизбольшинство大женьшеньчисло。)ты Можетиспользоватьmin()
Приходить Находить Списокповерхностьсерединаиз Связьда否немного Впять,и Воляхотеть Открытьиз Связьчислоколичествохранилищесуществовать Человек по имениnumOpen
изпеременнаясередина。Затемты можешьпроходитьвызовrange(numOpen)
Приходитьтранспорт ХОРОШОодинfor
цикл。
существуют на каждой итерации цикла,использоватьwebbrowser.open()
существовать Web Браузерсередина Открытьодинновый Этикетка。Уведомление,возвращатьсяиз<a>
элементсерединаизhref
свойствоизценить没иметь初始изhttps://pypi.org
часть,Местоктыдолжен Воля Чтосоединятьприезжатьhref
свойствоизнитьценить。
сейчассуществоватьты можешьпроходитьсуществовать Заказ ХОРОШОначальствотранспорт ХОРОШОsearchpypi boring stuff
Приходитьнемедленно Открытьвпередпять PyPI Результаты поиска,напримеробъяснятьскучные вещи!(женьшень Видетьприложение B Узнайте, как легко запустить программу в вашей операционной системе. )
Этикетка式Просматриватьизвыгодадаты можешьочень Позволять易地существоватьновый Этикеткасередина Открыть Связь,для дальнейшего чтения. Программа, которая автоматически открывает несколько ссылок одновременно, может быть хорошим способом сделать следующее:
Блоги и другие регулярно обновляемые веб-сайты обычно имеют домашнюю страницу.,Выше есть недавние статьи,Также есть кнопка предыдущей страницы.,Могу перейти к предыдущей статье. Тогда в этом посте также будет кнопка «Предыдущая страница».,и так далее,Создайте трек от самой последней страницы до первой публикации на сайте. Если вы хотите получить копию содержимого веб-сайта,Чтоб не существовало существование читать в сети,Вы можете просматривать каждую страницу вручную и сохранять каждую страницу. Но это довольно скучно,Итак, давайте вместо него напишем программу.
XKCD — популярная компьютерная сетькомиксы, чей сайт соответствует этой структуре (см. изображение 12-6 )。xkcd.com
из首Страницаесть один“начальствоодин Страница”кнопка,Верните пользователя к предыдущим комиксам. Загрузка каждого комикса вручную может занять много времени.,ноты можешь Писатьодин Скриптсуществоватьнесколько минут Внутри Заканчивать。
картина 12-6: XKCD,“романтический、Сатира、Сетькомиксы «Математика и язык».
Ваша программа делает это:
Это означает, что ваш код должен делать следующее:
requests
модульскачать Страницалапша。iter_content()
Волякомиксыкартинакартинаскачатьидержатьприезжатьжесткий диск。Открытьодинновыйиздокументкомпилировать辑устройство Этикетка,сохранить какdownloadXkcd.py
。
Если вы откроете инструменты разработчика вашего браузера и осмотрите элементы на странице, вы обнаружите следующее:
<img>
элементизhref
свойстводанный。<img>
элемент Кусочек В<div id="comic">
элемент Внутриотделение。prev
изrel
HTML свойство。xkcd.com
URL-адрес,поверхность означает, что предыдущих страниц больше нет.Сделайте свой код таким:
#! python3
# downloadXkcd.py - Downloads every single XKCD comic.
import requests, os, bs4
url = 'https://xkcd.com' # starting url
os.makedirs('xkcd', exist_ok=True) # store comics in ./xkcd
while not url.endswith('#'):
# TODO: Download the page.
# TODO: Find the URL of the comic image.
# TODO: Download the image.
# TODO: Save the image to ./xkcd.
# TODO: Get the Prev button's url.
print('Done.')
ты Волядержатьесть одинкценить'https://xkcd.com'
начинатьизurl
переменная,ииспользоватькогдавперед Страницалапшаиз“начальствоодин Страница”Связьиз URL Тяжелый复Даженовыйэто(существоватьодинfor
циклсередина)。существоватьциклизкаждый шаг,ты Волясуществоватьurl
скачатькомиксы。когдаurl
к'#'
Заканчиватьчас,Вы поймете, что цикл закончился.
ты Воля Пучоккартинакартинадокументскачатьприезжатькогдавперед Работа Оглавление Внизимядляxkcd
издокументпапкасередина。вызовos.makedirs()
убеждатьсяэтотдокументпапкажитьсуществовать,exist_ok=True
关ключ Характерженьшеньчислопредотвращатьфункциясуществоватьэтотдокументпапка已经житьсуществоватьиз Состояние Вниз抛внеаномальный。оставатьсяизкод Толькода Обзорпрограмма Что Оставатьсячастьиз Комментарий。
Давайте реализуем код страницы загрузки. Сделайте свой код таким:
#! python3
# downloadXkcd.py - Downloads every single XKCD comic.
import requests, os, bs4
url = 'https://xkcd.com' # starting url
os.makedirs('xkcd', exist_ok=True) # store comics in ./xkcd
while not url.endswith('#'):
# Download the page.
print('Downloading page %s...' % url)
res = requests.get(url)
res.raise_for_status()
soup = bs4.BeautifulSoup(res.text, 'html.parser')
# TODO: Find the URL of the comic image.
# TODO: Download the image.
# TODO: Save the image to ./xkcd.
# TODO: Get the Prev button's url.
print('Done.')
сначала распечататьurl
,позволятьиспользоватьсемья知道программахотетьскачать Который URL Затемиспользоватьrequests
Модульныйrequest.get()
функцияскачать。и По-прежнему,Если произошла ошибка при загрузке,тывстречанемедленновызовResponse
вернослонизraise_for_status()
метод抛внеаномальныйи Заканчиватьпрограмма。в противном случае,отскачать СтраницалапшаизтекстсоздаватьодинBeautifulSoup
вернослон。
Сделайте свой код таким:
#! python3
# downloadXkcd.py - Downloads every single XKCD comic.
import requests, os, bs4
--snip--
# Find the URL of the comic image.
comicElem = soup.select('#comic img')
if comicElem == []:
print('Could not find comic image.')
else:
comicUrl = 'https:' + comicElem[0].get('src')
# Download the image.
print('Downloading image %s...' % (comicUrl))
res = requests.get(comicUrl)
res.raise_for_status()
# TODO: Save the image to ./xkcd.
# TODO: Get the Prev button's url.
print('Done.')
Проверьте, используя свои инструменты разработки. XKCD Домашняя страница,ты знаешькомиксыкартинакартинаиз<img>
элементсуществоватьодин<div>
элемент Внутри,Чтоid
свойствонастраиватьдляcomic
,потому чтоэтотселектор'#comic img'
ВоляотBeautifulSoup
вернослонсерединаполучатьтолько确из<img>
элемент。
Некоторая страница XKCD имеет специальный контент,Это не простой файл, похожий на картинку. Это нормально; вы можете пропустить это. Если ваш селектор не нашел ни одного элемента,Такsoup.select('#comic img')
Волявозвращатьсяодинпустой Списокповерхность。когдапроисходитьэтот种Состояниечас,программа может вывести сообщение об ошибке,затем продолжай бежать,Вместо загрузки изображения изображения.
в противном случае,селектор Волявозвращатьсяодин Включатьодин<img>
элементиз Списокповерхность。ты Можетотэтот<img>
элементсерединаполучатьsrc
свойство,и Воля Чтоперешел кrequests.get()
кскачатькомиксыизкартинакартинадокумент。
Сделайте свой код таким:
#! python3
# downloadXkcd.py - Downloads every single XKCD comic.
import requests, os, bs4
--snip--
# Save the image to ./xkcd.
imageFile = open(os.path.join('xkcd', os.path.basename(comicUrl)),
'wb')
for chunk in res.iter_content(100000):
imageFile.write(chunk)
imageFile.close()
# Get the Prev button's url.
prevLink = soup.select('a[rel="prev"]')[0]
url = 'https://xkcd.com' + prevLink.get('href')
print('Done.')
в это время,комиксыизкартинакартинадокументхранилищесуществоватьres
переменнаясередина。тебе нужен Воляэтот些картинакартинаданные Писатьвходитьжесткий дискначальствоиздокументсередина。
тебе нуженодинместныйкартинакартинадокументизимя файла Приходитьперешел кopen()
。comicUrl
Воляесть одиндобрый似В'https://imgs.xkcd.com/comics/heartbleed_explanation.png'
изценить——тывозможный已经Уведомлениеприезжатьэтосмотреть起Приходитьоченькартинаодиндокументпуть。фактначальство,тыдоступныйcomicUrl
вызовos.path.basename()
,это Волявозвращаться URL изнаконецодинчасть'heartbleed_explanation.png'
。Волякартинакартинадержатьприезжатьжесткий дискчас,ты Можетиспользоватьэтотимя файла。тыиспользоватьos.path.join()
Воляэтотимясказатьитыизxkcd
документпапкаизимясказатьсоединять起Приходить,тактыизпрограммасуществовать Windows начальствоиспользоватьобратная косая черта(\
),существовать MacOS и Linux начальствоиспользоватькосая черта(/
)。сейчассуществоватьты终Виметь Понятноимя файла,ты можешьвызовopen()
существовать'wb'
“Писать二Входить制”模式Вниз Открытьодинновыйдокумент。
Помните, что было сказано ранее в этой главе.,хотетьдержатьтыиспользоватьrequests
скачатьиздокумент,вам нужноциклiter_content()
методизвозвращатьсяценить。for
циклсерединаизкод Волякартинакартинаданныекусок(каждыйбольшинство多 100,000 байт)Писатьприезжатьдокументсередина,Затем закройте файл. Картина, как сейчас существует, сохранена на вашем жестком диске.
после,селектор'a[rel="prev"]'
признанный<a>
элемент,Чтоrel
свойствоодеялонастраиватьдляprev
,ты Можетиспользоватьэтот<a>
элементизhref
свойство Приходитьполучатьвпередодинкомиксыиз URL-адрес, URL одеялохранилищесуществоватьurl
середина。Затемwhile
цикл再次начинатьэтоткомиксыизвсе个скачать Проходить程。
Вывод этой программы будет выглядеть следующим образом:
Downloading page https://xkcd.com...
Downloading image https://imgs.xkcd.com/comics/phone_alarm.png...
Downloading page https://xkcd.com/1358/...
Downloading image https://imgs.xkcd.com/comics/nro.png...
Downloading page https://xkcd.com/1357/...
Downloading image https://imgs.xkcd.com/comics/free_speech.png...
Downloading page https://xkcd.com/1356/...
Downloading image https://imgs.xkcd.com/comics/orbital_mechanics.png...
Downloading page https://xkcd.com/1355/...
Downloading image https://imgs.xkcd.com/comics/airplane_message.png...
Downloading page https://xkcd.com/1354/...
Downloading image https://imgs.xkcd.com/comics/heartbleed_explanation.png...
--snip--
Этот проект является хорошим примером,Он может автоматически переходить по ссылкам,отсетьначальствоползти大количестводанные。ты можешьсуществоватьwww.crummy.com/software/BeautifulSoup/bs4/doc
от BeautifulSoup Узнайте о других его возможностях в документации.
Страницы загрузки и перехода по ссылкам являются основой многих программ сканирования сети. Подобная программа также может выполнять следующие задачи:
requests
иbs4
модульочень棒,если бы толькоты能попытаться найтивневам нужноперешел кrequests.get()
из URL。Однакои,иметьчасэтоти Нет Позволять易попытаться найтиприезжать。или ВОЗты хочешьпрограмманавигацияизсеть站хотеть求ты Сначала войдите в систему。selenium
модуль Воля赋予тыизпрограмма Выполнять ХОРОШОнравитьсяэтотсложный Задачаизспособность。
selenium
модульконтроль Браузерselenium
модульпозволять Python проходитьиметь计划地点ударять Связьинаполнять Писать Информация для входа Приходитьпрямойконтроль Браузер,Просто отличнокартинаесть один人добрыйиспользоватьсемьясуществоватьи Страницалапшавзаимодействиеодин样。использоватьselenium
,тыдоступный Сравниватьrequests
иbs4
Гораздо более продвинутыйиз Способивеб-страницаинтерактивный;нопотому чтодляэтозапускать Понятноодинсеть Браузер,Если вам просто нужно скачать Некоторый файлы онлайн,это немного медленно,Трудно существовать, работая в фоновом режиме.
Однако, если вам нужно каким-то образом взаимодействовать с веб-страницей, скажем, положитесь на обновление страницы. JavaScript код,ты Волянуждатьсяхотетьиспользоватьselenium
инетrequests
。этотдапотому чтодля亚马逊等主хотеть电子商务сеть站几乎肯定иметь软件система Приходить识别он们怀疑да收集он们информацияили注册多个бесплатно账семьяиз Скриптиз流количество。Проходитьодин段час间назад,Эти сайты могут отказать вам в предоставлении страницы.,破плохойты制делатьизлюбой Скрипт。selenium
модуль Сравниватьrequests
более вероятносуществоватьэтот些сеть站начальство长期транспорт ХОРОШО。
на сайт“информировать”тытолькосуществоватьиспользовать Скриптизодин主хотетьинформациядапользовательский агентнить,Он идентифицирует веб-браузер и включается во все HTTP-запросы. Например,requests
Модульныйпользовательский агентнитьдобрый似В'python-requests/2.21.0'
。ты можешьдоступодинсеть站нравитьсяwww.whatsmyua.info
Приходить查смотретьтыизпользовательский агентнить。использоватьselenium
,Вы с большей вероятностью «притворитесь человеком»,потому чтодля Неттолько Selenium изпользовательский агентс обычным Браузер(Например'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:65.0) Gecko/20100101 Firefox/65.0'
)такой же,ииэтоиметьтакой жеиз流количество模式:Зависит отselenium
контрольиз Браузервстречакартинаобычно Браузеродин样скачатькартинакартина、рекламировать、Cookies и Вторжение в частную жизньиз跟踪устройство。Однакои,selenium
все еще Однако Можетодеялосеть站检测приезжать,Крупнейшие билетные компаниии电子商务сеть站частовстречащитselenium
контрольиз Браузер,для предотвращения сканирования веб-страниц.
Следующий пример покажет вам, как контролировать Firefox изсеть Браузер。еслитывозвращаться没иметьFirefox,ты можешьотgetfirefox.com
бесплатноскачать。ты Можетпроходитьот Заказ ХОРОШО终端транспорт ХОРОШОpip install --user selenium
Приходить Установитьselenium
。Даже多информация Видетьприложение A 。
дляselenium
导входитьмодульиметь点棘手。вам нужнотранспорт ХОРОШОfrom selenium import webdriver
,инетimport selenium
。(нравитьсяэтотнастраиватьselenium
Модульный确切原потому что超вне Понятно本书изобъем。)после,тыдоступныйselenium
запускатьFirefoxБраузер。существоватьинтерактивный Shell Введите следующее:
>>> from selenium import webdriver
>>> browser = webdriver.Firefox()
>>> type(browser)
<class 'selenium.webdriver.firefox.webdriver.WebDriver'>
>>> browser.get('https://inventwithpython.com')
тывстреча Уведомлениеприезжатькогдаwebdriver.Firefox()
одеяловызовчас,Firefox сеть Браузерзапускать。верноценитьwebdriver.Firefox()
вызовtype()
поверхность明это属ВWebDriver
данныетип。иивызовbrowser.get('https://inventwithpython.com')
Воля Браузер定Кприезжатьinventwithpython.com
。тыиз Браузеротвечать Долженпохоже на картину 12-7 。
картина 12-7:существоватьнассуществовать Mu серединавызовwebdriver.Firefox()
иget()
после,ПоявлятьсяFirefoxБраузер。
еслитысталкиватьсяприезжатьошибкаинформация“geckodriver
可Выполнять ХОРОШОдокументнуждатьсяхотетьсуществоватьPATH
середина”,Таквам нужно Руководствоскачать Firefox изwebdriver
,Затемталантиспользоватьselenium
Приходитьконтроль。еслиты Установить Понятно Браузерводить машинупрограмма,Вы также можете управлять браузерами Firefox, кроме .
конечно в Firefox,идтиmozilla/geckodriver/releases
](https://github.com/mozilla/geckodriver/releases)длятыиз操делатьсистемаскачатьгекконводить машину。(“Gecko”да Firefox Имя используемого движка Браузер. ) например, существовать Windows начальство,тывстреча想хотетьскачатьgeckodriver-v0.24.0-win64.zip
Связь,исуществовать MacOS начальство,тывстреча想хотетьgeckodriver-v0.24.0-macos.tar.gz
Связь。новый Версияиз Связьвстреча略иметь Неттакой же。скачатьиз ZIP документ Воля Включатьодинgeckodriver.exe
(существовать Windows начальство)илиgeckodriver
(существовать MacOS и Linux начальство)документ,ты Может Воляэто放существоватьтыизсистемаPATH
начальство。[приложение B иметь关ВсистемаPATH
изинформация,или ВОЗты можешьсуществоватьstackoverflow.com/q/40208051/1893164
узнать больше。
верно В Chrome,Входитьsites.google.com/a/chromium.org
искачатьтыиз操делатьсистемаиз ZIP документ. этот ZIP документ Воля Включатьодинchromedriver.exe
(существовать Windows начальство)илиchromedriver
(существовать MacOS или Linux начальство)документ,ты можешь Пучокэто放приезжатьтыизсистемаPATH
начальство。
В других крупных сетях Браузер также есть программы сетевых драйверов. Вы можете найти их, выполнив поиск в Интернете по запросу «set driver program» на существующих сайтах.
еслисуществоватьselenium
изконтроль Вниз Открытьновый Браузер Все еще есть проблемы,возможныйдапотому чтодлякогдавперед Версияиз Браузериselenium
модуль Нет兼Позволять。одинрешатьметодда Установитьодин旧Версияизсеть Браузер——или ВОЗДаже Простой地объяснять,Установитьодин旧Версияизselenium
модуль。ты можешьсуществоватьpypi.org/project/selenium/#history
попытаться найтиприезжатьselenium
Версия号Списокповерхность。Нетудачливыйизда,Неттакой же Версияизselenium
и Браузермеждуиз兼Позволять性иметьчасвстречасерединаперерыв,вам может понадобитьсясуществоватьсетьначальство搜索возможныйизрешать方案。приложение A Еще больше о беге PIP Установить конкретную версиюselenium
изинформация。(Например,тывозможныйвстречатранспорт ХОРОШОpip install --user -U selenium==3.14.1
。)
вернослониметьочень多методприди и найди Страницалапшаначальствоизэлемент。это们分дляfind_element_*
иfind_elements_*
Два видаметод。find_element_*
методвозвращатьсяодинокийWebElement
вернослон,поверхность Показывать Страницалапшаначальствосоответствовать Запросизпервыйэлемент。find_elements_*
методдля СтраницалапшаначальствокаждыйсоответствоватьэлементвозвращатьсяодинWebElement_*
вернослон Списокповерхность。
поверхность 12-3 показывать Понятно几个вызовхранилищесуществоватьпеременнаяbrowser
серединаизWebDriver
вернослонизfind_element_*
иfind_elements_*
методизпример。
поверхность 12-3: Selenium изWebDriver
Находитьэлементизметод
имя метода | Возвращает верную поверхность значка/столбца WebElement. |
---|---|
browser.find_element_by_class_name(name), browser.find_elements_by_class_name(name) | Соответствие CSS |
элемент имени класса | |
browser.find_element_by_css_selector(selector) | |
browser.find_elements_by_css_selector(selector) | Соответствие CSS |
Селекторный элемент | |
browser.find_element_by_id(id), browser.find_elements_by_id(id) | соответствовать ID |
элемент значения атрибута | |
browser.find_element_by_link_text(body), browser.find_elements_by_link_text(body) | полностьюсоответствоватьпоставлятьизтекстиз<a>элемент |
browser.find_element_by_partial_link_text(body), browser.find_elements_by_partial_link_text(body) | Обеспечивает включает в себя |
текстиз<a>элемент | |
browser.find_element_by_name(name), browser.find_elements_by_name(name) | соответствоватьимясказать |
элемент значения атрибута | |
browser.find_element_by_tag_name(name) | |
browser.find_elements_by_tag_name(name) | соответствовать Этикеткаимясказатьизэлемент |
(Нет Различать размеры Писать;<a>элементсоответствовать'a'и'A' | |
Кроме*_by_tag_name()
метод,Все параметры метода чувствительны к регистру. Если на странице нет существования, соответствующего тому, которое ищет этот метод,,selenium
модульвстречапричинаодинNoSuchElement
аномальный。еслиты Нетнадеятьсяэтотаномальныйделатьтыизпрограммакрах,существоватьтыизкодсерединадобавить вtry
иexcept
заявление。
как только у тебя будетWebElement
вернослон,ты можешьпроходитьчитатьсвойствоиливызовповерхность 12-4 Подробнее об этом читайте в методе.
поверхность 12-4:WebElement
свойствоиметод
свойствоилиметод | описывать |
---|---|
tag_name | Этикеткаимя,напримеродин<a>элементиз'a' |
get_attribute(name) | Значение атрибута имени элемента |
text | элемент Внутриизтекст,нравиться<span>hello </span>серединаиз'hello' |
clear() | верно Втекст Полеилитекстобластьэлемент,Прозрачныйсуществовать Чтосерединаключвходитьизтекст |
is_displayed() | Возвращает True, если элемент видим, в противном случае возвращает False; |
is_enabled() | верно В输входитьэлемент,Если элемент включен,новозвращатьсяTrue;в противном случаевозвращатьсяFalse |
is_selected() | верно флажок или элемент радиокнопки,Если выбран элемент,новозвращатьсяTrue;в противном случаевозвращатьсяFalse |
location | словарь,поверхность с клавишей 'x'и'y' указывает положение элементасуществовать |
Например, откройте новую вкладку редактора файлов и введите следующую программу:
from selenium import webdriver
browser = webdriver.Firefox()
browser.get('https://inventwithpython.com')
try:
elem = browser.find_element_by_class_name(' cover-thumb')
print('Found <%s> element with that class name!' % (elem.tag_name))
except:
print('Was not able to find an element with that name.')
существоватьздесь,Открываем Firefox и подгоняем его URL. существуют на этой странице,наспытатьсякартинапопытаться найтиприезжатьдобрыйимядля'bookcover'
изэлемент,Если вы найдете такой элемент,насиспользоватьtag_name
свойство打印этоиз Этикеткаимя。если没иметьпопытаться найтиприезжатьтакизэлемент,Мы печатаем другое сообщение.
Программа выведет следующее:
Found <img> element with that class name!
наспопытаться найтиприезжать Понятноодиндобрыйимядля'bookcover'
Этикеткаимядля'img'
изэлемент。
отfind_element_*
иfind_elements_*
методвозвращатьсяизвернослонесть одинclick()
метод,Имитирует щелчок мышью по элементу. Этот метод можно использовать для перехода по ссылке,существовать сделать выбор по переключателю,Нажмите кнопку «Отправить»,или запускает все, что может произойти при щелчке мыши. Например,существоватьинтерактивный Shell Введите следующее:
>>> from selenium import webdriver
>>> browser = webdriver.Firefox()
>>> browser.get('https://inventwithpython.com')
>>> linkElem = browser.find_element_by_link_text('Read Online for Free')
>>> type(linkElem)
<class 'selenium.webdriver.remote.webelement.FirefoxWebElement'>
>>> linkElem.click() # follows the "Read Online for Free" link
Это откроет Firefox приезжатьinventwithpython.com
,получатьстекстRead Online for Free
из<a>
элементизWebElement
вернослон,Затем模拟одинударять那个<a>
элемент。Сразукартинатыс己点ударять Понятно Связьодин样;Затем,Браузер перейдет по ссылке.
Квеб-страницаначальствоизтекст Поле发送ударятьключ Сразудапопытаться найтиприезжать Должентекст Полеиз<input>
или<textarea>
элемент,Затемвызовsend_keys()
метод。Например,существоватьинтерактивный Shell Введите следующее:
>>> from selenium import webdriver
>>> browser = webdriver.Firefox()
>>> browser.get('https://login.metafilter.com')
>>> userElem = browser.find_element_by_id('user_name)
>>> userElem.send_keys('your_real_username_here')
>>> passwordElem = browser.find_element_by_id('user_pass')
>>> passwordElem.send_keys('your_real_password_here')
>>> passwordElem.submit()
если бы только MetaFilter из Авторизоваться Страницалапшасуществовать本书вне版назад没иметь Даже改использоватьсемьяимяипарольтекст Полеизid
,впередлапшаизкод Сразувстречаиспользоватьпоставлятьизтекстзаполните этитекст Поле。(ты Может Следоватьчасиспользовать Браузеризисследоватьустройство Приходитьпроверятьid
。)существоватьлюбойэлементначальствовызовsubmit()
метод Всевстречапроизводитьиодинударять Долженэлемент Местосуществоватьповерхностьодинизпредставлять на рассмотрениекнопкатакой жеизрезультат。(ты Может Простой地вызовemailElem.submit()
,Код будет делать то же самое. )
предупреждать По возможности избегайте помещения паролей в исходный код. Когда ваши пароли хранятся на жестком диске в незашифрованном виде, их легко случайно раскрыть другим. Если возможно, попросите вашу программу подсказать пользователям использовать 8 главасерединаописыватьиз
pyinputplus.inputPassword()
функцияотключ盘输входитьон们изпароль。
selenium
модульесть одиниспользовать Включ盘в соответствии сключизмодуль,Эти ключи не могут вводить строковые значения.,Что功能оченькартинаизменять义Характер符。этот些ценитьхранилищесуществоватьselenium.webdriver.common.keys
Модульныйсвойствосередина。既Однакоэтотдаодиночень长измодульимя,Таксуществоватьпрограммаиз顶отделениетранспорт ХОРОШОfrom selenium.webdriver.common.keys import Keys
Это намного проще;еслитытак Делать Понятно,Такты можешь Простой地существоватьлюбойты通частонуждатьсяхотеть Писатьselenium.webdriver.common.keys
изместо ПисатьKeys
。поверхность 12-5 Списоквне ПонятночастоиспользоватьизKeys
переменная。
поверхность 12-5:selenium.webdriver.common.keys
модульсерединаизчастоиспользоватьпеременная
свойство | значение |
---|---|
Keys.DOWN、Keys.UP、Keys.LEFT、Keys.RIGHT | клавиши со стрелками |
Keys.ENTER,Keys.RETURN | Enter и клавиша возврата |
Keys.HOME、Keys.END、Keys.PAGE_DOWN、Keys.PAGE_UP | HOME、END、Клавиша PAGEDOWN и PAGEUP |
Keys.ESCAPE、Keys.BACK_SPACE、Keys.DELETE | ESC, Backspace, клавиша Del |
Keys.F1,Keys.F2,…,Keys.F12 | Клавиши от F1 до F12 в верхней части клавиатуры. |
Keys.TAB | Клавиша табуляции |
Например,Если курсор в данный момент не находится в текстовом поле,нажиматьHOME
иEND
ключ Волясоответственно Воля Браузерпрокруткаприезжать Страницалапшаиз顶отделениеинижний。существоватьинтерактивный Shell середина Введите следующее,Уведомлениеsend_keys()
вызовданравитьсячтопрокрутка Страницалапшаиз:
>>> from selenium import webdriver
>>> from selenium.webdriver.common.keys import Keys
>>> browser = webdriver.Firefox()
>>> browser.get('https://nostarch.com')
>>> htmlElem = browser.find_element_by_tag_name('html')
>>> htmlElem.send_keys(Keys.END) # scrolls to bottom
>>> htmlElem.send_keys(Keys.HOME) # scrolls to top
Этикетка<html>
да HTML Основные теги в файлах: HTML. документизвсе Внутри Позволять Все Включатьсуществовать Этикетка<html>
и</html>
середина。вызовbrowser.find_element_by_tag_name('html')
да К通использоватьвеб-страница发送ключиз好место。Например,Если при прокрутке страницы вниз появляется новый контент,Это будет очень полезно.
selenium
модультакже Можетпроходитьк Внизметодимитировать щелчок Различный Браузеркнопка:
browser.back()
点ударятьвозвращатьсякнопка。
browser.forward()
点ударятьвперед Входитькнопка。
browser.refresh()
点ударять刷новый/Тяжелыйновыйнагрузкакнопка。
browser.quit()
点ударятьзакрытие窗口кнопка。
Selenium умеет гораздо больше, помимо функций здесь описывать. Он может изменить ваш Браузер Файлы cookie, захват веб-страниц, запуск настройки JavaScript。хотеть Понятно解этот些特性из Даже多информация,ты Можетдоступ Кусочек Вselenium-python.readthedocs.org
издокумент。
большинствочислоскучныйиз Задачаи Нетограничения Вты电脑начальствоиздокумент。можетккомпилировать程Способскачатьвеб-страницавстреча Волятыизпрограмма Расширятьприезжать互联сеть。requests
модульделатьскачать变得Простой,С базовыми знаниями концепций HTML,ты Сразу МожетвыгодаиспользоватьBeautifulSoup
модуль Приходитьанализироватьтыскачатьиз Страницалапша。
нохотетьполностьюавтоматизациялюбойбаза Всетьиз Задача,вам нужнопроходитьselenium
модульпрямойконтрольтыизсеть Браузер。selenium
модуль Воляпозволятьты Авторизоватьсясеть站ис动наполнять Писатьповерхностьсетка。потому чтодля Web Браузер — это наиболее распространенный способ отправки и получения сообщений через Интернет, поэтому это важная функция, которую необходимо иметь в наборе инструментов вашей программы.
webbrowser
、requests
、bs4
иselenium
модульмеждуизразница。
requests.get()
возвращаться Чтотипизвернослон?нравитьсячтокнитьценитьиз形式доступскачатьиз Внутри Позволять?
requests
методисследоватьскачать Работа?
requests
ответиз HTTP Код состояния?
requests
ответдержатьприезжатьдокументсередина?
main
изэлемент?
highlight
изэлементиз CSS Что такое селектор строк?
<div>
элементсерединапопытаться найтиприезжатьвсе<div>
элементиз CSS Что такое селектор строк?
favorite
из<button>
элементиз CSS Что такое селектор строк?
Tag
вернослонхранилищесуществоватьэлемент<div>Hello, world!</div>
изпеременнаяspam
середина。тынравитьсячтоотTag
вернослонсерединаполучатьодиннить'Hello, world!'
?
Tag
вернослонизвсесвойствохранилищесуществовать Человек по имениlinkElem
изпеременнаясередина?
import selenium
Нет ХОРОШО。нравитьсячтотолько确导входитьselenium
модуль?
find_element_*
иfind_elements_*
методиметь Чторазница?
WebElement
вернослониметь哪些Имитировать щелчок мышьюиключ盘в соответствии сключизметод?
WebElement
вернослонначальствовызовsend_keys(Keys.ENTER)
,ноиспользоватьselenium
представлять на рассмотрениеповерхностьодиниметь Что Даже Простойизметод Шерстяная ткань?
selenium
имитировать щелчок Браузеризвперед Входить、Назад、Кнопка «Обновить»?Для практики напишите программу, решающую следующие задачи.
Написать программу,существуют Получить адрес электронной почты и текстовую строку в командной строке,Затемиспользоватьselenium
Авторизоватьсяприезжатьтыиз电子邮件帐семья,и отправляет строковое электронное письмо на указанный адрес. (Для этого вам может потребоваться настроить отдельную учетную запись электронной почты.)
Это отличный способ добавить уведомления в ваше приложение. Вы также можете написать что-то вроде программы на Facebook или Twitter. Аккаунт отправляет информацию.
Напишите программу, которая ссылается на что-то вроде Flickr или Imgur.,Поиск категории фотографий,Затем загрузите все полученные изображения изображений. Вы можете написать программу,Можно запустить на любом веб-сайте с фотографиями для планшетов, имеющем функцию поиска.
2048
Это простая игра,Вы можете комбинировать блоки, проводя вверх, вниз, влево и вправо. Проведя пальцем вверх, вправо, вниз и влево снова и снова,Вы действительно можете получить довольно высокий балл. Написать программу,Волясуществоватьgabrielecirulli.github.io/2048
Откройте игру,и продолжайте нажимать клавиши вверх, вправо, вниз и влево,чтобы запустить игру автоматически.
Написать программу, имея веб-страницу URL, попытается загрузить каждую связанную страницу на этой странице. Программа должна пометить что-нибудь знаком «404». Не найден» и печатает его как неработающую ссылку.