Веб-скрапинг – это процесс автоматического сбора информации из онлайн-источников. Для выбора нужных сведений из массива «сырых» данных, полученных в ходе скрапинга, нужна дальнейшая обработка – парсинг. В процессе парсинга выполняются синтаксический анализ, разбор и очистка данных. Результат парсинга – очищенные, упорядоченные, структурированные данные, представленные в формате, понятном конечному пользователю (или приложению).
Скрипты для скрапинга создают определенную нагрузку на сайт, с которого они собирают данные – могут, например, посылать чрезмерное количество GET запросов к серверу. Это одна из причин, по которой скрапинг относится к спорным видам деятельности. Чтобы не выходить за рамки сетевого этикета, необходимо всегда соблюдать главные правила сбора публичной информации:
- Если на сайте есть API, нужно запрашивать данные у него.
- Частота и количество GET запросов должны быть разумными.
- Следует передавать информацию о клиенте в
User-Agent
. - Если на сайте есть личные данные пользователей, необходимо учитывать настройки приватности в robots.txt.
Комментарии
спасибо за вашу статью! сам решил попробовать, вот что получилось :) find_text = 'введите текст запроса' html = urlopen(f'https://САЙТ.com/ru/search/?q={find_text}&target_type=posts&order=relevance') bsObj = BeautifulSoup(html.read()) -строка выдачи tmpagination = bsObj.find('div', class = 'tm-pagination__pages').findAll('a') last_page = int(tm_pagination[-1].text.strip())
построчный перебор
link_list = [] for page_num in range(1,last_page+1): .html = urlopen(f'https://САЙТ.com/ru/search/page{page_num}/?q={find_text}&target_type=posts&order=relevance') .bsObj = BeautifulSoup(html.read()) .for elem in bsObj.findAll('a', class_ ='tm-article-snippetreadmore'): ..link_list.append('https://САЙТ.com' + elem['href']) print(len(link_list)) print(*link_list[:10],sep = '\n') -тут выводятся ссылки которые напарсил код. потом чтение ссылок: def parse_one_article(article_url): html = urlopen(articleurl) bsObj = BeautifulSoup(html.read(), 'html.parser') content = bsObj.find('div', class ='tm-article-body').text #tm-article-presenterbody return(content) with concurrent.futures.ThreadPoolExecutor() as executor: future_to_url = {executor.submit(parse_one_article,link): link for link in link_list} pages_text = [] for future in concurrent.futures.as_completed(future_to_url): article_url = future_to_url[future] try: article_text = future.result() if article_text: pages_text.append(article_text) except Exception as err: print(f'Error{article_url}:{err}') print(pages_text[2])
Спасибо! Прекрасный материал!