yagooglesearch
— это библиотека Python для выполнения интеллектуального, реалистичного и настраиваемого поиска в Google. Он имитирует поведение реального человека при поиске в Google, чтобы предотвратить ограничение скорости со стороны Google (ужасный ответ HTTP 429), и если HTTP 429 заблокирован Google, логика отступает и продолжает попытки. Библиотека не использует API Google и во многом основана на библиотеке GoogleSearch. Особенности включают в себя:
requests
для HTTP-запросов и управления файлами cookie.Этот код предоставляется «как есть», и вы несете полную ответственность за его использование. Удаление результатов поиска Google может привести к нарушению их Условий обслуживания. В другой поисковой библиотеке Google Python была интересная информация/обсуждение:
Предпочтительный метод Google — использовать их API.
pip install yagooglesearch
git clone https://github.com/opsdisk/yagooglesearch
cd yagooglesearch
virtualenv -p python3 .venv # If using a virtual environment.
source .venv/bin/activate # If using a virtual environment.
pip install . # Reads from pyproject.toml
import yagooglesearch
query = "site:github.com"
client = yagooglesearch . SearchClient (
query ,
tbs = "li:1" ,
max_search_result_urls_to_return = 100 ,
http_429_cool_off_time_in_minutes = 45 ,
http_429_cool_off_factor = 1.5 ,
# proxy="socks5h://127.0.0.1:9050",
verbosity = 5 ,
verbose_output = True , # False (only URLs) or True (rank, title, description, and URL)
)
client . assign_random_user_agent ()
urls = client . search ()
len ( urls )
for url in urls :
print ( url )
Несмотря на то, что поиск в Google через графический интерфейс отображает сообщение типа «Около 13 000 000 результатов», это не означает, что yagooglesearch
найдет что-то близкое к этому. Тестирование показывает, что возвращается максимум около 400 результатов. Если вы установите 400 < max_search_result_urls_to_return
, в журналы будет напечатано предупреждающее сообщение. См. обсуждение в № 28.
Низкая и медленная стратегия при выполнении поиска в Google с использованием yagooglesearch
. Если вы начнете получать ответы HTTP 429, Google по праву обнаружит вас как бот и заблокирует ваш IP-адрес на определенный период времени. yagooglesearch
не может обойти CAPTCHA, но вы можете сделать это вручную, выполнив поиск Google в браузере и доказав, что вы человек.
Критерии и пороги блокировки неизвестны, но в целом рандомизации пользовательского агента, ожидания достаточного времени между результатами постраничного поиска (7–17 секунд) и достаточного времени ожидания между различными поисками в Google (30–60 секунд) должно быть достаточно. Однако ваш пробег определенно будет отличаться. Использование этой библиотеки с Tor, скорее всего, быстро заблокирует вас.
Если yagooglesearch
обнаружит ответ HTTP 429 от Google, он перейдет в режим ожидания http_429_cool_off_time_in_minutes
минут, а затем повторит попытку. Каждый раз, когда обнаруживается HTTP 429, время ожидания увеличивается в http_429_cool_off_factor
.
Цель состоит в том, чтобы заставить yagooglesearch
беспокоиться об обнаружении и восстановлении HTTP 429, а не нагружать скрипт, использующий его.
Если вы не хотите, чтобы yagooglesearch
обрабатывал HTTP 429 и предпочитаете обрабатывать его самостоятельно, передайте yagooglesearch_manages_http_429s=False
при создании экземпляра объекта yagooglesearch. Если обнаружен HTTP 429, строка «HTTP_429_DETECTED» добавляется к объекту списка, который будет возвращен, и вам решать, каким должен быть следующий шаг. Объект списка будет содержать все URL-адреса, найденные до обнаружения HTTP 429.
import yagooglesearch
query = "site:twitter.com"
client = yagooglesearch . SearchClient (
query ,
tbs = "li:1" ,
verbosity = 4 ,
num = 10 ,
max_search_result_urls_to_return = 1000 ,
minimum_delay_between_paged_results_in_seconds = 1 ,
yagooglesearch_manages_http_429s = False , # Add to manage HTTP 429s.
)
client . assign_random_user_agent ()
urls = client . search ()
if "HTTP_429_DETECTED" in urls :
print ( "HTTP 429 detected...it's up to you to modify your search." )
# Remove HTTP_429_DETECTED from list.
urls . remove ( "HTTP_429_DETECTED" )
print ( "URLs found before HTTP 429 detected..." )
for url in urls :
print ( url )
yagooglesearch
поддерживает использование прокси. Предоставленный прокси-сервер используется на протяжении всего жизненного цикла поиска, чтобы он выглядел более человечным, вместо того, чтобы переключаться между различными прокси-серверами для разных частей поиска. Общий жизненный цикл поиска таков:
google.com
Чтобы использовать прокси, укажите строку прокси при инициализации объекта yagooglesearch.SearchClient
:
client = yagooglesearch . SearchClient (
"site:github.com" ,
proxy = "socks5h://127.0.0.1:9050" ,
)
Поддерживаемые схемы прокси основаны на тех, которые поддерживаются в библиотеке requests
Python (https://docs.python-requests.org/en/master/user/advanced/#proxies):
http
https
socks5
— «заставляет разрешение DNS происходить на клиенте, а не на прокси-сервере». Вероятно, вам это не нужно, поскольку все запросы DNS будут исходить из того места, где запускается yagooglesearch
, а не через прокси.socks5h
— «Если вы хотите разрешить домены на прокси-сервере, используйте в качестве схемы «socks5h». Это лучший вариант, если вы используете SOCKS, поскольку поиск DNS и поиск в Google выполняются с IP-адреса прокси. Если вы используете самозаверяющий сертификат для прокси-сервера HTTPS, вам, вероятно, потребуется отключить проверку SSL/TLS в следующих случаях:
yagooglesearch.SearchClient
: import yagooglesearch
query = "site:github.com"
client = yagooglesearch . SearchClient (
query ,
proxy = "http://127.0.0.1:8080" ,
verify_ssl = False ,
verbosity = 5 ,
)
query = "site:github.com"
client = yagooglesearch . SearchClient (
query ,
proxy = "http://127.0.0.1:8080" ,
verbosity = 5 ,
)
client . verify_ssl = False
Если вы хотите использовать несколько прокси-серверов, эта нагрузка ложится на сценарий, использующий библиотеку yagooglesearch
для создания экземпляра нового объекта yagooglesearch.SearchClient
с другим прокси-сервером. Ниже приведен пример цикла по списку прокси:
import yagooglesearch
proxies = [
"socks5h://127.0.0.1:9050" ,
"socks5h://127.0.0.1:9051" ,
"http://127.0.0.1:9052" , # HTTPS proxy with a self-signed SSL/TLS certificate.
]
search_queries = [
"python" ,
"site:github.com pagodo" ,
"peanut butter toast" ,
"are dragons real?" ,
"ssh tunneling" ,
]
proxy_rotation_index = 0
for search_query in search_queries :
# Rotate through the list of proxies using modulus to ensure the index is in the proxies list.
proxy_index = proxy_rotation_index % len ( proxies )
client = yagooglesearch . SearchClient (
search_query ,
proxy = proxies [ proxy_index ],
)
# Only disable SSL/TLS verification for the HTTPS proxy using a self-signed certificate.
if proxies [ proxy_index ]. startswith ( "http://" ):
client . verify_ssl = False
urls_list = client . search ()
print ( urls_list )
proxy_rotation_index += 1
Если у вас есть значение файла cookie GOOGLE_ABUSE_EXEMPTION
, его можно передать в google_exemption
при создании экземпляра объекта SearchClient
.
Параметр &tbs=
используется для указания дословных или временных фильтров.
&tbs=li:1
Временной фильтр | &tbs= параметр URL | Примечания |
---|---|---|
Прошлый час | qdr:h | |
Прошлый день | qdr:d | Прошлые 24 часа |
Прошедшая неделя | qdr:w | |
Прошлый месяц | qdr:m | |
Прошлый год | qdr:y | |
Обычай | cdr:1,cd_min:01.01.2021,cd_max:01.06.2021 | См. функцию yagooglesearch.get_tbs(). |
В настоящее время функция .filter_search_result_urls()
удалит любой URL-адрес, содержащий слово «google». Это необходимо для предотвращения загрязнения возвращаемых URL-адресов поиска URL-адресами Google. Обратите внимание на это, если вы пытаетесь явно выполнить поиск результатов, URL-адрес которых может содержать слово «google», например site:google.com computer
Распространяется по лицензии BSD с 3 пунктами. См. ЛИЦЕНЗИЯ для получения дополнительной информации.
@opsdisk
Ссылка на проект: https://github.com/opsdisk/yagooglesearch