大家好,欢迎来到IT知识分享网。
总有那么几个网站总是不按照套路出牌。那么微博指数必然是属于其中之一。
1.找到微博指数的网站进入之后,你就会发现界面压根就没有任何的数据。
那么在这个界面呢,我们需要打开浏览器的抓包工具,然后切换成手机端才能让其显示数据。
点击之后刷新按钮,就可以得到数据
然而我们的这个网站是一个异步的加载方式,那么我们该如何知道的呢?
可以在上地的输入框中输入一个关键词,然后在数据保重查找数据,我们可以发现里面没有任何的响应数据。
所以,我们要把位置定位到XHR中,你就会发现他这里只有一两个数据包,
点击之后,我们可以在预览 部分清晰的看到我们刚才输入关键字的数据
那么这里,我们用到的是面向对象式的编程方式。
class Weibospider():
def __init__(self):
self.url = "https://data.weibo.com/index/ajax/newindex/getchartdata"
self.payload = {
'wid': '1091324464527', # 关键词的ID
'dateGroup': '3month',
}
self.headers = {
'Host':'data.weibo.com',
'authority': 'data.weibo.com',
'accept': 'application/json',
'accept-language': 'zh-CN,zh;q=0.9',
'content-type': 'application/x-www-form-urlencoded',
'cookie': 'SINAGLOBAL=8108913659794.359.1655112521493; ULV=1655201947902:1:1:1:4236805201365.277.1655201947897:; SCF=AngLYdv1ECNM1c74i3l1O9Dxw9R7O9k6PvlE-6HQIITeZdBuRE3b-2A9gauZ41DRe8cax1fY0fo0LmsPNBnYaM0.; SUB=_2AkMV9fXydcPxrAZXnvgdxGvmaYtH-jymIJwEAn7uJhMyAxh87n0-qSVutBF-XIovFJYybnGEdsGm7kSTgtdl6urW; SUBP=0033WrSXqPxfM72wWs9jqgMF55529P9D9W5Uf_nkXb9rPHiMgMhNpu5P5JpVF02Re0MXSK.p1hqE; WEB3=a26b5f9819aa17025f1f81fe74bb7a38',
'origin': 'https://data.weibo.com',
'referer': 'https://data.weibo.com/index/newindex?visit_type=trend&wid=1091324464527',
'sec-fetch-dest': 'empty',
'user-agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1',
'x-requested-with': 'XMLHttpRequest'
}
下面就是进行发送请求。
def get_data(self):
r = requests.post(self.url, headers=self.headers, data=self.payload)
# print(r.status_code)
# print(r.json())
return r.json()
解析和保存操作,那么这里是按照需求保存到我们的csv当中,可以根据自己的需求,换成其他的保存方式也可以。
这里需要解释的是,下面的代码中的$是代表层级,..是代表跳过任意层级。后面的x和s则是我们所需要获取的数据。
def parse_data(self, data):
x_time = jsonpath(data, '$..x')[0]
s_data = jsonpath(data, '$..s')[0]
f = open('weibo.csv','w',encoding='gbk',newline='') # gbk收录汉字更广
w = csv.writer(f) # 写入对象
w.writerow(['关键词','日期','时间']) # 按行写入数据
for x, s in zip(x_time, s_data):
print(x, s)
print('=' * 20)
w.writerow(['范冰冰',s,x])
这里呢,是将四个不同的时间板块,放在一个列表当中。达到爬取不同时间板块数据的目的。
def start(self):
for i in data_list:
self.payload['dateGroup']=i
json_data = self.get_data()
self.parse_data(json_data)
if __name__ == '__main__':
a = input('请输入你要检索的关键词:')
data_list = [
'1hour',
'1day', '1month', '3month'
]
abc = Weibospider()
abc.start()
最后是运行结果
def get_data(self):
r = requests.post(self.url, headers=self.headers, data=self.payload)
# print(r.status_code)
# print(r.json())
return r.json()
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/32697.html