我正在使用非官方Google趋势API(https://github.com/GeneralMills/pytrends#trend)编写代码,但在几乎10次请求后,我收到了以下错误:Exceeded Google's Rate Limit. Please use time.sleep() to space requests.
以下命令似乎无法正确连接到Google服务。
pytrends = TrendReq(google_username, google_password, custom_useragent=None)
因此,我尝试按照此处的说明更改我的IP地址和Tor浏览器:https://stackoverflow.com/a/34516846/7110706
controller = Controller.from_port(port=9151)
def connectTor():
socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5 , "127.0.0.1", 9150, True)
socket.socket = socks.socksocket
def renew_tor():
controller.authenticate()
controller.signal(Signal.NEWNYM)
def showmyip():
url = "http://www.showmyip.gr/"
r = requests.Session()
page = r.get(url)
soup = BeautifulSoup(page.content, "lxml")
ip_address = soup.find("span",{"class":"ip_address"}).text.strip()
print('New IP adress is:' + ip_address)
主要问题在以下代码中:
def requestDailydatafromGT(keywords, geography, date): #parameters must be strings
from pytrends.request import TrendReq
import time
from random import randint
google_username = "" #put your gmail account
google_password = ""
path = ""
#Connect to google
pytrend = TrendReq(google_username, google_password, custom_useragent=None)
requestdate=str(date)+' 3m'
trend_payload = {'q': keywords,'hl': 'en-US','geo': geography, 'date': requestdate} #define parameters of the request
mes=0
while mes==0:
try:
results= pytrend.trend(trend_payload, return_type='dataframe').sort_index(axis=0, ascending=False) #launch request in Google tren0ds
mes=1
except Exception:
renew_tor()
connectTor()
time.sleep(randint(5,15))
mes=0
return results
代码似乎随着IP地址的变化而变化,但是我仍然遇到Google请求配额限制错误:
超过了Google的费率限制。请使用time.sleep()来分隔请求。
新IP地址为:178.217.187.39
超过了Google的费率限制。请使用time.sleep()来分隔请求。
新IP地址为:95.128.43.164
您知道是否有办法绕过限制?也许谷歌趋势没有得到新的IP地址,因为请求没有被托尔正确路由。
提前致谢。
答案 0 :(得分:2)
你是否已经尝试过(重新)在while循环中连接到Google?
while mes == 0:
pytrend = TrendReq(google_username, google_password, custom_useragent=None) # Connect to google
try:
results = pytrend.trend(trend_payload, return_type='dataframe').sort_index(axis=0, ascending=False) # Launch request in Google Trends
mes = 1
更新1:正如OP告诉我的那样,我的解决方案只有在使用随机用户代理时才有效。
因此,类似下面的代码应该有效:
def random_word(length):
"""Return a random word of 'length' letters."""
return ''.join(random.choice(string.ascii_letters) for i in range(length))
[...]
def requestDailydatafromGT(keywords, geography, date): #parameters must be strings
[...]
while mes == 0:
pytrend = TrendReq(google_username, google_password, custom_useragent=random_word(8)) # Connect to Google
try:
results = pytrend.trend(trend_payload, return_type='dataframe').sort_index(axis=0, ascending=False) # Launch request in Google Trends
mes = 1
[...]
更新2:每次续订Tor时都无需进行身份验证。 您可以在控制器创建后执行一次。
controller = Controller.from_port(port=9051)
controller.authenticate(<YOUR_TOR_CONTROL_PASSWORD>)
作为附加信息,标准端口应为:
Tor:9050 | Tor控制:9051
Tor浏览器:9150 | Tor浏览器控件:9151
在默认的Tor配置文件中添加了未注释的“ControlPort 9051”(并添加了我的哈希密码)后,我使用了9050和9051端口。