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

Как сделать Веб-скребок С помощью Python

Веб-скребок-это метод извлечения данных с веб-страницы с помощью компьютерной программы. В этом уроке мы продемонстрируем, как собирать ссылки на новости и заголовки с веб-сайта газеты в образовательных целях. Во время путешествия мы узнаем о встроенной библиотеке URLLIB Python для подключения веб-сайта и извлечения данных, а также о сторонней библиотеке BeautifulSoup для анализа HTML-данных, чтобы мы могли фильтровать и извлекать наши целевые ссылки. Мы также будем использовать встроенную библиотеку журналов для записи ошибок в текстовый файл, если во время выполнения программы произойдет какая-либо ошибка. Основная библиотека для веб-скребка разработана в стиле объектно-ориентированного программирования (ООП).

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

Веб-скребок-это метод извлечения данных с веб-страницы с помощью компьютерной программы. В этом уроке мы продемонстрируем, как собирать ссылки на новости и заголовки с веб-сайта газеты в образовательных целях. Во время путешествия мы узнаем о встроенной библиотеке URLLIB Python для подключения веб-сайта и извлечения данных, а также о сторонней библиотеке BeautifulSoup для анализа HTML-данных, чтобы мы могли фильтровать и извлекать наши целевые ссылки. Мы также будем использовать встроенную библиотеку журналов для записи ошибок в текстовый файл, если во время выполнения программы произойдет какая-либо ошибка. Основная библиотека для веб-скребка разработана в стиле объектно-ориентированного программирования (ООП).

У нас есть видеоурок для этой главы для людей, говорящих на Бангла: @ Веб-скребок

Если мы посетим http://www.aljazeera.com мы можем видеть новости, которые они опубликовали. Сегодня домашняя страница выглядит так, но вы можете видеть разные новости, поскольку она меняется ежедневно.

1. аль-Джазира.png

Что делает браузер, они получают HTML, CSS-код и отображают его в браузере. Таким образом, мы видим хороший макет с новостными изображениями и т. Д. Вот как работает веб-сайт в браузере. Если мы нажмем Инструменты->Веб-разработчик – >Источник страницы в браузере Firefox мы сможем увидеть исходный код любой веб-страницы. В Google Chrome мы можем получить то же самое: View->Developer->View Source

2. Источник страницы.png

Здесь мы можем увидеть ссылки на файлы html, css и javascript в коде. Что мы будем делать, используя компьютерную программу, мы возьмем этот код и исследуем его.

3. Исходный HTML-код.png

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

4. Ссылки.png

Перед написанием основного скрипта мы напишем сценарий ведения журнала, чтобы во время выполнения программы, если произошла какая-либо ошибка, она сохранялась в текстовом файле на диске. Здесь https://github.com/mahmudahsan/thinkdiff/tree/master/python-advanced мы можем видеть структуру каталогов. chapter4.py – это основной файл, который мы будем запускать в терминале или любым другим способом, например, с помощью cron на сервере. В том же каталоге, где chapter4.py теперь мы создадим еще 2 каталога. Каталоги html и web scrape.

5. Структура каталогов.png

Теперь в каталоге webscrap мы создадим файл с именем: wlog.py Здесь мы напишем следующий код:

import logging
def set_custom_log_info(filename):
    logging.basicConfig(filename=filename, level=logging.INFO)
    
def report(e:Exception):
    logging.exception(str(e))

Мы импортируем встроенную библиотеку ведения журнала и определим 2 функции. В функции set_custom_log_info(filename) при ее вызове мы передадим имя файла или путь к файлу, чтобы он использовался для хранения информации журнала, такой как ошибка, предупреждение или любая обратная трассировка. В этой функции мы вызываем модуль ведения журнала,. INFO) . Эта строка указывает функции ведения журнала, где сохранить информацию и уровень журнала. Мы можем обеспечить ведение журнала.ИНФОРМАЦИЯ, ведение журнала.ОШИБКА, ведение журнала.И ПРЕДУПРЕЖДЕНИЕ тоже. Для простоты мы просто использовали только ведение журнала.ИНФОРМАЦИЯ

В функции report(e:Exception) мы используем logging.exception(str(e)), чтобы сообщить о любом исключении для сохранения в файле журнала, который мы передаем в качестве параметра функции report(e) ‘e’.

Теперь мы создадим еще один файл с именем wscrap.py для очистки и разбора. Прежде чем писать больше кода, нам сначала нужно установить библиотеку BeautifulSoup . Его легко установить, если вы установили PIP на своей машине. Чтобы установить BeautifulSoup by PIP в mac:

pip3 install beautifulsoup4

В Windows:

pip install beautifulsoup4

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

Вот полный код wscrap.py и давайте обсудим это:

from urllib.request import urlopen 
from bs4 import BeautifulSoup
# Global variables
url_aj   = 'http://www.aljazeera.com'
filepath = 'html/aj.html'

Сначала мы импортируем функцию urllib.request модуля urlopen. Затем мы импортируем модуль BeautifulSoup из библиотеки bs4. Затем мы определяем 2 переменные url_aj, назначенные веб-сайту газеты aljazeera. И назначается путь к файлу ‘html/aj.html’ . Как мы побежим chapter4.py поэтому, когда наш код удалит HTML-код домашней страницы сайта aljazeera, он сохранит его в html-дикторе aj.html файл. Так что в нашем исследовании мы не каждый раз запрашиваем веб-сайт Aljazeera, а можем исследовать данные, сохраненные в aj.html файл.

Теперь давайте напишем класс с именем News Scrapper и метод конструктора:

class NewsScraper:
    __url   = ''
    __data  = ''
    __wlog  = None
    __soup  = None 
    
    def __init__(self, url, wlog):
        self.__url  = url 
        self.__wlog = wlog

Когда мы создаем объект скребка новостей в chapter4.py файл мы передадим аргументы url и журнала, которые будут назначены в переменных __url и __wlog. __VARIABLE называется закрытым в соответствии с соглашением python, хотя на самом деле он не является закрытым, поскольку в Python нет такого спецификатора доступа. Но мы определили эту переменную__, так что мы хотим, чтобы эти переменные не были доступны напрямую, а были доступны косвенно с помощью связанных методов.

Теперь мы напишем еще несколько методов.

def retrieve_webpage(self):
        try:
            html = urlopen(self.__url)
        except Exception as e:
            print (e)
            self.__wlog.report(str(e))
        else:
            self.__data = html.read()
            if len(self.__data) > 0:
                print ("Retrieved successfully")

метод retrieve_webpage() использует функцию urlopen() для извлечения self.__url и сохранения выходных данных в локальной переменной html. Если произошла какая-либо ошибка, он запишет это в файл error.log каталога html. Если ошибки не произошло, он будет использовать метод html.read() для чтения содержимого и присвоения его переменной self.__data в блоке else и покажет сообщение.

    def write_webpage_as_html(self, filepath=filepath, data=''):
        try:
            with open(filepath, 'wb') as fobj:
                if data:
                    fobj.write(data)
                else:
                    fobj.write(self.__data)
        except Exception as e:
            print(e)
            self.__wlog.report(str(e))
            
    def read_webpage_from_html(self, filepath=filepath):
        try:
            with open(filepath) as fobj:
                self.__data = fobj.read()
        except Exception as e:
            print (e)
            self.__wlog.report(str(e))

Далее мы напишем метод write_webpage_as_html (), который сохранит данные в файле, предоставленном filepath. По умолчанию мы назначили глобальную переменную filepath и пустые данные в качестве аргументов. Но в одном случае мы предоставим данные и путь к файлу из chapter4.py код, чтобы он записал эти данные в путь к файлу, который мы указали. Мы также напишем метод read_webpage_from_html (), который будет извлекать данные из файла, который мы предоставили в качестве пути к файлу и присвоили значение переменной self.__data.

    def change_url(self, url):
        self.__url = url
            
    def print_data(self):
        print (self.__data)

Мы также определим метод change_url() для изменения __url, если мы хотим, и метод print_data() для проверки __данных.

    def convert_data_to_bs4(self):
        self.__soup = BeautifulSoup(self.__data, "html.parser")

Затем мы определим метод convert_data_to_bs4 (), который преобразует __данные в BeautifulSoup объект и назначает в переменной self.__soup.

    def parse_soup_to_simple_html(self):
        news_list = self.__soup.find_all(['h1', 'h2']) # h1
        
        #print (news_list)
        
        htmltext = '''

    Simple News Link Scrapper
    
        {NEWS_LINKS}
    

'''
        
        news_links = '
    ' for tag in news_list: if tag.parent.get('href'): # print (self.__url + tag.parent.get('href'), tag.string) link = self.__url + tag.parent.get('href') title = tag.string news_links += "
  1. {}
  2. \n".format(link, title) news_links += '
' htmltext = htmltext.format(NEWS_LINKS=news_links) # print(htmltext) self.write_webpage_as_html(filepath="html/simplenews.html", data=htmltext.encode())

Наконец, в классе скребка новостей мы напишем parse_soup_to_simple_html(). Здесь в начале мы вызовем __soup.find_all([‘h1′,’h2’]), чтобы отфильтровать все html-данные, начинающиеся с тега h1 или h2. Мы также можем предоставить некоторые другие html-теги, такие как h3, h4, h5, h6.

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

6. заголовки.png

Затем мы записываем структуру файла шаблона html в текстовую переменную html. В этом тексте мы позже заменим {NEWS_LINKS} реальными ссылками на новости.

Затем в цикле for мы повторяем переменную news_list и проверяем, имеет ли родительский тег тега заголовка атрибут href или нет. Если это так, то мы создадим URL-ссылку, указав базовый URL-адрес и путь, который мы получим от родителя. Если мы увидим изображение выше, мы увидим, что родитель тега h1 является тегом привязки, некоторые теги могут не иметь тега привязки или значения href, поэтому мы пишем это условие if. Наконец, мы обновим htmltext, заменив переменную {NEWS_LINKS} данными news_links, сгенерированными нашей программой.

И в конце мы сохраним текстовые данные html, преобразовав их в двоичный формат и сохранив в html/simplenews.html файл.

Теперь В chapter4.py мы напишем следующий код:

from webscrap import wlog
from webscrap import wscrap
# Define log file location
wlog.set_custom_log_info('html/error.log')
'''
# Testing log file reporting
try:
    raise Exception
except Exception as e:
    wlog.report(str(e))
'''
news_scrap = wscrap.NewsScraper(wscrap.url_aj, wlog)
news_scrap.retrieve_webpage()
news_scrap.write_webpage_as_html()
news_scrap.read_webpage_from_html()
news_scrap.convert_data_to_bs4()
#news_scrap.print_beautiful_soup()
news_scrap.parse_soup_to_simple_html()

Мы просто импортируем вашу собственную библиотеку из каталога web scrap. Затем мы установим путь к файлу журнала “html/error.log”.

Затем мы создадим объект news_scrap по классу скребка новостей. Затем мы вызовем метод retrieve_webpage() для извлечения сайта, а затем вызовем write_web page_as_html (), чтобы сохранить эти данные просто в текстовом файле.

Затем мы вызываем файл read_webpage_from_html() для извлечения данных. Потому что после того, как мы впервые получим данные с веб-страницы, мы должны прокомментировать метод retrieve_web page() и write_webpage_as_html (), чтобы во время нашего исследования он не запрашивал веб-сервер каждый раз. Как и данные, уже сохраненные в текстовом файле на нашем диске.

#news_scrap.retrieve_webpage()
#news_scrap.write_webpage_as_html()

Наконец, convert_data_to_bs4() преобразует данные в объект BeautifulSoup, и если мы вызовем parse_soup_to_simple_html (), он проанализирует данные и создаст html-файл simplenews.html который будет выглядеть следующим образом. Данные могут выглядеть по-другому, поскольку новости меняются ежедневно.

4. Ссылки.png

Итак, вот несколько простых методов для очистки веб-страниц. Есть некоторые сайты, которые используют Reactjs или другие javascript-фреймворки для динамического назначения URL-адресов, которые нелегко утилизировать и для анализа требуется еще немного кода. Если вы хотите больше узнать о веб-скребке, вы можете больше узнать о https://www.crummy.com/software/BeautifulSoup/bs4/doc/ библиотека и изучение некоторых других методов очистки веб-страниц.

Github: @ Соскабливание паутины Каталоги: веб-лом | HTML Основной сценарий: Основной сценарий: Первоначально опубликовано: Первоначально опубликовано: