Рубрики
Без рубрики

Примеры Соскабливания Паутины

В этом руководстве по веб-скребку Python вы узнаете библиотеку Beautifulsoup на примерах, скребок JavaScript с помощью Selenium, запуск и использование Chrome webdriver с Selenium, обработку вызовов Ajax и ожидание его…

Автор оригинала: LikeGeeks.

В этом уроке мы поговорим о Python web scraping и о том, как очищать веб-страницы с помощью нескольких библиотек Python scraping, таких как Beautifulsoup, Selenium и некоторых других волшебных инструментов, таких как PhantomJS.

Вы узнаете, как очищать статические веб-страницы, динамические страницы (загруженный Ajax контент), iframes, получать конкретные HTML-элементы, как обрабатывать файлы cookie и многое другое.

Что такое Python Web Scraping

Веб-скребок обычно представляет собой процесс извлечения данных из Интернета, вы можете анализировать данные и извлекать полезную информацию

Кроме того, вы можете хранить очищенные данные в базе данных или любом табличном формате, таком как CSV, XLS и т. Д., Чтобы легко получить доступ к этой информации.

Очищенные данные могут быть переданы в библиотеку типа NLTK для дальнейшей обработки, чтобы понять, о чем идет речь на странице.

Короче говоря, веб-скребок-это загрузка веб-данных в удобочитаемом формате, чтобы вы могли извлечь из них выгоду.

Преимущества веб-скребка

Вы можете задаться вопросом, почему я должен скрести Интернет, и у меня есть Google? Ну, мы здесь не изобретаем велосипед. Веб-скребок предназначен не только для создания поисковых систем.

Вы можете очистить веб-страницы вашего конкурента, проанализировать данные и посмотреть, какими продуктами довольны клиенты вашего конкурента, исходя из их ответов. Все это БЕСПЛАТНО.

Успешный SEO-инструмент, такой как Moz, который обрывает и обходит всю сеть и обрабатывает данные для вас, чтобы вы могли видеть интерес людей и как конкурировать с другими в вашей области, чтобы быть на вершине.

Это всего лишь несколько простых способов использования веб-скребка. Соскобленные данные означают зарабатывание денег .

Установите Beautifulsoup

Я предполагаю , что у вас есть некоторый фон в Python basics , поэтому давайте установим нашу первую библиотеку веб-скребков Python, которая является BeautifulSoup.

Чтобы установить Beautifulsoup, вы можете использовать pip или вы можете установить его из источника .

Я установлю его с помощью pip вот так:

$ pip install beautifulsoup4

Чтобы проверить, установлен он или нет, откройте редактор и введите следующее:

из bs4 import BeautifulSoup

Тогда запустите его:

$ python myfile.py

Если он работает без ошибок, это означает, что BeautifulSoup установлен успешно. Теперь давайте посмотрим, как использовать Beautifulsoup.

Ваш Первый Скребок для Паутины

Взгляните на этот простой пример, мы извлекем заголовок страницы с помощью BeautifulSoup:

from urllib.request import urlopen from bs4 import BeautifulSoup(“https://www.python.org/”)(html.read(),”html5lib”); print(res.title)

||

из urllib.request import urlopen

из bs4 import BeautifulSoup

html(“http://www.python.org/”)

res(html.read(),”html5lib”);

|

В результате получается:

Мы используем библиотеку urlopen для подключения к нужной нам веб-странице, а затем читаем возвращенный HTML-код с помощью метода html.read ().

Возвращаемый HTML-код преобразуется в объект BeautifulSoup, имеющий иерархическую структуру.

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

Обработка исключений HTTP

По любой причине urlopen может вернуть ошибку. Это может быть 404, если страница не найдена, или 500, если есть внутренняя ошибка сервера, поэтому нам нужно избежать сбоя скрипта, используя обработку исключений, подобную этой:

from urllib.request import urlopen from urllib.error import HTTPError from bs4 import BeautifulSoup try:(“https://www.python.org/”) кроме HTTPError как e: print(e) else:(html.read(),”html5lib”) print(res.title)

|

|

из urllib.request import urlopen

из urllib.error import HTTPError

из bs4 import BeautifulSoup

(“https://www.python.org/”)

(html.read(),”html5lib”)

|

Отлично, а что, если сервер не работает или вы неправильно ввели домен?

Обработка исключений URL-адресов

Мы также должны справиться с такого рода исключениями. Это исключение-URLError, поэтому наш код будет выглядеть следующим образом:

from urllib.request import urlopen from urllib.error import HTTPError from urllib.error import URLError from bs4 import BeautifulSoup try:(“https://www.python.org/”) кроме HTTPError как e: print(e) кроме URLError: print(“Сервер не работает или неправильный домен”) else:(html.read(),”html5lib”) print(res.titles)

|

|

из urllib.request import urlopen

из urllib.error import HTTPError

из urllib.error import URLError

из bs4 import BeautifulSoup

(“https://www.python.org/”)

print(“Сервер не работает или неправильный домен”)

(html.read(),”html5lib”)

|

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

Это можно сделать с помощью простого оператора if, подобного этому:

from urllib.request import urlopen from urllib.error import HTTPError from urllib.error import URLError from bs4 import BeautifulSoup try:(“https://www.python.org/”) кроме HTTPError как e: print(e) кроме URLError: print(“Сервер не работает или неправильный домен”) else:(html.read(),”html5lib”) if res.title is None: print(“Тег не найден”) else: print(res.title)

|

|

из urllib.request import urlopen

из urllib.error import HTTPError

из urllib.error import URLError

из bs4 import BeautifulSoup

(“https://www.python.org/”)

print(“Сервер не работает или неправильный домен”)

(html.read(),”html5lib”)

|

Отлично, наш скребок делает хорошую работу. Теперь и мы можем соскрести всю страницу целиком или соскрести определенный тег.

а как насчет более глубокой охоты?

Очистите HTML-теги с помощью атрибута Класса

Теперь давайте попробуем быть избирательными, очистив некоторые HTML-элементы на основе их CSS-классов.

Объект Beautifulsoup имеет функцию findAll, которая извлекает или фильтрует элементы на основе их атрибутов

Мы можем отфильтровать все элементы h3, класс которых является “post-title”, следующим образом:

tags.findAll(“h3”, {“class”: “post-title”})

Затем мы можем использовать цикл for для итерации по ним и делать с ними все, что угодно.

Таким образом, наш код будет выглядеть следующим образом:

from urllib.request import urlopen from urllib.error import HTTPError from urllib.error import URLError from bs4 import BeautifulSoup try:(“https://likegeeks.com/”) кроме HTTPError как e: print(e) кроме URLError: print(“Сервер не работает или неправильный домен”) else:(html.read(),”html5lib”).findAll(“h3”, {“class”: “post-title”}) for tag in tags: print(tag.getText())

|

|

из urllib.request import urlopen

из urllib.error import HTTPError

из urllib.error import URLError

из bs4 import BeautifulSoup

(“https://likegeeks.com/”)

print(“Сервер не работает или неправильный домен”)

(html.read(),”html5lib”)

|

Этот код возвращает все теги h3 с классом post-title, где эти теги являются заголовками записей на домашней странице.

Мы используем функцию getText для печати только внутреннего содержимого тега, но если вы не использовали getText, вы получите теги со всем, что находится внутри них.

Проверьте разницу:

Это когда мы используем getText():

И это без использования getText():

Очистите HTML-теги с помощью findAll

Мы видели, как функция findAll фильтрует теги по классам, но это еще не все.

Чтобы отфильтровать список тегов, замените выделенную строку приведенного выше примера следующей строкой:

tags.findAll(“span”, “a”, img”)

Этот код получает все теги span, anchor и image из очищенного HTML.

Кроме того, вы можете извлечь теги, имеющие эти классы:

tags.findAll(“a”, {“class”: [“url”, “read more btn”]})

Этот код извлекает все якорные теги, имеющие класс “readmorebtn” и “url”.

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

tags.findAll(text=”Основы программирования на Python с примерами”)

Функция findAll возвращает все элементы, соответствующие указанным атрибутам, но если вы хотите вернуть только один элемент, вы можете использовать параметр limit или функцию find, которая возвращает только первый элемент.

Найдите n-го Ребенка С Помощью Beautifulsoup

Объект Beautifulsoup имеет много мощных функций, вы можете получить дочерние элементы непосредственно так:

tags.span.findAll(“a”)

Эта строка получит первый элемент span на объекте Beautifulsoup, а затем очистит все якорные элементы под этим пролетом.

Что делать, если вам нужно получить n-го ребенка?

Вы можете использовать функцию select следующим образом:

tag.find(“nav”, {“id”: “site-navigation”}).select(“a”)[3]

Эта строка получает навигационный элемент с идентификатором “site-navigation”, а затем мы берем четвертый якорный тег из этого навигационного элемента.

Beautifulsoup-это мощная библиотека!!

Поиск тегов с помощью регулярных выражений

В предыдущем уроке мы говорили о регулярных выражениях и видели, насколько эффективно использовать регулярные выражения для идентификации общих шаблонов, таких как электронные письма, URL-адреса и многое другое.

К счастью, Beautifulsoup имеет эту функцию, вы можете передавать шаблоны регулярных выражений в соответствии с определенными тегами.

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

Движок регулярных выражений позволяет так легко выполнять такие задания.

import re.findAll(“img”, {“src”: re.compile(“../uploads/photo_.*.png”)})

||

tags.findAll(“img”, {“src”: re.compile(“../uploads/photo_.*.png”)})

|

Эти строки соскребут все PNG-изображения на ../uploads/и начнут с фото_

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

Выскабливание JavaScript

Предположим, что страница, которую вам нужно очистить, имеет другую загрузочную страницу, которая перенаправляет вас на нужную страницу, и URL-адрес не меняется, или есть некоторые фрагменты вашей очищенной страницы, которые загружают ее содержимое с помощью Ajax.

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

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

Библиотека Selenium не включает в себя собственный браузер, для работы вам необходимо установить сторонний браузер (или веб-драйвер).

Вы можете выбрать Chrome, Firefox, Safari или Edge.

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

Использование ChromeDriver с селеном

Во-первых, вы должны установить библиотеку selenium следующим образом:

$ pip install selenium

Затем вы должны скачать драйвер Chrome из here и установить его на свой системный ПУТЬ.

Теперь вы можете загрузить свою страницу следующим образом:

из selenium import webdriver.Chrome() browser.get(“https://www.python.org/”).find_element_by_id(“main nav”) parent(nav.text)

||

из selenium import webdriver

браузер.Хром()

browser.get(“https://www.python.org/”)

nav.find_element_by_id(“main nav”)

|

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

Довольно просто, правда?

Мы не взаимодействовали с элементами страницы, поэтому еще не видели силы селена, просто ждите его.

Скребок Селеновой паутины

Возможно, вам нравится работать с драйверами браузеров, но гораздо больше людей любят запускать код в фоновом режиме, не видя его в действии.

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

PhantomJS позволяет вам взаимодействовать с соскобленными файлами cookie страниц и JavaScript без головной боли.

Кроме того, вы можете использовать его как Beautifulsoup для очистки страниц и элементов внутри этих страниц.

Скачайте PhantomJS из here и поместите его в свой ПУТЬ, чтобы мы могли использовать его в качестве веб-драйвера с selenium.

Теперь давайте применим нашу работу по веб-скребку Python с использованием selenium с PhantomJS так же, как мы это сделали с Chrome webdriver.

из selenium import webdriver.PhantomJS() browser.get(“https://www.python.org/”) print(browser.find_element_by_class_name(“введение”).text) browser.close()

||

из selenium import webdriver

браузер.PhantomJS()

browser.get(“https://www.python.org/”)

print(browser.find_element_by_class_name(“введение”).text)

|

В результате получается:

Потрясающе!! Это работает очень хорошо.

Вы можете получить доступ к элементам многими способами, такими как:

browser.find_element_by_id(“id”) browser.find_element_by_css_selector(“#id”) browser.find_element_by_link_text(“Click Here”) browser.find_element_by_name(“Home”)

||

browser.find_element_by_id(“id”)

browser.find_element_by_css_selector(“#id”)

browser.find_element_by_link_text(“Нажмите здесь”)

browser.find_element_by_name(“Home”)

|

Все эти функции возвращают только один элемент, вы можете вернуть несколько элементов, используя такие элементы:

browser.find_elements_by_id(“id”) browser.find_elements_by_css_selector(“#id”) browser.find_elements_by_link_text(“Click Here”) browser.find_elements_by_name(“Home”)

||

browser.find_elements_by_id(“id”)

browser.find_elements_by_css_selector(“#id”)

browser.find_elements_by_link_text(“Нажмите здесь”)

browser.find_elements_by_name(“Home”)

|

Selenium page_source

Вы можете использовать силу BeautifulSoup для возвращаемого контента из selenium, используя page_source следующим образом:

из selenium import webdriver из bs4 import BeautifulSoup.PhantomJS() browser.get(“https://www.python.org/”)(browser.page_source,”html5lib”).findAll(“a”) для ссылки в ссылках: print(link) browser.close()

|

|

из selenium import webdriver

из bs4 import BeautifulSoup

браузер.PhantomJS()

browser.get(“https://www.python.org/”)

страница(browser.page_source,”html5lib”)

links.findAll(“a”)

|

В результате получается:

Как вы можете видеть, PhantomJS делает это очень легко при выполнении Python web scraping для HTML-элементов. Давайте посмотрим еще.

Получить Содержимое iframe С Помощью Selenium

Ваша очищенная страница может содержать iframe, содержащий данные.

Если вы попытаетесь очистить страницу, содержащую iframe, вы не получите содержимое iframe, вам нужно очистить источник iframe.

Вы можете использовать Selenium для очистки iframes, переключившись на кадр, который вы хотите очистить.

из selenium import webdriver.PhantomJS() browser.get(“https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe”).find_element_by_tag_name(“iframe”) browser.switch_to.default_content() browser.switch_to.frame(iframe).page_source print(iframe_source) #возвращает исходную печать iframe(browser.current_url) #возвращает URL-адрес iframe

|

|

из selenium import webdriver

браузер.PhantomJS()

browser.get(“https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe”)

iframe.find_element_by_tag_name(“iframe”)

browser.switch_to.default_content()

browser.switch_to.frame(iframe)

browser.switch_to.frame(iframe)

print(iframe_source) #возвращает источник iframe

print(browser.current_url) #возвращает URL-адрес iframe

|

В результате получается:

Проверьте текущий URL-адрес, это URL-адрес iframe, а не исходная страница.

Получите Контент iframe С Помощью Beautifulsoup

Вы можете получить URL-адрес iframe с помощью функции find, а затем отказаться от этого URL-адреса.

from urllib.request import urlopen from urllib.error import HTTPError from urllib.error import URLError from bs4 import BeautifulSoup try:(“https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe”) кроме HTTPError как e: print(e) кроме URLError: print(“Сервер не работает или неправильный домен”) else:(html.read(), “html5lib”).find(“iframe”) print(tag[‘src’]) #URL iframe ready for scraping

|

|

из urllib.request import urlopen

из urllib.error import HTTPError

из urllib.error import URLError

из bs4 import BeautifulSoup

html(“https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe”)

print(“Сервер не работает или неправильный домен”)

res(html.read(), “html5lib”)

print(tag[‘src’]) #URL iframe ready for scraping

|

Потрясающе!! Здесь мы используем еще один метод веб-скребка Python, когда мы соскабливаем содержимое iframe изнутри страницы.

Обработка Ajax – Вызовов С Помощью (Selenium+ PhantomJS)

Вы можете использовать selenium для очистки содержимого после выполнения Ajax-вызовов.

Например, нажать кнопку, которая получает содержимое, которое вам нужно очистить. Проверьте следующий пример:

из selenium import webdriver import time.PhantomJS() browser.get(“https://www.w3schools.com/xml/ajax_intro.asp”) browser.find_element_by_tag_name(“button”).click() time.sleep(2) #Явное ожидание browser.get_screenshot_as_file(“image.png”) browser.close()

||

из selenium import webdriver

браузер.PhantomJS()

browser.get(“http://www.w3schools.com/xml/ajax_intro.asp”)

browser.find_element_by_tag_name(“кнопка”).click()

время сна(2) #Явное ожидание

browser.get_screenshot_as_file(“image.png”)

|

В результате получается:

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

Здесь есть одна маленькая деталь, она касается времени ожидания.

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

Дождитесь завершения Ajax – вызовов с помощью PhantomJS

Лучшее решение-проверить наличие HTML-элемента на конечной странице, если он существует, то это означает, что вызов Ajax успешно завершен.

Проверьте этот пример:

из selenium импортируйте webdriver из selenium.webdriver.common.by импорт с помощью selenium.webdriver.support.ui импортирует WebDriverWait из selenium.webdriver.support import expected_conditions as EC.PhantomJS() browser.get(“https://resttesttest.com/”) browser.find_element_by_id(“submitajax”).click() try:(browser, 10).until(EC.text_to_be_present_in_element((By.ID, “statuspre”),”HTTP 200 OK”)) наконец: browser.get_screenshot_as_file(“image.png”) browser.close()

|

|

из selenium import webdriver

из селена.webdriver.common.by импорт По

из селена.webdriver.support.ui импорт WebDriverWait

из селена.webdriver.support import expected_conditions as EC

браузер.PhantomJS()

browser.get(“https://resttesttest.com/”)

browser.find_element_by_id(“отправить ajax”).click()

((браузер, 10).until(EC.text_to_be_present_in_element((By.ID, “status pre”),”HTTP 200 OK”))

browser.get_screenshot_as_file(“image.png”)

|

В результате получается:

Здесь мы нажимаем на кнопку Ajax, которая делает вызов REST и возвращает результат JSON.

Мы проверяем наличие текста элемента div, если это “HTTP 200 OK” с таймаутом 10 секунд, а затем сохраняем страницу результатов в виде изображения, как показано на рисунке.

Вы можете проверить многие вещи, такие как:

Изменение URL-адреса с помощью EC.url_changes()

Новое открытое окно с помощью EC.new_window_is_opened()

Изменения в названии с помощью EC.title_is()

Если у вас есть какие-либо перенаправления страниц, вы можете посмотреть, есть ли изменение в заголовке или URL-адресе, чтобы проверить его.

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

Круто!!

Обработка файлов Cookie

Иногда, когда вы пишете свой код веб-скребка Python, очень важно позаботиться о файлах cookie для сайта, который вы очищаете.

Возможно, вам нужно удалить файлы cookie или сохранить их в файле и использовать для последующих подключений.

Существует множество сценариев, так что давайте посмотрим, как обращаться с файлами cookie.

Чтобы получить файлы cookie для текущего посещаемого сайта, вы можете вызвать функцию get_cookies() следующим образом:

из selenium import webdriver.PhantomJS() browser.get(“https://like geeks.com/”) print(browser.get_cookies())

||

из selenium import webdriver

браузер.PhantomJS()

browser.get(“https://like geeks.com/”)

печать(browser.get_cookies())

|

В результате получается:

Чтобы удалить файлы cookie, вы можете использовать следующие функции delete_all_cookies():

из selenium import webdriver.PhantomJS() browser.get(“https://like geeks.com/”) браузер.delete_all_cookies()

||

из selenium import webdriver

браузер.PhantomJS()

browser.get(“https://like geeks.com/”)

браузер.delete_all_cookies()

|

Веб-скребок ПРОТИВ Веб-обхода

Мы говорили о веб-скребке Python и о том, как разбирать веб-страницы, теперь некоторые люди путаются в скребке и ползании.

Web Scraping – это разбор веб-страниц и извлечение из них данных для любых целей, как мы видели.

Web crawling – это сбор каждой найденной ссылки и обход каждой из них без масштаба, и это с целью индексации, как то, что делают Google и другие поисковые системы.

Python web scrap-это очень весело, но прежде чем мы закончим наше обсуждение, есть некоторые хитрые моменты, которые могут помешать вам скрести, как Google reCAPTCHA.

Google reCAPTCHA теперь становится намного сложнее, вы не можете найти хорошее решение, на которое можно положиться.

Я надеюсь, что вы найдете этот учебник полезным. Продолжай возвращаться.

Спасибо.