我正在尝试制作一个自定义的索引检查实用程序,以检查谷歌使用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是否也是如此。
您可以使用requests
和bs4
库而不是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工作。