Хотите несколько потрясающих фактов, чтобы начать свой день или просто хотите узнать что-то новое или здесь для некоторого удовольствия!
Что ж, в этом блоге я буду делиться сценарием, который я сделал в выходные дни только для удовольствия (и для бокового проекта 😉).
Что я не буду здесь обсуждать:
Что такое веб-соскреб?
Как использовать Beautifulsoup?
Как ломаться? Что мы обсудим !!
TechStack.
- Питон
- BeautifulSoup
Окончательный результат (перед погружением на ступеньки)
Мы будем спасать все соскобные цитаты в текстовом файле. Это будет выглядеть что-то вроде этого
Давайте сделаем соскоб
Проанализируйте сайт для Scrape
Как мы хотим соскребать потрясающие факты, мы собираемся получить это от Компьютерные факты
Взгляд на веб-страницу
Теперь мы хотим факты, как 1 Первый электронный компьютер Eniac весил более 27 тонн и занял 1800 квадратных футов.
Поэтому мы должны сначала взглянуть на его исходную страницу и найти, где этот присутствует, чтобы получить шаблон (мы будем использовать этот шаблон позже, чтобы соскрести эти цитаты).
Как мы можем видеть на странице источник, факты начинаются с Тег на линии
475
И есть несколько Теги, которые содержат эти факты. Если мы смотрим дальше, мы обнаружили, что есть много
Теги используются в HTML. Как бы мы дифференцируем наши факты с другими
Теги?
Если ты выглядишь усердно, тогда вы знаете! Существует уникальный дескриптор, в котором присутствуют факты, каждый факт предшествует с номером (0-9), а затем (.) И пространство. Следовательно, у нас есть наш шаблон 😀
Мы можем игнорировать все остальные Теги и принимайте только, что соответствует определенному образцу, которое мы определили. Чтобы соответствовать шаблону, мы будем использовать модуль Regex of Python,
Re
Отказ
Следовательно, шаблон, который мы определили, это
- Все факты внутри
Теги.
- Есть и другое содержимое внутри
Теги тоже.
- Чтобы получить факты, мы будем использовать Regex для извлечения необходимого контента, оставляя другие
Теги как это так!
Импортные необходимые библиотеки и определенные константы
Прежде чем выполнить задачу соскабливания, нам нужно импортировать библиотеки и определить некоторые константы.
# Standard Imports import os import re from typing import List from urllib.request import Request, urlopen from bs4 import BeautifulSoup from bs4.element import Tag
Импорт ОС
Будет импортировать стандартную библиотеку Python, используемую для создания каталогов и других материалов ОС.Re
будет использоваться для извлечения узора с использованием некоторого регеляции.- Тогда мы импортируем
Список
отНабрав
, явно Тип намека Некоторые аргументы передали некоторые функции. Запрос
иUrlopen
Из стандартной библиотекиурлыб
. Они помогут нам получить данные HTML, которые мы хотим.Beautifulsoup
от сторонней библиотекиBS4
Это создает легко управлять объектом BeautifulSoup, который представляет содержимое HTML.Тег
отBS4.Element
, опять же, чтобы использоваться для подсказки к типу.
QUOTES_FILENAME = "/funfacts.txt" QUOTES_TXT_PATH = os.getcwd() + "/funfacts" QUOTES_FILE_PATH = QUOTES_TXT_PATH + QUOTES_FILENAME QUOTES_URL = "https://gotechug.com/interesting-facts-about-computers-you-didnt-know/"
Quotes_filename
Представляет имя файла текстового файла, где будут сохранены факты.Quotes_txt_path
представляет папку, гдеfunfacts.txt
будет проживать.Quotes_file_Path
Путь файла, который будет использоваться дополнительно для хранения данных.Quotes_url
URL к веб-странице мы хотим царапать.
Зачем назвать переменные как Цитаты
? У меня был еще один скрипт, чтобы соскрести несколько великолепных цитат и повторно использовали то же самое для соскабливания потрясающих фактов. Необходимо узнать больше о скорбящих цитатах? Посетить Это связь.
Создать объект BowowsSouous
Теперь у нас есть несколько постоянных для игры, мы будем использовать Quotes_url
Чтобы получить HTML страницы и создать объект BoysureSoup для фильтрации наших фактов.
def get_bs4_obj(url: str) -> BeautifulSoup: ''' Get BeautifulSoup object for given QUOTES_URL. ''' req = Request(url, headers={'User-Agent': 'Mozilla/5.0'}) html = urlopen(req).read() bs4Obj = BeautifulSoup(html, 'html.parser') return bs4Obj
Мы создаем функцию get_bs4_obj
Это занимает URL
Объект типа строки и возвращает необходимый объект BS4OBJ.
.
Запрос
помогает нам обойти безопасность, которая блокирует использованиеУрлыб
на основе пользовательского агента. Следовательно, нам нужно датьMozilla
Или любой другой пользовательский агент браузера для доступа к их исходной странице.- Тогда мы делаем
Urlopen
с определенным пользователем агентом вЗапрос
и прочитайте это содержание. - Наконец мы создаем
Beautifulsoup
Объект, использующийHTML.Parser
Чтобы разбирать содержимое HTML и вернуть необходимый объект.
Шаги, которые я использовал, чтобы проверить, разрешено ли нам ускорить сайт или нет
import requests #pip install requests req = requests.get(QUOTES_URL) print(req.status_code) #should be 200, other than 200 means scraping not/partially allowed
Теги фильтра
С имением BS4OBJ.
Теперь можно отфильтровать HTML на Теги, мы можем достичь того, используя ниже функции
def filter_p_tags(ptag: Tag) -> bool: ''' Get required p tags only. ''' return re.match(r"[0-9]+.", ptag.get_text()) def get_p_tags(bs4Obj: BeautifulSoup) -> List[Tag]: ''' Get all p tags from the BeautifulSoup obj. Note: It is the requirement for given QUOTES_URL, it shall be different for different URL to scrap. ''' allP = bs4Obj.find_all('p') allReleventP = list(filter(filter_p_tags, allP)) return allReleventP
Посмотрите, как мы использовали Список
и Тег
для типа подсказки и Beautifulsoup
также. Тип подсказки не являются обязательными и не проверяются Python, это только для разработчиков и знают, что Python всегда будет динамически набран!
ALLP
Список содержит все Теги доступны в HTML. Мы фильтруем их с помощью встроенного Python
Фильтр
Функция на том состоянии, если, если текст любого Теги не имеют сопоставления образец Regex
[0-9]+.
Затем отфильтруйте их из ALLP
список.
Образец сопоставления Regex, мы определяем это в функции filter_p_tags
, где мы используем Re.match
Чтобы соответствовать нашему рисунку в данном тексте. Вы можете сделать это в get_p_tags
Сама, но я думаю, что лучше иметь такую задачу в чистых функциях вместо того, чтобы сделать их в одной функции.
Храните все релевантные теги в переменной AllReleventp
и верните это (для использования другой функцией!)
Получить факты
Теперь мы создадим Генератор Чтобы дать факты, которые нам нужно сохранить в текстовом файле. Мы будем использовать AllReleventp
Переменная передана на новую функцию.
def get_all_facts(ptags: List[Tag]): ''' Yield all facts present in p tags. ''' for p in ptags: fact = re.sub(r"[0-9]+\. ", "", p.get_text()) yield fact + "\n"
Здесь мы извлекаем текст, присутствующий в ярлык. Но ждать !! Нам не нужно предыдущий номер, верно? Вот почему мы используем
Re.sub
заменить его пустой строкой. Regex Мы использовали "[0-9] + \."
, это займет любой номер, а затем Отказ
и пространство.
Мы будем использовать этот генератор в следующем разделе, внутри другой функции.
Сохранить факты
Вот функция
def save_fun_facts(ptags: List[Tag]): ''' Save extracted facts in a text file, create a new folder if not already present ''' global QUOTES_TXT_PATH, QUOTES_FILE_PATH if not os.path.exists(QUOTES_TXT_PATH): os.mkdir(QUOTES_TXT_PATH) with open(QUOTES_FILE_PATH, 'w') as file: for txt in get_all_facts(ptags): file.write(txt) print(f'All Fun Facts written to file: {QUOTES_FILE_PATH}')
Мы принимаем глобальные константы Quotes_txt_path
и Quotes_file_Path
использоваться для записи в файл. Мы проверяем, существует ли каталог или нет (папка, в которой мы сохраним наш файл). Затем мы открываем файл в созданном каталоге (если он не существует).
Теперь здесь приходит использование генератора, мы называем генератор на каждом Тег, который дает текст, представленный в нем.
Основной
Теперь скрипт выполнить код
if __name__ == "__main__": bs4Obj = get_bs4_obj(QUOTES_URL) allP = get_p_tags(bs4Obj) save_fun_facts(allP)
Если вы проверяете сейчас, факты должны появляться в файле создано Веселые факты. Text
Внутри папки /забавные факты
.
Ну, это было, если вы следили за этим, то теперь вы знаете суть общего процесса для веб-соскоба и как скрепить удивительные факты!
Это было просто падение в океане, полном разных функций, которые вы можете достичь с помощью Scraping Web, но общая идея остается прежней:
- Получите сайт, который мы хотим соскребать.
- Проанализируйте необходимые компоненты, которые нам нужны и найдите шаблон.
- Создайте объект BowowsSoup, чтобы облегчить процесс и доступа к HTML без особой проблемы.
- Создайте небольшие функции, чтобы выполнить задачу.
- Наконец интегрируйте все функции и увидеть магию сценария!
Полный сценарий Python можно найти здесь Отказ
Github Действие где этот сценарий используется. Хотел бы услышать ваши отзывы об этом также.
Просто начать путешествие с открытым исходным кодом? Не забудьте проверить Привет открыть Источник
Хотите сделать простую и удивительную игру с нуля? Проверьте Пангпонг
До следующего раза !
Намасте 🙏.
Оригинал: “https://dev.to/siddharth2016/scraping-web-awesome-facts-53ii”