使用selenium在没有检测的情况下获得谷歌搜索结果



我正在尝试制作一个自定义的索引检查实用程序,以检查谷歌使用Python和selenium 对哪些URL进行了索引

我需要得到谷歌搜索结果,这样我就可以检查查询的网址是否存在于结果中。在获得Google Captcha之前,我可以获得50到60个结果。

下面是我关心的代码

options = webdriver.FirefoxOptions()
options.set_headless()
driver = webdriver.Firefox(executable_path=r'./geckodriver', firefox_options=options)
urls = [line.strip() for line in open('urls.txt', 'r')]
url_search = "https://www.google.com/search?"
for c, link in enumerate(urls):
query = {'q': link}
full_url = url_search + urlencode(query)
driver.get(full_url)
soup = BeautifulSoup(driver.page_source, 'html.parser')

我试过在无头模式下使用ChromeDriver和gecko驱动程序,但得到了相同的结果。

我主要关心的是如何在不被检测到的情况下使用硒?

我知道谷歌不允许抓取,但有一些付费API可以做完全相同的事情,即提供谷歌搜索结果。他们工作得怎么样??!!

我也搜索过Google API,但找不到适合我用例的API。

此外,如果谷歌不允许抓取,为什么它会让抓取器抓取有限的次数?

谢谢你抽出时间,我真的很感激。

绕过谷歌CAPTCHA真的没什么可做的。您可以尝试更改用户代理和其他一些属性。这篇文章可能对你有所帮助。

对于你的最后一个问题,谷歌似乎有一个搜索API,你可以免费使用(当然也有付费计划(。这是一篇关于它的博客文章。

如果一个网站不想让你刮它,你通常无能为力,尤其是对于谷歌或亚马逊这样的网站。事实上,这也是一个你是否应该这样做的问题。

我知道谷歌不允许抓取,但有一些付费API可以做完全相同的事情,即提供谷歌搜索结果。他们工作得怎么样??!!

他们使用的工具与您正在使用的工具类似,只是规模更大。一个例子是容器中的多个刮擦代理,每个代理都使用不同的代理,直到它们被检测到为止。然后,特工们将他们的发现结合起来,重新开始进一步搜寻。

此外,如果谷歌不允许抓取,那么为什么它会让抓取器抓取有限的次数?

这可能会发生,因为可能需要一些时间才能确定是否正在使用机器人程序。此外,在他们认定你滥用了他们的服务之前,你可能需要等待一段时间。

不过,有几件事你可以尝试一下。您可以将User Agent与Selenium一起使用,并将其包含在选项中:options.add_argument('--disable-blink-features=AutomationControlled')。后者为一些使用Selenium的Chrome网站创造了奇迹,但我不确定Firefox是否也是如此。

您可以使用requestsbs4库而不是selenium,因为Google搜索结果中的所有内容都位于HTML中。

请确保您使用user-agent来伪造真实的用户访问,因为如果您使用的是requests库,默认的user-agent将是python请求,我们需要避免它。

假设你想从标题中抓取标题和URL,例如在线IDE:

from bs4 import BeautifulSoup
import requests, lxml
# Faking real user visit.
headers = {
"User-Agent":
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3538.102 Safari/537.36 Edge/18.19582"
}
# Search query.
params = {'q': 'ice cream'}

html = requests.get(f'https://www.google.com/search?q=',
headers=headers,
params=params).text
# select() uses CSS selectors. It's like findAll() or find_all(), you can iterate over it.
# if you want to scrape just one element, you can use select_one() method instead.
for result in soup.select('.yuRUbf'):
title = result.select_one('.DKV0Md').text
link = result.select_one('a')['href']
print(f'{title}n{link}n')

或者,您可以使用SerpApi的Google搜索引擎结果API来实现这些结果。这是一个付费的API,免费试用5000次搜索。

在线IDE中要集成的代码和示例:

import os
from serpapi import GoogleSearch
params = {
"engine": "google",
"q": "ice cream",
"api_key": os.getenv("API_KEY"),
}
search = GoogleSearch(params)
results = search.get_dict()
# Iterates over JSON output and prints Title, Snippet (summary) and link on the new line
for result in results["organic_results"]:
print(f"Title: {result['title']}nSummary: {result['snippet']}nLink: {result['link']}n")

免责声明,我为SerpApi工作。

相关内容

最新更新