Ваш секретный чек-лист по парсингу
Время прочтения: 6 мин.
Добрый день! В этой статье я поделюсь своим опытом парсинга большого количества сайтов.
Задание:
Получить текст с сайтов (порядка 70к), затем выполнить его последующую обработку, в соответствии с требованиями.
Что необходимо сделать перед началом парсинга:
- Убедиться в корректности ссылок сайтов:
- Корректно указанный протокол (исключаем протоколы: hhtp , hhtps , hhtps , hpp и прочие вариации )
- Отсутствие пробелов, точек и прочих спец символов в начале и конце ссылки (прим. ./http://www.____.ru/. )
- Проверить работоспособность сайтов
- Множество сайтов в датасете были недоступны по тем или иным причинам (прим. нерабочий сайт, ошибка 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" : [список ссылок на картинки с сайта] }, "ссылка на сайт" : {...}, ... }
И последнее при подготовке — это определиться, как вы будете хранить данные о кодах сайтов, данные обработки и т.д.
import pandas as pd df = pd.read_csv('sites.csv', index_col=0) df
URL_old | URL | Status | |
0 | 111.ru | https://111.ru | 200 |
1 | 100.ru | http://100.ru | 200 |
2 | www.ru | www.ru | bad_url |
3 | https://vk. com/site | https://vk.com/site | 404 |
4 | http://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.