Руководство по очистке результатов поиска, связанных с Naver, с помощью Python.
Что будет очищено
Предпосылки
Извлечение базовых знаний с помощью селекторов CSS
Если вы еще не использовали селекторы CSS
, в моем блоге есть отдельная запись о том, как использовать селекторы CSS
при веб-скрейпинге. скребковая перспектива.
Селекторы CSS
объявляют, к какой части разметки применяется стиль, что позволяет извлекать данные из соответствующих тегов и атрибутов.
Отдельная виртуальная среда
Если вы раньше не работали с виртуальной средой, ознакомьтесь с моей специальной записью в блоге Учебное пособие по виртуальной среде Python с использованием Virtualenv и Poetry, чтобы ознакомиться с ней.
Короче говоря, это то, что создает независимый набор установленных библиотек, включая разные версии Python, которые могут сосуществовать друг с другом в одной системе, что предотвращает конфликты библиотек или версий Python.
📌Примечание: это не является строгим требованием для этой записи в блоге.
Установите библиотеки:
pip install requests, parsel
Уменьшить вероятность блокировки
Есть вероятность, что запрос может быть заблокирован. Взгляните на статью Как уменьшить вероятность блокировки при просмотре веб-страниц. Существует одиннадцать способов обойти блокировку большинства веб-сайтов.
Полный код
import requests, json from parsel import Selector # https://parsel.readthedocs.io/
# https://docs.python-requests.org/en/master/user/quickstart/#passing-parameters-in-urls params = { "query": "minecraft", # search query "where": "web" # web results. works with nexearch as well }
# https://docs.python-requests.org/en/master/user/quickstart/#custom-headers headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.87 Safari/537.36", }
html = requests.get("https://search.naver.com/search.naver", params=params, headers=headers, timeout=30) selector = Selector(html.text)
related_results = []
# https://www.programiz.com/python-programming/methods/built-in/enumerate for index, related_result in enumerate(selector.css(".related_srch .keyword"), start=1): keyword = related_result.css(".tit::text").get().strip() link = f'https://search.naver.com/search.naver{related_result.css("a::attr(href)").get()}'
related_results.append({ "position": index, # 1,2,3.. "title": keyword, "link": link })
print(json.dumps(related_results, indent=2, ensure_ascii=False))
Выход:
[
{
"position": 1,
"title": "마인크래프트",
"link": "https://search.naver.com/search.naver?where=nexearch&query=%EB%A7%88%EC%9D%B8%ED%81%AC%EB%9E%98%ED%94%84%ED%8A%B8&ie=utf8&sm=tab_she&qdt=0"
},
{
"position": 2,
"title": "minecraft 뜻",
"link": "https://search.naver.com/search.naver?where=nexearch&query=minecraft+%EB%9C%BB&ie=utf8&sm=tab_she&qdt=0"
},
{
"position": 3,
"title": "craft",
"link": "https://search.naver.com/search.naver?where=nexearch&query=craft&ie=utf8&sm=tab_she&qdt=0"
},
{
"position": 4,
"title": "mine",
"link": "https://search.naver.com/search.naver?where=nexearch&query=mine&ie=utf8&sm=tab_she&qdt=0"
},
{
"position": 5,
"title": "mojang",
"link": "https://search.naver.com/search.naver?where=nexearch&query=mojang&ie=utf8&sm=tab_she&qdt=0"
}
]
В качестве альтернативы вы можете добиться того же, используя API связанных результатов Naver от SerpApi. Это платный API с бесплатным планом.
Почти то же самое, только не нужно создавать парсер с нуля, поддерживать его, как обходить блокировки от Naver или других поисковых систем, выяснять, какие прокси/капчи надежны, как его масштабировать.
from serpapi import NaverSearch import os, json
params = { # https://docs.python.org/3/library/os.html#os.getenv "api_key": os.getenv("API_KEY"), # your serpapi api key "engine": "naver", # search engine to parse results from "query": "minecraft", # search query "where": "web" # web results }
search = NaverSearch(params) # where data extraction happens results = search.get_dict() # JSON -> Python dictionary
related_results = []
# iterate over "related_results" and extract position, title and link for related_result in results["related_results"]: related_results.append({ "position": related_result["position"], "title": related_result["title"], "link": related_result["link"] })
print(json.dumps(related_results, indent=2, ensure_ascii=False))
Выход:
[
{
"position": 1,
"title": "마인크래프트",
"link": "https://search.naver.com?where=nexearch&query=%EB%A7%88%EC%9D%B8%ED%81%AC%EB%9E%98%ED%94%84%ED%8A%B8&ie=utf8&sm=tab_she&qdt=0"
},
{
"position": 2,
"title": "minecraft 뜻",
"link": "https://search.naver.com?where=nexearch&query=minecraft+%EB%9C%BB&ie=utf8&sm=tab_she&qdt=0"
},
{
"position": 3,
"title": "craft",
"link": "https://search.naver.com?where=nexearch&query=craft&ie=utf8&sm=tab_she&qdt=0"
},
{
"position": 4,
"title": "mine",
"link": "https://search.naver.com?where=nexearch&query=mine&ie=utf8&sm=tab_she&qdt=0"
},
{
"position": 5,
"title": "mojang",
"link": "https://search.naver.com?where=nexearch&query=mojang&ie=utf8&sm=tab_she&qdt=0"
}
]
Ссылки
Outro
Если у вас есть чем поделиться, какие-либо вопросы, предложения или что-то, что работает неправильно, свяжитесь с нами через Twitter по адресу @dimitryzub или @serp_api.
С уважением,
Дмитрий, и остальная часть команды SerpApi.
Присоединяйтесь к нам в Твиттере | "YouTube"
Добавьте Запрос функции💫 или Ошибку🐞
Дополнительные материалы на PlainEnglish.io. Подпишитесь на нашу бесплатную еженедельную рассылку новостей. Подпишитесь на нас в Twitter и LinkedIn. Присоединяйтесь к нашему сообществу Discord.