Ваш секретный чек-лист по парсингу
Время прочтения: 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. |
Не найдено записей для выбранного(ых) источника(ов). Последнее обновление 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.



com/site

spending.gov.ru
ru
mx
США 15
гов.ру
Москва
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