1

我正在使用非官方的 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

你知道是否有办法绕过限制吗?也许 Google 趋势没有获得新的 IP 地址,因为请求没有被 thor 正确路由。

提前致谢。

4

1 回答 1

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>)

作为附加信息,标准端口应该是:

托尔:9050 | Tor控制:9051

Tor 浏览器:9150 | Tor 浏览器控制:9151

在默认 Tor 配置文件中取消注释“ControlPort 9051”(并添加了我的哈希密码)后,我使用了 9050 和 9051 端口。

于 2016-11-04T01:25:26.847 回答