事情源于一个读者在后台(新开公众号没有留言功能真是坑)问我有没有查询搜狗指数的Python脚本。这个脚本本来是有的,可拿来一运行出错,原来搜狗指数又改版了。于是重写了代码,也就有了这篇文章。
搜狗指数的防采集做得比较那个啥,所以采集的时候要限制速度或者切换代理。这边没折腾代理,就限制查询速度。即查询一个词随机休眠3-5秒,具体可见代码。如果有可靠的代理资源的话,可以试试使用代理,查询速度可能会快一些。
使用代码之前需要安装requests库,示例代码如下:
import requests,urllib
import time,random
class SouGouIndex(object):
def __init__(self,set_proxies = False):
self.headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'}
self.set_proxies = set_proxies
self.proxies = [{'http': '113.121.22.134:3128'},
{'http': '183.245.98.6:8118'},
{'http': '171.42.22.25:8060'},
] #代理代理,我是代理。
def get_proxie(self):
return random.choice(self.proxies)
def curl(self,url,proxies=None,retries = 2):
try:
html = requests.get(url,headers=self.headers,proxies=proxies,timeout=30).json()
except:
html = {}
if self.set_proxies:
if not html and retries > 0:
proxie = self.get_proxie()
# print('重试第{}次'.format(3-retries))
return self.curl(url,proxie,retries-1)
return html
def get_index(self,url):
html = self.curl(url)
try:
avgWapPv = html['data']['infoList'][0]['avgWapPv']
avgPv = html['data']['infoList'][0]['avgPv']
return avgPv, avgWapPv
except:
return [0,0]
if __name__=="__main__":
s = SouGouIndex() #set_proxies=True开启代理,默认不开启
sougou_index = []
for kw in open('keywords.txt',encoding = 'utf-8'):
kw = kw.rstrip()
url = 'http://zhishu.sogou.com/getRenderData?kwdNamesStr={}&timePeriodType=MONTH&dataType=SEARCH_ALL&queryType=INPUT'.format(
urllib.parse.quote(kw))
total_index,mobile_index = s.get_index(url)
data = '{}\t{}\t{}'.format(kw,total_index,mobile_index)
print(data)
sougou_index.append(data)
time.sleep(random.uniform(3,5)) #随机休眠3-5秒,防止太快被办
with open('搜狗指数.txt','w',encoding='utf-8-sig') as f:
f.writelines([line+'\n' for line in sougou_index])
关键词保存在keywords.txt文件中,一行一个,和脚本文件处于同一文件夹下,运行脚本即可。运行完毕,数据会写入搜狗指数.txt文件中。
请求搜狗指数链接获取数据特别慢,在公司和在家里测试都慢,不得不把timeout时间设置得比较长。如果有可靠的代理,可以考虑设置代理。我在网上找了一些免费代理,测试还不如随机休眠速度快。。。
PS:关注公众号后台回复关键词【搜狗指数】即可获得这份代码,不明白的地方可以私信我。