yagooglesearch
是一個 Python 程式庫,用於執行智慧、逼真且可調的 Google 搜尋。它模擬真實的人類 Google 搜尋行為,以防止 Google 進行速率限制(可怕的 HTTP 429 回應),如果 HTTP 429 被 Google 阻止,則邏輯會後退並繼續嘗試。該庫不使用 Google API,並且很大程度上基於 googlesearch 庫。其特點包括:
requests
庫進行 HTTP 請求和 cookie 管理程式碼按原樣提供,您對其使用方式承擔全部責任。抓取 Google 搜尋結果可能違反其服務條款。另一個 Python Google 搜尋庫有一些有趣的資訊/討論:
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 )
儘管透過 GUI 搜尋 Google 將顯示類似「大約 13,000,000 個結果」的訊息,但這並不意味著yagooglesearch
會找到與此接近的任何內容。測試最多回傳400條左右的結果。如果您設定 400 < max_search_result_urls_to_return
,一條警告訊息將會列印到日誌中。參見#28 的討論。
使用yagooglesearch
執行 Google 搜尋時的策略是低而慢。如果您開始收到 HTTP 429 回應,則 Google 已正確地將您偵測為機器人,並將在一段時間內封鎖您的 IP。 yagooglesearch
無法繞過驗證碼,但您可以透過從瀏覽器執行 Google 搜尋並證明您是人類來手動執行此操作。
被阻止的標準和閾值尚不清楚,但一般來說,隨機化用戶代理、在分頁搜尋結果之間等待足夠的時間(7-17 秒)以及在不同的Google 搜尋之間等待足夠的時間(30 -60 秒)就足夠了。不過,您的里程肯定會有所不同。將這個庫與 Tor 一起使用可能會讓你很快被封鎖。
如果yagooglesearch
偵測到來自 Google 的 HTTP 429 回應,它將休眠http_429_cool_off_time_in_minutes
分鐘,然後再試一次。每次偵測到 HTTP 429 時,等待時間都會增加http_429_cool_off_factor
倍。
目標是讓yagooglesearch
擔心 HTTP 429 檢測和恢復,而不會給使用它的腳本帶來負擔。
如果您不希望yagooglesearch
處理 HTTP 429 而希望自己處理,請在實例化 yagooglesearch 物件時傳遞yagooglesearch_manages_http_429s=False
。如果偵測到 HTTP 429,字串「HTTP_429_DETECTED」將會加入到將傳回的清單物件中,下一步應該由您決定。清單物件將包含在偵測到 HTTP 429 之前找到的所有 URL。
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" ,
)
支援的代理方案是基於 Python requests
庫中支援的方案 (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
如果您有GOOGLE_ABUSE_EXEMPTION
cookie 值,則可以在實例化SearchClient
物件時將其傳遞到google_exemption
中。
&tbs=
參數用於指定逐字過濾器或基於時間的過濾器。
&tbs=li:1
時間過濾器 | &tbs= URL 參數 | 筆記 |
---|---|---|
過去一小時 | 季度:h | |
過去的一天 | qdr:d | 過去 24 小時 |
過去一周 | qdr:w | |
過去一個月 | 日期:米 | |
去年 | qdr:y | |
風俗 | cdr:1,cd_min:1/1/2021,cd_max:6/1/2021 | 請參閱 yagooglesearch.get_tbs() 函數 |
目前, .filter_search_result_urls()
函數將刪除任何包含「google」一詞的網址。這是為了防止傳回的搜尋 URL 被 Google URL 污染。如果您嘗試明確搜尋 URL 中可能包含「google」的結果(例如site:google.com computer
,請注意這一點
根據 BSD 3 條款許可證分發。請參閱許可證以了解更多資訊。
@opsdisk
專案連結:https://github.com/opsdisk/yagooglesearch