试图抓取谷歌搜索结果时被阻止



我正在使用python和BeautifulSoup来浏览谷歌搜索结果。但我一提出10个以上的请求就遇到了captchas。

我试着使用python请求库和传递用户代理、提供代理、睡眠、验证=False,以及所有可以想象的事情来消除这些captchas,但他们就是不放弃!

我尝试使用selenium网络驱动程序(无头(,但没有成功。

我尝试使用python cURL请求。它的持续时间比请求和selenium要长,但最终会被阻止。

我只想平静地、匿名地搜索谷歌搜索结果。有什么建议吗?

如果您对网站进行web抓取进行了大量请求,最好发送一组不同的HTTP头(用户代理轮换(,使每个请求看起来都是随机的,使其看起来像来自不同的计算机/不同的浏览器:

import requests, random
user_agent_list = [
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.1.1 Safari/605.1.15',
'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:77.0) Gecko/20100101 Firefox/77.0',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:77.0) Gecko/20100101 Firefox/77.0',
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36',
]
for _ in user_agent_list:
#Pick a random user agent
user_agent = random.choice(user_agent_list)
#Set the headers 
headers = {'User-Agent': user_agent}
requests.get('URL', headers=headers)

除了旋转user-agent之外,您还可以旋转代理(理想情况下是住宅(,这些代理可以与CAPTCHA解算器结合使用以绕过CAPTCHA。

此外,如果没有任何效果,您可以使用第三方API SerpApi的Google搜索引擎结果API替代品。这是一个付费的API免费计划。

它将绕过来自谷歌和其他搜索引擎的块(包括CAPTCHA(,不需要创建和维护解析器

这段代码显示了如何从所有页面收集数据(例如在线IDE中(:

from serpapi import GoogleSearch
from urllib.parse import urlsplit, parse_qsl
import json, os
params = {
"api_key": os.getenv("API_KEY"), # serpapi key
"engine": "google",              # serpapi parser engine
"q": "tesla",                    # search query
"num": "100"                     # number of results per page (100 per page in this case)
# other search parameters: https://serpapi.com/search-api#api-parameters
}
search = GoogleSearch(params)      # where data extraction happens
organic_results_data = []
page_num = 0
while True:
results = search.get_dict()    # JSON -> Python dictionary

page_num += 1

for result in results["organic_results"]:
organic_results_data.append({
"page_num": page_num,
"title": result.get("title"),
"link": result.get("link"),
"displayed_link": result.get("displayed_link"),   
})

if "next_link" in results.get("serpapi_pagination", []):
search.params_dict.update(dict(parse_qsl(urlsplit(results.get("serpapi_pagination").get("next_link")).query)))
else:
break

print(json.dumps(organic_results_data, indent=2, ensure_ascii=False))

示例输出:

[
{
"page_num": 1,
"title": "Tesla the Band | Official Website | American Made Rock 'n' ...",
"link": "https://teslatheband.com/",
"displayed_link": "https://teslatheband.com"
},
{
"page_num": 1,
"title": "TSLA: Tesla Inc - Stock Price, Quote and News - CNBC",
"link": "https://www.cnbc.com/quotes/TSLA",
"displayed_link": "https://www.cnbc.com › quotes › TSLA"
},
{
"page_num": 1,
"title": "Tesla, Inc. (TSLA) Stock Price, News, Quote & History",
"link": "https://finance.yahoo.com/quote/TSLA/",
"displayed_link": "https://finance.yahoo.com › quote › TSLA"
},
# ...
]

免责声明,我为SerpApi工作。

HTTP标头信息经常被包含反阻塞技术的网站用来将用户标记为潜在的机器人或爬网程序。换言之,你需要确保头部信息,这是你整个浏览器指纹的一部分,不会让你成为机器人/爬虫。对于谷歌这样的网站来说,为了省去很多麻烦,使用更先进的现成刮刀可能是值得的。它们负责代理旋转、浏览器指纹和头部信息以防止阻塞,其中一些解决方案还包含SERP API以获取搜索引擎结果数据。

最新更新