Ваш секретный чек-лист по парсингу

Время прочтения: 6 мин.

Добрый день! В этой статье я поделюсь своим опытом парсинга большого количества сайтов. 
Задание:

Получить текст с сайтов (порядка 70к), затем выполнить его последующую обработку, в соответствии с требованиями.

Что необходимо сделать перед началом парсинга:

  1. Убедиться в корректности ссылок сайтов: 
    1. Корректно указанный протокол (исключаем протоколы: hhtp , hhtps , hhtps , hpp и прочие вариации  )
    1. Отсутствие пробелов, точек и прочих спец символов в начале и конце ссылки (прим. ./http://www.____.ru/.  )
  2. Проверить работоспособность сайтов
    1. Множество сайтов в датасете были недоступны по тем или иным причинам (прим. нерабочий сайт, ошибка 404, 403 и т.д.)


Для реализации обработки выбран Python, использованы библиотеки:

# Парсинг
import requests
from bs4 import BeautifulSoup as BS
# Обработка текста
import re
# Работа с файлами
import json
import os
#Очистка вывода
from IPython.
', 'httpp', 'httt','ttps'] def cheek_url(url): s = url # Удаление протоколов из ссылки for i in bad_list: s = s.replace(i,'') # Удаление первого символа из спец символов в списке while s[0] in ['/','.',';',':',',']: s = s[1:] # Удаление последнего символа из спец символов в списке while s[-1] in ['/','.',';',':',',']: s = s[:-1] url = s s_c = 'bad_url' try: url = f'https://{s}' # Попытка обратиться к сайту с обновленным защищенным протоколом response = requests.get(url,timeout = 60) s_c = response.status_code if s_c == 200: return url, s_c elif s_c != 'bad_url': return url, s_c except: try: # Попытка обратиться к сайту с обновленным незащищенным протоколом url = f'http://{s}' response = requests.
get(url,timeout = 60) s_c = response.status_code if s_c == 200: return url, s_c elif s_c != 'bad_url': return url, s_c except: return url, s_c

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

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

Долговременное хранение потребует проработки архитектуры хранения сайтов, для последующей работы с ними. Также стоит учитывать вес загруженных текстов и, соответственно, место для хранения. Некоторых сайты с принятыми ограничениями указанными ниже весили до 7ГБ, 5000 сайтов весят в среднем ~ 50 ГБ в не заархивированном состоянии ( в архиве они же ~ 7 ГБ).

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

имя файла — id сайта в изначальной таблице

ключи внутри — ссылки страниц

file = { "ссылка на сайт" : {
"status" : "статус сайта (200,404 и т.д.)",
"text" : "текст, загруженный с сайта ", 
"img" : [список ссылок на картинки с сайта] 
},
"ссылка на сайт" : {...},
...
}

И последнее при подготовке — это определиться, как вы будете хранить данные о кодах сайтов, данные обработки и т.д.

Я использовал для этого таблицы .csv и .xlsx, а работу с ними в python производил с помощью библиотеки pandas.

import pandas as pd
df = pd.read_csv('sites.csv', index_col=0)
df
 URL_oldURLStatus
0111.ruhttps://111.ru200
1100.ruhttp://100.ru200
2www.ruwww.rubad_url
3https://vk. com/sitehttps://vk.com/site404
4http://orrr.ru/http://orrr.ru/200

2. Парсинг

Закончив с первичной обработкой, приступаем к парсингу рабочих сайтов.

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

def get_all_links(page):
    try:
        HEADERS = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:87.0) Gecko/20100101 Firefox/87.0'}
        html_text = requests.get(page, headers=HEADERS, timeout = 60).text
        soup = BS(html_text)
        arr = []
        end = ['.
jpg','.pdf','.exe','.mp4','.jpeg'] for link in soup.find_all('a', href=True): #Пропуск ссылок, оканчивающиеся на расширения файлов ch = False for e in end: if link.endswith(e): ch = True if ch: continue l = link['href'] #добавление имени главной страницы сайта, если таковая отсутствует if l.find("//") == -1 : try: if l[0] != "/": l = page + '/' + l else: l = page + l except: pass if l!='': arr.append(l) return [el for el, _ in groupby(arr)] except: return[]

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

%%time
i = 0
start_time = time()
directory = 'sites'
#Создание папки под файлы, если еще не создана
if not os.path.isdir(directory):
    os.mkdir(directory)

HEADERS = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:87.0) Gecko/20100101 Firefox/87.0'}
l1 = len(df)
for row in df.itertuples(index=True, name='Pandas'):  
    print( f"Url_n {row.Index} of {l1}. URL = {row.URL}" )
    data= {}
    # Проверка, не создали ли мы уже файл с таким индексом
    if os.path.isfile(f'{directory}/{row.Index}.json'):
        i+=1
        continue
    j = 0
    #Получаем ссылки со страницы, и ставим главную страницу на первое место в списке
    list_url = get_all_links(row.URL)
    list_url.insert(0,row.URL)
    error = 0
    imgUrls = []
    for url in list_url:
        clear_output(True)
        print(f"i =  {i} / {l1}. URL = {row.URL} .  name = {row.Index }")
        print(f"page {j} of {len(list_url)}.
URL = {url}. Error = {error} . Time = {time() - start_time}") j+=1 list_img = [] try: try: html = requests.get(url,headers=HEADERS,timeout = 60).text except: data[url]= {'status':'cheek one more',"text":'','img': imgUrls} continue soup = BS(html) text = soup.body.get_text() #Получаем список с ссылками на все картинки на странице imgUrls = re.findall('img .*?src="(.*?)"', html) data[url] = {'status':'ok',"text":text,'img': imgUrls} except: error +=1 data[url] = {'status':'error load page',"text":'','img': imgUrls} #Сохраняем json файл с загруженным сайтом with open( f'{directory}/{row.Index}.json','w',encoding="utf-8") as file: json.dump(data,file) i+=1

Данный процесс можно ускорить, запустив несколько вкладок в Jupyter Notebook, обрабатывая разные части дата фрейма.

Заключение.

По итогу мы получаем файлы с текстом, готовые к обработке.

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

При обработке тяжелых сайтов ( ~4гб) может закончится озу, и загруженные данные обрезаются.

Сложно оценить скорость парсинга и последующей обработки, так как это зависит от производительности всего ПК, скорости интернета и размера каждого сайта, и времени отклика каждого из них.

P.S.
Описанным здесь методом не получится загрузить сайты, защищенные от парсинга.

Противодействие распространению инфекциям — МТК им. адмирала Д.Н. Сенявина

Информирование населения о мерах личной и общественной профилактики гриппа, ОРВИ и коронавирусной инфекции (COVID-19):

 

Паспорт мероприятий по оценке готовности к осуществлению образовательной деятельности в условиях сохранения рисков распространения новой коронавирусной инфекции (COVID-19) на 2021/2022 учебный год

Чек-лист к паспорту

 

Уважаемые петербуржцы!

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

Рекомендации по предоставлению работникам, проходящим вакцинацию против коронавирусной инфекции (COVID-19), двух оплачиваемых выходных дней (утверждены Российской трехсторонней комиссией по регулированию социально-трудовых отношений 29.10.2021).

http://government.ru/department/403/

 

 

Новая вакцина от COVID-19 «Спутник Лайт»

       В России зарегистрировали четвертую вакцину от COVID-19 «Спутник Лайт». Об 6 мая заявил министр здравоохранения России Михаил Мурашко. Вакцина «Спутник Лайт» создана для быстрого формирования популяционного иммунитета при неблагоприятной эпидемиологической ситуации и для использования переболевшими, у которых нет антител или они низкие.

       «Сегодня Минздравом России зарегистрирована четвертая российская вакцина для профилактики новой коронавирусной инфекции — «Спутник Лайт», разработанная Национальным исследовательским центром эпидемиологии и микробиологии имени Гамалеи. В отличие от двухкомпонентной вакцины «Спутник V» «Спутник Лайт» содержит только один компонент, созданный на основе аденовируса 26-го типа. По результатам проведенных доклинических и клинических исследований, вакцина «Спутник Лайт» имеет благоприятный профиль безопасности, а у всех добровольцев сформировался клеточный иммунный ответ, к возбудителю SARS-CoV-2», — сказал Михаил Мурашко.

       Четвертая российская вакцина расширит доступный арсенал лекарственных препаратов для профилактики коронавируса и позволит ускорить формирование устойчивого коллективного иммунитета. Директор Центра имени Гамалеи Александр Гинцбург подчеркнул, что новый препарат будет защищать от коронавируса на протяжении пяти месяцев. Ранее в нашей стране уже были зарегистрированы три вакцины от COVID-19: «Спутник V», «ЭпиВакКорона» и «КовиВак».

       Вице-премьер РФ Татьяна Голикова пояснила, что вакцина «Спутник Лайт» является альтернативой «Спутнику V», она создавалась для использования переболевшими COVID-19. «Несмотря на то, что новая вакцина «Спутник Лайт» представляет собой, по сути, первый компонент вакцины «Спутник V», но она в то же время является ее альтернативой», — сказала Голикова 6 мая на совещании с президентом России Владимиром Путиным в Сочи. Президент Путин дополнил слова вице-премьера, отметив, что российские препараты от коронавируса являются на сегодняшний день наиболее безопасными, они просты и надежны. «Как сказал один из европейских специалистов: надёжны как автомат Калашникова. Да. Это не мы сказали, это сказал один из европейских специалистов, и я думаю, что он, безусловно, прав. Просты и надежны как автомат Калашникова», — отметил Путин.

      Он также подчеркнул, что наша страна — единственная на сегодняшний день страна в мире, которая готова и передаёт в другие страны технологию производства вакцин. «Эта практика уже реализуется», — добавил Владимир Владимирович.

 

Вакцинация от коронавирусной инфекции

 

Локальный акт, определяющий действия при выявлении признаков заболевания

Локальный акт об утверждении лиц, ответственных за проведение уборок

Локальный акт о запрете проведения массовых мероприятий

Инструкция по проведению дезинфицирующих мероприятий в период пандемии коронавируса

 

Памятка по профилактике гриппа и коронавирусной инфекции

 

 

 В Морском Техническом Колледже еженедельно проводится профилактическая дезинфекция всех помещений.

 

 


Расходы / 403 Запрещено

Робот Путь Разрешение
GoogleBot /
БингБот /
BaiduSpider /
ЯндексБот /
Название 403 Запрещено
Описание Н/Д
Ключевые слова Н/Д
Веб-сайт www. spending.gov.ru
IP-адрес хоста 95.173.131.116
Местоположение Москва, Москва, Россия
Сайт Ранг
тендер-гонка.ру № 1 296 483
star-pro.ru № 204 843
clearspending.ru № 473 633
xn--80aapampemcchfmo7a3c9ehj.xn--p1ai № 35 799
bicotender. ru № 301 654
superurge.сайт
swanlakehorseshows.com
szdzfz.com
telstra-staff-sale.com.au
thebetterhome.com
threehotel.jp
trustmf.com
vanesafinal.myshopify.com
vizionist.info
wamiruvubasin.go.tz
fundacionsanroque.org
games4all. mx

28 210 долларов США

Последнее обновление: 16 мая 2023 г.

Spending.gov.ru имеет глобальный рейтинг трафика 912 462 и занимает 50 380-е место в России. Его глобальный рейтинг снизился на 69 822 позиции по сравнению с 3 месяцами ранее. Spending.gov.ru оценивается в 28 210 долларов США, исходя из предполагаемого дохода от рекламы. Spending.gov.ru ежедневно посещают около 3435 уникальных посетителей. Его веб-сервер расположен в Москве, Москва, Россия, с IP-адресом 95.173.131.116. Согласно сайту SiteAdvisor, сайт韨青可可可可可可可宝 неизвестен для посещения.

Стоимость покупки/продажи 28 210 долл. США
Ежедневный доход от рекламы долл. США 15
Ежемесячный доход от рекламы 463 долл. США
Годовой доход от рекламы 5 642 долл. США
Уникальные посетители в день 3 435
Примечание. Все значения трафика и доходов являются приблизительными.
Глобальный рейтинг 912 462
Дельта (90 дней) ⬇️ 69 822
Самый популярный в стране Россия
Рейтинг страны 50 380
Хост Тип ТТЛ Данные
расход. гов.ру А 3600 IP: 95.173.131.116
расход.гов.ру Н.С. 3600 Адрес: ns.spending.gov.ru.
расход.гов.ру Н.С. 3600 Адрес: ns.gov.ru.
расход.гов.ру ТХТ 3600 TXT: РАСХОДНАЯ ПАЛАТА РФ, г. Москва
расход.гов.ру ТХТ 3600 TXT: google-site-verification=ENPaJARE24YYDLMiDpWny6Tchw33RdOOvpLCVDfgZcc
расход.гов.ру ТХТ 3600 TXT: _globalsign-domain-verification=rY5bjJlZKisJAap9Omc6oMiYdgEznnHckmUiQVs4Im
расход.гов.ру СОА 3600 MNAME: ns.spending.gov.ru.
РИМЯ: hostmaster.spending.gov.ru.
Серийный номер: 2022110102
Обновление: 3600
Повтор: 3600
Срок действия: 604800
9 0279 Минимальный TTL: 10800
 HTTP/1. 1 301 Перемещен навсегда
Сервер: nginx
Дата: вторник, 16 мая 2023 г., 08:20:23 по Гринвичу
Тип содержимого: текст/html
Длина содержимого: 162
Соединение: Keep-alive
Адрес: https://spending.gov.ru/
Параметры X-Frame: SAMEORIGIN
Строгая транспортная безопасность: max-age=63072000; включить субдомены
X-XSS-защита: 1; режим = блок
X-Content-Type-Options: nosniff
Content-Security-Policy: font-src * data:;img-src * data:;
Referrer-Policy: строгое происхождение
Feature-Policy: полноэкранный режим; оплата нет;
HTTP/2 403
сервер: nginx
дата: вторник, 16 мая 2023 г., 08:20:24 по Гринвичу
тип содержимого: текст/html
длина содержимого: 146
 
Не найдено записей для выбранного(ых) источника(ов).
Последнее обновление 2023-05-16T08:16:30Z 

ITRA – Международная ассоциация трейлраннинга

06. 09.2023

WMTRC Trail Long: Франция завоевывает домой двойное золото в трейлраннинге

В третий гоночный день чемпионата мира по горному и трейлраннингу в Инсбруке — Stubai 2023 (WMTRC), Benjamin Roubiol и Marion Delespierre, оба из Франции, вышли на первое место и выиграли золото. Высшая дисциплина трейлового бега началась в Нойштифт-им-Штубай и привлекла как спортсменов, так и зрителей на

Читать статью

06.08.2023

WMTRC Trail Short: Норвегия и Франция забирают домой золото

Стиан Ховинд Ангермунд защитил свой титул и выиграл золото в мужской короткой гонке. Гонка стартовала в Landestheater (Тирольский государственный театр) в Инсбруке и проходила по альпийской местности на Kalkkögel

Читать статью

06.07.2023

[WMTRC 2023 Инсбрук-Штубай]: Где следить за мероприятием?

Уважаемое сообщество трейлраннеров, Подписывайтесь на наши социальные сети, чтобы быть в курсе всех основных моментов чемпионата мира по горному бегу и бегу по пересеченной местности (WMTRC) 2023 года в Инсбруке и Штубай. ). Не пропустите острые ощущения от каждой гонки! ПРЯМАЯ ТРАНСЛЯЦИЯ НА YOUTUBE Отследить

Прочитать статью

06.01.2023

WMTRC 2023 LONG TRAIL RACE: Кто фавориты?

Осталось всего несколько дней до следующего чемпионата мира по горному и трейлраннингу в Инсбруке и Штубае. Пришло время поближе познакомиться с фаворитами длинной трейловой гонки, которая состоится в пятницу, 9 июня, в Инсбруке, Австрия. ДЛИННЫЕ ТРЕЙЛЫ Для длинной трейловой гонки

Читать статью

31.05.2023

[WMTRC 2023] Короткая трейловая гонка: кто фавориты?

Осталось всего несколько дней до следующего чемпионата мира по горному и трейлраннингу, который пройдет в Инсбруке/Штубае с 6 по 10 июня. Пришло время внимательно посмотреть на фаворитов этих чемпионатов. КОРОТКИЙ ТРЕЙЛ Поле для мужчин является исключительным. Четырнадцать спортсменов имеют

Прочитать статью

27.