Python googlesearch API - 更改国家/地区位置并获取广告结果
Python googlesearch API - change country location and get Ads results
我正在尝试使用 Python 中的 googlesearch api 来获取多个查询的前 10 个结果,但我遇到了两个问题:
- 使用 'country' 参数更改国家(例如 country='us' 等)似乎对结果没有任何影响。在几个国家/地区进行了尝试。
- 我想包含广告结果,但找不到任何方法。
如果有人知道如何使用 googlesearch 或任何其他免费 API 做到这一点,那就太好了。
谢谢!
# coding: utf-8
from googlesearch import search
from urlparse import urlparse
import csv
import datetime
keywords = [
"best website builder"
]
countries = [
"us",
"il"
]
filename = 'google_results.csv'
with open(filename, 'w') as f:
writer = csv.writer(f, delimiter=',')
for country in countries:
for keyword in keywords:
print "Showing results for: '" + keyword + "'"
writer.writerow([])
writer.writerow([keyword])
for url in search(keyword, lang='en', stop=10, country=country):
print(urlparse(url).netloc)
print(url)
writer.writerow([urlparse(url).netloc, url])
答案1.你的国家格式不正确
模块正在做的是构建 URL 来发出请求。使用以下格式:
url_search = "https://www.google.%(tld)s/search?hl=%(lang)s&q=%(query)s&btnG=Google+Search&tbs=%(tbs)s&safe=%(safe)s&cr=%(country)s"
当你给它一个国家时,简单地传入 us
或 il
是不够的。您希望国家/地区参数采用 countryXX
的格式,其中 XX 是两个字母的缩写。例如法国是 FR
。所以国家/地区将是 countryFR
.
甚至在源代码中也说这个参数并不总是可靠的。
:param str country: Country or region to focus the search on. Similar to
changing the TLD, but does not yield exactly the same results.
Only Google knows why...
答案 2:使用 JavaScript 动态加载广告。另一方面,这个库只做静态解析。它不执行任何 JavaScript。您将需要 运行 Selenium 或 pyppeteer 让浏览器执行 JavaScript 以获取广告。
遗憾的是,国家/地区定位参数只是向 Google 发出的信号,而不是设置更改。 Google 不会实际向您显示结果,因为它们显示给该国家/地区的匿名用户。所以基本没用。
上面提到的 APIs 也不会解决这个问题,因为它们只使用基于美国的 IP 地址。 (@Link 你能确认吗?如果它不仅在美国服务器上,我会为你的 API 付费。)
因此,您实际上需要 运行 来自 IP 地址位于您目标国家/地区的服务器的此代码,同时还设置了国家/地区语言的浏览器设置参数。
您也无法呈现广告,因为它们是在事后单独呈现的。有一个巨大的行业试图做到这一点,任何成功的人都会收取相当高的费用。但最好的起点是该国家/地区的 IP 地址并使用 selenium。请求不会削减它,如果你想要广告,当然不会。
最后,Google 对自动搜索检测非常激进,因为您自动执行的每次搜索都会显示广告,扭曲他们的广告客户数量,实际上会花费广告客户的钱,即使您没有点击它们(由于到称为质量得分的机制)。
如果您的数量很少,那么在该国家/地区具有私有 IP(例如,不是 AWS 或 Azure 数据中心 IP)的基于 selenium 的脚本是您最好的选择。
如果你想出如何大规模地做到这一点,你就会让人们不顾一切地寻求解决方案。
我正在尝试使用 Python 中的 googlesearch api 来获取多个查询的前 10 个结果,但我遇到了两个问题:
- 使用 'country' 参数更改国家(例如 country='us' 等)似乎对结果没有任何影响。在几个国家/地区进行了尝试。
- 我想包含广告结果,但找不到任何方法。
如果有人知道如何使用 googlesearch 或任何其他免费 API 做到这一点,那就太好了。
谢谢!
# coding: utf-8
from googlesearch import search
from urlparse import urlparse
import csv
import datetime
keywords = [
"best website builder"
]
countries = [
"us",
"il"
]
filename = 'google_results.csv'
with open(filename, 'w') as f:
writer = csv.writer(f, delimiter=',')
for country in countries:
for keyword in keywords:
print "Showing results for: '" + keyword + "'"
writer.writerow([])
writer.writerow([keyword])
for url in search(keyword, lang='en', stop=10, country=country):
print(urlparse(url).netloc)
print(url)
writer.writerow([urlparse(url).netloc, url])
答案1.你的国家格式不正确
模块正在做的是构建 URL 来发出请求。使用以下格式:
url_search = "https://www.google.%(tld)s/search?hl=%(lang)s&q=%(query)s&btnG=Google+Search&tbs=%(tbs)s&safe=%(safe)s&cr=%(country)s"
当你给它一个国家时,简单地传入 us
或 il
是不够的。您希望国家/地区参数采用 countryXX
的格式,其中 XX 是两个字母的缩写。例如法国是 FR
。所以国家/地区将是 countryFR
.
甚至在源代码中也说这个参数并不总是可靠的。
:param str country: Country or region to focus the search on. Similar to
changing the TLD, but does not yield exactly the same results.
Only Google knows why...
答案 2:使用 JavaScript 动态加载广告。另一方面,这个库只做静态解析。它不执行任何 JavaScript。您将需要 运行 Selenium 或 pyppeteer 让浏览器执行 JavaScript 以获取广告。
遗憾的是,国家/地区定位参数只是向 Google 发出的信号,而不是设置更改。 Google 不会实际向您显示结果,因为它们显示给该国家/地区的匿名用户。所以基本没用。
上面提到的 APIs 也不会解决这个问题,因为它们只使用基于美国的 IP 地址。 (@Link 你能确认吗?如果它不仅在美国服务器上,我会为你的 API 付费。)
因此,您实际上需要 运行 来自 IP 地址位于您目标国家/地区的服务器的此代码,同时还设置了国家/地区语言的浏览器设置参数。
您也无法呈现广告,因为它们是在事后单独呈现的。有一个巨大的行业试图做到这一点,任何成功的人都会收取相当高的费用。但最好的起点是该国家/地区的 IP 地址并使用 selenium。请求不会削减它,如果你想要广告,当然不会。
最后,Google 对自动搜索检测非常激进,因为您自动执行的每次搜索都会显示广告,扭曲他们的广告客户数量,实际上会花费广告客户的钱,即使您没有点击它们(由于到称为质量得分的机制)。
如果您的数量很少,那么在该国家/地区具有私有 IP(例如,不是 AWS 或 Azure 数据中心 IP)的基于 selenium 的脚本是您最好的选择。
如果你想出如何大规模地做到这一点,你就会让人们不顾一切地寻求解决方案。