Google趋势 - 配额限制 - IP地址转换器

时间:2016-11-03 16:16:07

标签: python python-3.x web-scraping tor google-trends

我正在使用非官方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地址,因为请求没有被托尔正确路由。

提前致谢。

1 个答案:

答案 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端口。