Руководство по автоматизации Python (автоматизация утомительной работы), второе издание: 12. Веб-сканирование
Руководство по автоматизации Python (автоматизация утомительной работы), второе издание: 12. Веб-сканирование

оригинальный:https://automatetheboringstuff.com/2e/chapter12/ среди тех, у кого нет Wi-Fi Один из тех редких и пугающих моментов, когда я понимаю, как много из того, что я делаю на компьютере, я делаю в Интернете. По чистой привычке я пытался проверить свою электронную почту, прочитать сообщения друзей. Twitter информацию или ответьте на вопрос: «Кертвуд Смит играет главную роль в 1987 Были ли до него в оригинальном «Робокопе» какие-то главные персонажи? " [1]

Поскольку многие Работа на компьютере предполагает серфинг в Интернете.,если твойпрограмма Было бы здорово иметь доступ к Интернету。захват сетидаиспользоватьпрограммаотсетьскачатьи Терминология для работы с контентом。Например,Google запускает множество сетевых сканеров,Индексируйте веб-страницы для своих поисковых систем. В этой главе существуют,Вы изучите несколько модулей,Эти модули позволяют использовать Python Парсинг веб-страниц становится простым.

WebbrowserPython поставляется вместе с ним и открывает браузер для входа на определенную страницу.

Запрос из Интернета на загрузку файлов и веб-страниц.

bs4анализировать HTML, формат для написания веб-страниц.

seleniumЗапускайте и управляйтесеть Браузер。seleniumмодуль можетсуществоватьэтот Браузер Заполнятьповерхностьсеткаи Имитировать щелчок мышью。

проект:сwebbrowserМодульныйmapIt.py

webbrowserМодульныйopen()функция может начать новую Браузерк указанному URL-адрес. в интерактивном Shell Введите следующее:

Язык кода:javascript
копировать
>>> import webbrowser
>>> webbrowser.open('https://inventwithpython.com/')

веб-страница Браузер Этикеткаоткроется по URLinventwithpython.com。Это, вероятно,даwebbrowserЕдинственное, что может сделать модуль。несмотря на это,open()Функция позволяет Некоторыйинтересные вещи становятся возможными。Например,Сохраните адрес, скопировать в буфер обмена,Затем существующие Google Maps изображение показывает его местоположение.,Это очень скучная вещь. Вы можете автоматически запускать содержимое буфера обмена, написав простой скрипт.,от И выполните это задание. так,Вам просто нужно скопировать адрес копировать в буфер обмена и запустить скрипт.,Картина места сделает это за вас.

*Вот что делает ваша программа:

  1. из аргументов командной строки или буфера обмена, чтобы получить почтовый адрес
  2. Открыть сеть Браузер,Перейдите на страницу Google Maps, чтобы узнать адрес.

Это означает, что ваш код должен делать следующее:

  1. отsys.argvПрочитайте параметры командной строки в。
  2. Прочитайте содержимое буфера обмена.
  3. вызовwebbrowser.open()функция Открыть сеть Браузер。

Открыть новую вкладку редактора файлов,и сохраните его какmapIt.py

Шаг 1. Определите URL-адрес

Согласно приложению B Описание в,настраиватьmapIt.py,Таким образом, когда вы запускаете его из командной строки,Вот так…

Язык кода:javascript
копировать
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давы хотите нанести на картуизадрес)。

Шаг 2. Обработка параметров командной строки

Сделайте свой код таким:

Язык кода:javascript
копировать
#! 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переменнаясередина。

Если вы введете следующую команду в командной строке для запуска программы…

Язык кода:javascript
копировать
mapit 870 Valencia St, San Francisco, CA 94110

sys.argvпеременная Воля Включатьэтот Списокповерхностьценить:

Язык кода:javascript
копировать
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']

addressПеременная будет содержать строку'870 Valencia St, San Francisco, CA 94110'

Шаг 3. Обработайте содержимое буфера обмена и запустите браузер.

Сделайте свой код таким:

Язык кода:javascript
копировать
#! 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получить землюкартина

Получите карту вручную:

  1. Выделить адрес
  2. копироватьадрес
  3. Открыть Браузер
  4. изменятьприезжатьhttps://maps.google.com/
  5. Нажмите на текстовое поле адреса.
  6. Вставить адрес
  7. Входить

использоватьmapIt.py

  1. Выделить адрес
  2. копироватьадрес
  3. транспорт ХОРОШОmapIt.py

взгляниmapIt.pyнравиться Как сделать эту задачу Нет Такскучный?

Похожие идеи программ

если бы только У вас есть сайт,webbrowserмодульмогу позволитьиспользовать Провинция Хуидти Открыть Браузеризшаг,Перейдите непосредственно на веб-сайт. Другая программа может использовать эту функцию для выполнения следующих задач:

  • существуют Открывать все ссылки на странице в отдельных вкладках Браузера.
  • Открыть Браузер,Найдите URL-адрес местной погоды.
  • Откройте несколько сайтов социальных сетей, которые вы часто посещаете.

использоватьrequestsмодульотсетьскачатьдокумент

requestsмодульоблегчи тебе задачуотсетьскачатьдокумент,и Нет Должен беспокоитьсясетьошибка、Проблемы с подключением, сжатием данных и другие сложные вопросы. Питон Не предусмотреноrequestsмодуль,Поэтому сначала вам придется установить его. из командной строки,транспорт ХОРОШО PIP Установка — по запросу пользователя. (приложение A Подробнее о том, как устанавливать сторонние модули, читайте здесь. )

Писатьrequestsмодульдапотому чтодля Python изurllib2модульслишком сложно,Непрост в использовании. фактически,использовать记号笔Пучокэтотодинвсе段涂掉。Забыл, что когда-либо упоминалприезжать Проходитьurllib2。если тебе нужноотсетьскачатьвещь,Толькоиспользоватьrequestsмодуль。

Следующий,Делатьодин Простойизтест Приходитьубеждатьсяrequestsмодуль Правильная установка。существоватьинтерактивный Shell Введите следующее:

Язык кода:javascript
копировать
>>> import requests

Если сообщение об ошибке не отображается,ноrequestsмодуль Установлен успешно。

использоватьrequests.get()функцияскачатьвеб-страница

requests.get()функцияприниматьодин URL нить Входить ХОРОШОскачать。проходитьверноrequests.get()извозвращатьсяценитьвызовtype(),ты Можетсмотретьприезжатьэтовозвращаться ПонятноодинResponseвернослон,Чтосередина Включать Web сервервернотыизпожалуйста求данныйизответ。Я объясню это более подробно позжеResponseвернослон,носейчассуществовать,Когда ваш компьютер подключен к Интернету,существоватьинтерактивный Shell Введите следующее:

Язык кода:javascript
копировать
   >>> 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 Введите следующее:

Язык кода:javascript
копировать
>>> 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()ХОРОШОПриходитьиметь дело сэтотошибка Состояниеи Нетвстречакрах。

Язык кода:javascript
копировать
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()методвызовпривести кпрограмма Выведите следующее:

Язык кода:javascript
копировать
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цикл。

Язык кода:javascript
копировать
>>> 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 байты.

Напомним, вот полный процесс загрузки и сохранения файла:

  1. вызовrequests.get()скачатьдокумент。
  2. использовать'wb'вызовopen()к Писать二Входить制模式создаватьодинновыйдокумент。
  3. цикл ТраверсResponseвернослонизiter_content()метод。
  4. существоватькаждая итерациясерединавызовwrite()Воля Внутри Позволять Писатьвходитьдокумент。
  5. вызовclose()закрытиедокумент。

этот СразудаrequestsМодульныйвсе Внутри Позволять!итыодин直использовать Приходитькомпилировать Писатьтекстдокументизopen() / write() / close()Работапоток по сравнению с,forциклиiter_content()извещьвозможныйсмотреть起Приходитьсложный,但этотдадля Понятноубеждатьсяrequestsмодуль Нетвстречазаниматьиспользоватьслишком Внутрижить,即делатьтыскачать Понятно大количестводокумент。ты можешьотrequests.readthedocs.orgсередина Понятно解requestsМодульный Что Другие характеристики。

HTML

Прежде чем выбрать веб-страницу, вы узнаете некоторые HTML базовые знания. Вы также увидите, как получить доступ Web Мощные инструменты разработки Браузера, которые позволят Web Получение информации становится проще.

Ресурсы для изучения HTML

Язык гипертекстовой разметки (HTML) Это формат, в котором пишутся веб-страницы. В этой главе предполагается, что вы заинтересованы в HTML Есть некоторый базовый опыт, но если вам нужен учебник для начинающих, я рекомендую вам перейти на следующий сайт:

Быстрый обзор

Если вы давно не смотрели это HTML Хорошо, вот краткий обзор основ. HTML документдасhtmlдокумент Расширятьимяизчистыйтекстдокумент。этот些документсерединаизтекст Зависит отЭтикеткаокружать,Эти теги представляют собой слова, заключенные в угловые скобки. Теги сообщают Браузеру, как форматировать веб-страницу. Начальный и конечный тег могут содержать текст Некоторый,формаэлементтекст(илиВнутренний HTML ) — это содержимое между открывающим и закрывающим тегами. Например, следующее HTML встречасуществовать БраузерсерединапоказыватьHello, world,HelloСмелый:

Язык кода:javascript
копировать
<strong>Hello</strong>, world!

В браузере этот HTML-код будет выглядеть так, как показано на рисунке 12-1.

картина 12-1: существовать Браузерсерединарендерингиз<strong>Hello</strong>, world!

начинатьиз<strong>Этикеткаповерхность Показывать Включатьизтекстбудет выделено жирным шрифтом。Заканчивать Этикетка Рассказывать Браузер Смелыйтекстиз Заканчивать Расположение。

HTML серединаиметь许多Неттакой жеиз Этикетка。Чтосередина Некоторый Этикеткасуществоватьугловые скобки Внутрииметь额外изсвойство,Формасвойство。Например,<a>Этикетка Включать Понятноотвечать Долженда Связьизтекст。текст Связьприезжатьиз URL Зависит отhrefсвойство Решать。здесьесть одинпример:

Язык кода:javascript
копировать
Al's free <a href="https://inventwithpython.com">Python books</a>.

В браузере это HTML похоже на картину 12-2 。

картина 12-2: Ссылки, отображаемые в браузере

некоторыйэлементесть одинidсвойство,использовать Приходить惟один地标识Страницалапшасерединаизэлемент。тычастовстреча指Показыватьтыизпрограммапроходитьэлементизidсвойствоприди и найдиэлемент,потому чтоэтотиспользовать Браузеризразвиватьинструмент Приходитьвычислитьэлементизidсвойстводакомпилировать Писать Web Общие задачи для сканеров.

Просмотр исходного HTML-кода веб-страницы

Вам необходимо проверить веб-страницу, которую будет использовать ваша программа. 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 Вероятность будет меньше.

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

Найдите элементы HTML с помощью инструментов разработчика

один旦тыизпрограммаиспользовать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модульанализировать HTML

BeautifulSoup это от HTML Модуль извлечения информации со страницы (существовать в этом плане гораздо лучше обычного выражения поверхности). Красивая Суп Модульныйимя Слово называетсяbs4(BeautifulSoup,4-е издание). чтобы установить его,тебе нуженот Заказ ХОРОШОтранспорт ХОРОШОpip install --user beautifulsoup4。(查смотретьприложение A Понятно解Установить第三方Модульныйиллюстрировать。)иbeautifulsoup4даиспользовать ВУстановитьизимя Характер,Чтобы импортировать BeautifulSoup тытранспорт ХОРОШОimport bs4

Для этой главы BeautifulSoup В основе будет проанализирован HTML-файл. Откройте новую вкладку редактора файлов в Mu.,Введите следующее,сохранить какexample.html。или ВОЗ,отnostarch.com/automatestuff2скачать。

Язык кода:javascript
копировать
<!-- 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 Стало намного проще.

от HTML создаватьодинBeautifulSoupвернослон

Нужно включить, он будет анализировать HTML изнить Приходитьвызовbs4.BeautifulSoup()функция。bs4.BeautifulSoup()функциявозвращатьсяодинBeautifulSoupвернослон。когдатыизвычислить机соединятьприезжать互联сетьчас,существоватьинтерактивный Shell Введите следующее:

Язык кода:javascript
копировать
>>> 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документсуществовать Работа Оглавлениесерединапосле):

Язык кода:javascript
копировать
>>> 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 Введите следующее:

Язык кода:javascript
копировать
>>> 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 Введите следующее:

Язык кода:javascript
копировать
>>> 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 Введите следующее:

Язык кода:javascript
копировать
>>> 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 Часто предпринимайте шаги, чтобы затруднить сканирование страниц результатов поиска.

Вот что делает ваша программа:

  1. Получить ключевые слова для поиска из параметров командной строки
  2. Получить страницу результатов поиска
  3. Откройте вкладку Браузер для каждого результата

Это означает, что ваш код должен делать следующее:

  1. отsys.argvПрочитайте параметры командной строки в。
  2. использоватьrequestsмодульполучать Результаты поиска Страницалапша。
  3. Найдите ссылку для каждого результата поиска.
  4. вызовwebbrowser.open()функция Открыть сеть Браузер。

Открыть новую вкладку редактора файлов,Воля Что Другойжитьдляsearchpypi.py

Шаг 1. Получите параметры командной строки и запросите страницу поиска.

существовать до написания любого кода,Сначала вам нужно знать URL-адрес страницы результатов поиска. Посмотреть адресную строку Браузера после поиска,Можетсмотретьприезжатьрезультат Страницалапшаесть одиндобрый似Вpypi.org/search/?q=<SEARCH_TERM_HERE>изURL-адрес。модуль Можетскачатьэтот Страницалапша,Затем вы можете найти ссылку на результат поиска в использовании BeautifulSoup существующего HTML. наконец,ты Воляиспользоватьwebbrowserмодульсуществовать Браузер Этикеткасередина Открытьэтот些Связь。

Сделайте свой код таким:

Язык кода:javascript
копировать
#! 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из Списокповерхностьсередина。

Шаг 2: Найдите все результаты

сейчассуществоватьвам нужноиспользовать BeautifulSoup от Вы скачали HTML серединаизвлекать排имя靠впередиз Результаты поиска Связь。нотынравитьсячтодляэтот项Работапопытаться найтиприезжатьподходящийиз人выбирать Шерстяная ткань?Например,ты Нет能Только搜索всеиз<a>Этикетка,Потому что в HTML существует множество ссылок, которые вас не волнуют. Напротив,Вы должны проверить страницу результатов поиска, используя инструменты разработчика Браузера.,Попробуйте картинунайти селектор,Выбирайте только те ссылки, которые вам нужны.

Поиск завершен BeautifulSoup После этого вы можете открыть инструменты разработчика вашего браузера.,Просмотрите элемент ссылки Некоторый на странице. они выглядят сложными,Такая страница.

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

Сделайте свой код таким:

Язык кода:javascript
копировать
#! 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()。программаиз Что Оставатьсячастьвсе еще Волядабольшинствоновыйиз。

Шаг 3. Откройте веб-браузер, чтобы просмотреть каждый результат.

Наконец, мы сообщим программе открыть вкладку веб-браузера для наших результатов. Добавьте в конец программы следующее:

Язык кода:javascript
копировать
#! 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 Узнайте, как легко запустить программу в вашей операционной системе. )

Похожие идеи программ

Этикетка式Просматриватьизвыгодадаты можешьочень Позволять易地существоватьновый Этикеткасередина Открыть Связь,для дальнейшего чтения. Программа, которая автоматически открывает несколько ссылок одновременно, может быть хорошим способом сделать следующее:

  • существуют После поиска на Amazon и других торговых сайтах,Откройте все страницы продукта.
  • Откройте все ссылки для одного обзора продукта.
  • существовать Flickr или Imgur Выполнив поиск на фотосайте, откройте полученную ссылку на фотографию.

Проект: Скачать все комиксы XKCD.

Блоги и другие регулярно обновляемые веб-сайты обычно имеют домашнюю страницу.,Выше есть недавние статьи,Также есть кнопка предыдущей страницы.,Могу перейти к предыдущей статье. Тогда в этом посте также будет кнопка «Предыдущая страница».,и так далее,Создайте трек от самой последней страницы до первой публикации на сайте. Если вы хотите получить копию содержимого веб-сайта,Чтоб не существовало существование читать в сети,Вы можете просматривать каждую страницу вручную и сохранять каждую страницу. Но это довольно скучно,Итак, давайте вместо него напишем программу.

XKCD — популярная компьютерная сетькомиксы, чей сайт соответствует этой структуре (см. изображение 12-6 )。xkcd.comиз首Страницаесть один“начальствоодин Страница”кнопка,Верните пользователя к предыдущим комиксам. Загрузка каждого комикса вручную может занять много времени.,ноты можешь Писатьодин Скриптсуществоватьнесколько минут Внутри Заканчивать。

картина 12-6: XKCD,“романтический、Сатира、Сетькомиксы «Математика и язык».

Ваша программа делает это:

  1. Загрузить домашнюю страницу XKCD
  2. Сохраните изображение комиксыкартина на этой странице.
  3. Перейдите по ссылке на комикс выше.
  4. Повторяйте, пока не дойдете до первого комикса.

Это означает, что ваш код должен делать следующее:

  1. использоватьrequestsмодульскачать Страницалапша。
  2. использовать BeautifulSoup Находить Страницалапшакомиксыкартинакартинаиз URL。
  3. использоватьiter_content()Волякомиксыкартинакартинаскачатьидержатьприезжатьжесткий диск。
  4. Найдите URL-адрес предыдущей ссылки на комикс и повторите.

Открытьодинновыйиздокументкомпилировать辑устройство Этикетка,сохранить какdownloadXkcd.py

Шаг 1: Разработайте программу

Если вы откроете инструменты разработчика вашего браузера и осмотрите элементы на странице, вы обнаружите следующее:

  • комиксыкартинакак файл URL Зависит отодин<img>элементизhrefсвойстводанный。
  • <img>элемент Кусочек В<div id="comic">элемент Внутриотделение。
  • Prev кнопкаесть одинценитьдляprevизrel HTML свойство。
  • первыйкомиксыиз“начальствоодин Страница”кнопка Связьприезжатьxkcd.comURL-адрес,поверхность означает, что предыдущих страниц больше нет.

Сделайте свой код таким:

Язык кода:javascript
копировать
#! 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关ключ Характерженьшеньчислопредотвращатьфункциясуществоватьэтотдокументпапка已经житьсуществоватьиз Состояние Вниз抛внеаномальный。оставатьсяизкод Толькода Обзорпрограмма Что Оставатьсячастьиз Комментарий。

Шаг 2. Загрузите веб-страницу.

Давайте реализуем код страницы загрузки. Сделайте свой код таким:

Язык кода:javascript
копировать
#! 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вернослон。

Шаг третий: найдите и загрузите изображения комиксов

Сделайте свой код таким:

Язык кода:javascript
копировать
#! 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()кскачатькомиксыизкартинакартинадокумент。

Шаг 4: Сохраните изображение и найдите предыдущий комикс.

Сделайте свой код таким:

Язык кода:javascript
копировать
#! 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цикл再次начинатьэтоткомиксыизвсе个скачать Проходить程。

Вывод этой программы будет выглядеть следующим образом:

Язык кода:javascript
копировать
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контрольиз Браузер,для предотвращения сканирования веб-страниц.

Запустите Selenium для управления браузером

Следующий пример покажет вам, как контролировать Firefox изсеть Браузер。еслитывозвращаться没иметьFirefox,ты можешьотgetfirefox.comбесплатноскачать。ты Можетпроходитьот Заказ ХОРОШО终端транспорт ХОРОШОpip install --user seleniumПриходить Установитьselenium。Даже多информация Видетьприложение A 。

дляselenium导входитьмодульиметь点棘手。вам нужнотранспорт ХОРОШОfrom selenium import webdriver,инетimport selenium。(нравитьсяэтотнастраиватьseleniumМодульный确切原потому что超вне Понятно本书изобъем。)после,тыдоступныйseleniumзапускатьFirefoxБраузер。существоватьинтерактивный Shell Введите следующее:

Язык кода:javascript
копировать
>>> 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-4WebElementсвойствоиметод

свойствоилиметод

описывать

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' указывает положение элементасуществовать

Например, откройте новую вкладку редактора файлов и введите следующую программу:

Язык кода:javascript
копировать
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свойство打印этоиз Этикеткаимя。если没иметьпопытаться найтиприезжатьтакизэлемент,Мы печатаем другое сообщение.

Программа выведет следующее:

Язык кода:javascript
копировать
Found <img> element with that class name!

наспопытаться найтиприезжать Понятноодиндобрыйимядля'bookcover'Этикеткаимядля'img'изэлемент。

нажмите на страницу

отfind_element_*иfind_elements_*методвозвращатьсяизвернослонесть одинclick()метод,Имитирует щелчок мышью по элементу. Этот метод можно использовать для перехода по ссылке,существовать сделать выбор по переключателю,Нажмите кнопку «Отправить»,или запускает все, что может произойти при щелчке мыши. Например,существоватьинтерактивный Shell Введите следующее:

Язык кода:javascript
копировать
>>> 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 Введите следующее:

Язык кода:javascript
копировать
>>> 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-5selenium.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()вызовданравитьсячтопрокрутка Страницалапшаиз:

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

Практические вопросы

  1. краткийописыватьwebbrowserrequestsbs4иseleniumмодульмеждуизразница。
  2. requests.get()возвращаться Чтотипизвернослон?нравитьсячтокнитьценитьиз形式доступскачатьиз Внутри Позволять?
  3. Чтоrequestsметодисследоватьскачать Работа?
  4. нравитьсячто获得одинrequestsответиз HTTP Код состояния?
  5. нравитьсячто Воляrequestsответдержатьприезжатьдокументсередина?
  6. Какое сочетание клавиш используется для открытия инструмента Браузер Разработчик?
  7. Как просмотреть конкретный элемент на веб-странице (инструмент «Существовать Разработчик») HTML?
  8. какой CSS селекторнить Можетпопытаться найтиприезжатьсвойстводляmainизэлемент?
  9. Находить CSS добрыйдляhighlightизэлементиз CSS Что такое селектор строк?
  10. существовать Другойодин<div>элементсерединапопытаться найтиприезжатьвсе<div>элементиз CSS Что такое селектор строк?
  11. Находитьсвойствонастраиватьдляfavoriteиз<button>элементиз CSS Что такое селектор строк?
  12. гипотезатыесть одинсимпатичныйиз СупTagвернослонхранилищесуществоватьэлемент<div>Hello, world!</div>изпеременнаяspamсередина。тынравитьсячтоотTagвернослонсерединаполучатьодиннить'Hello, world!'
  13. как конвертировать BeautifulSoup Tagвернослонизвсесвойствохранилищесуществовать Человек по имениlinkElemизпеременнаясередина?
  14. бегатьimport seleniumНет ХОРОШО。нравитьсячтотолько确导входитьseleniumмодуль?
  15. find_element_*иfind_elements_*методиметь Чторазница?
  16. Selenium изWebElementвернослониметь哪些Имитировать щелчок мышьюиключ盘в соответствии сключизметод?
  17. ты Можетсуществоватьпредставлять на рассмотрениекнопкаизWebElementвернослонначальствовызовsend_keys(Keys.ENTER),ноиспользоватьseleniumпредставлять на рассмотрениеповерхностьодиниметь Что Даже Простойизметод Шерстяная ткань?
  18. нравитьсячтоиспользоватьseleniumимитировать щелчок Браузеризвперед Входить、Назад、Кнопка «Обновить»?

Практические проекты

Для практики напишите программу, решающую следующие задачи.

Почтовый ящик командной строки

Написать программу,существуют Получить адрес электронной почты и текстовую строку в командной строке,ЗатемиспользоватьseleniumАвторизоватьсяприезжатьтыиз电子邮件帐семья,и отправляет строковое электронное письмо на указанный адрес. (Для этого вам может потребоваться настроить отдельную учетную запись электронной почты.)

Это отличный способ добавить уведомления в ваше приложение. Вы также можете написать что-то вроде программы на Facebook или Twitter. Аккаунт отправляет информацию.

Загрузчик изображений с веб-сайта

Напишите программу, которая ссылается на что-то вроде Flickr или Imgur.,Поиск категории фотографий,Затем загрузите все полученные изображения изображений. Вы можете написать программу,Можно запустить на любом веб-сайте с фотографиями для планшетов, имеющем функцию поиска.

2048

Это простая игра,Вы можете комбинировать блоки, проводя вверх, вниз, влево и вправо. Проведя пальцем вверх, вправо, вниз и влево снова и снова,Вы действительно можете получить довольно высокий балл. Написать программу,Волясуществоватьgabrielecirulli.github.io/2048Откройте игру,и продолжайте нажимать клавиши вверх, вправо, вниз и влево,чтобы запустить игру автоматически.

Проверка ссылки

Написать программу, имея веб-страницу URL, попытается загрузить каждую связанную страницу на этой странице. Программа должна пометить что-нибудь знаком «404». Не найден» и печатает его как неработающую ссылку.

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose