百度搜索下 进入页面发现需要使用移动端
我们打开控制台,F12,点击移动版,然后刷新页面
可以进入搜索界面。
可以看到有一个post的接口,参数正是我们输入的关键词
当这个关键词被收录的时候。
会有提示,我们点击下面的蓝色关键词,进入详情页面。
点击30天,会出现新的请求。
参数是wid 和 1month
而这个wid,就是在之前搜索页面输入已经被收录的关键词后,返回的response中
所以我们的逻辑就是,先通过搜索接口 拿到关键词的wid,然后通过详情接口,用wid 来获取详情数据。
代码如下:
import requests
import json
import re
class WeiboZhishu():
def __init__(self):
self.search_word_api = 'https://data.weibo.com/index/ajax/newindex/searchword'
self.get_data_url = 'https://data.weibo.com/index/ajax/newindex/getchartdata'
self.headers = {
'Referer': 'https://data.weibo.com/index/newindex?visit_type=trend&wid=120190311105634317618',
'Origin': 'https://data.weibo.com',
'X-Requested-With': 'XMLHttpRequest',
'Content-Type': 'application/x-www-form-urlencoded',
'Accept': 'application/json',
'User-Agent': 'Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Mobile Safari/537.36',
}
def search_wid(self,program_name):
data_search = {
"word": program_name,
}
search_text = requests.post(self.search_word_api, data=data_search, headers=self.headers).text
search_json = json.loads(search_text)
if search_json['code'] ==100:
wid = search_json['html']
wid = re.findall('wid="(.*?)"', wid, re.S)[0]
return wid
else:
return None
def req_post(self,url,data,proxy_result):
if proxy_result:
req_post_text = requests.post(url=url,data=data,headers = self.headers,proxies=proxy_result).text
return req_post_text
else:
req_post_text = requests.post(url=url,data=data,headers = self.headers).text
return req_post_text
def get_data(self,program_name,timer):
wid = self.search_wid(program_name)
if not wid:
return -1,-1,-1
data_get = {
'dateGroup': timer,
'wid': wid
}
data_text = requests.post(self.get_data_url, data=data_get,headers=self.headers).text
json_text = json.loads(data_text)
if json_text['code'] == 100:
x = json_text['data'][0]['trend']['x']
end_x = json_text['data'][0]['trend']['end_x']
s = json_text['data'][0]['trend']['s']
return x,s[-1]
zhishu = WeiboZhishu()
x,s = zhishu.get_data('乐队的夏天','1day')
if x ==-1:
print("请求有误---请检查节目是否被微博指数收录")
else:
print(s)