yagooglesearch
เป็นไลบรารี Python สำหรับดำเนินการค้นหา Google ที่ชาญฉลาด ดูสมจริง และปรับแต่งได้ มันจำลองพฤติกรรมการค้นหาโดย Google ของมนุษย์จริงๆ เพื่อป้องกันการจำกัดอัตราโดย Google (การตอบสนอง HTTP 429 ที่น่ากลัว) และหาก HTTP 429 ถูกบล็อกโดย Google ตรรกะในการถอยกลับและลองต่อไป ไลบรารีไม่ได้ใช้ Google API และอิงจากไลบรารี GoogleSearch เป็นหลัก คุณสมบัติประกอบด้วย:
requests
สำหรับคำขอ HTTP และการจัดการคุกกี้รหัสนี้ให้มาตามที่เป็นอยู่ และคุณจะต้องรับผิดชอบอย่างเต็มที่ต่อวิธีใช้งานรหัสนี้ การคัดลอกผลการค้นหาของ 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 )
แม้ว่าการค้นหา Google ผ่าน GUI จะแสดงข้อความเช่น "ประมาณ 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
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/#proxy):
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
ก็สามารถส่งผ่านไปยัง google_exemption
ได้เมื่อสร้างอินสแตนซ์ออบเจ็กต์ SearchClient
พารามิเตอร์ &tbs=
ใช้เพื่อระบุตัวกรองแบบคำต่อคำหรือตามเวลา
&tbs=li:1
ตัวกรองเวลา | &tbs= พารามิเตอร์ URL | หมายเหตุ |
---|---|---|
ชั่วโมงที่ผ่านมา | qdr:ชม | |
วันที่ผ่านมา | คิวดร:ดี | 24ชม.ที่ผ่านมา |
สัปดาห์ที่ผ่านมา | qdr:w | |
เดือนที่ผ่านมา | qdr:ม | |
ปีที่ผ่านมา | qdr:y | |
กำหนดเอง | cdr:1,cd_min:1/1/2564,cd_max:6/1/2564 | ดูฟังก์ชัน yagooglesearch.get_tbs() |
ในปัจจุบัน ฟังก์ชัน .filter_search_result_urls()
จะลบ URL ใดๆ ที่มีคำว่า "google" อยู่ในนั้น นี่เป็นการป้องกันไม่ให้ URL การค้นหาที่ส่งคืนถูกปนเปื้อนด้วย URL ของ Google โปรดทราบว่าหากคุณพยายามค้นหาผลลัพธ์ที่อาจมี "google" ใน URL อย่างชัดเจน เช่น site:google.com computer
เผยแพร่ภายใต้ใบอนุญาต BSD 3-Clause ดูใบอนุญาตสำหรับข้อมูลเพิ่มเติม
@opsdisk
ลิงค์โครงการ: https://github.com/opsdisk/yagooglesearch