人民网留言板为动态加载网站,但是可以通过网络查看到数据接口,所以可以简单的获取数据。废话不多说,直接上代码。
# -*- codeing = utf-8 -*-
# @Time : 2024/6/18 0018 15:36
# @Author : Kevin
# @File : main.py
# @Software : PyCharm
import requests
import json
import pandas as pd
import re
from datetime import datetime
#抓取一页数据
def SpiderOnePage(pageindex):
url='http://liuyan.people.com.cn/v2/threads/search?sortType=1'
headers={
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36 Core/1.94.252.400 QQBrowser/12.6.5677.400',
'Referer':'http://liuyan.people.com.cn/messageSearch?keywords=%E6%83%A0%E6%B5%8E%E5%8C%BA'
}
'''
参数转化,为了拼接页码
但是实际测试是没太大意义,只做学习用途
'''
param= "{\"position\":0,\"keywords\":\"惠济区\",\"fid\":null,\"domainId\":null,\"typeId\":null,\"timeRange\":null,\"ansChecked\":true,\"stTime\":null,\"sortType\":\"1\",\"page\":"+str(pageindex)+",\"rows\":10,\"threadsStatus\":2}"
'''
数据拼接
signature这个为签名,由JS根据MD5加密方式产生,服务器端进行验证,每一次请求会产生新的,
所以直接使用换页访问的方式无法获取到数据,因此单次只能获取一页数据,
因仅测试学习,未做深入研究
当然,还可以通过selenium方式进行获取
'''
data={
'appCode': "PC42ce3bf35534a9",
'param': param ,
'signature': "57d0181c6696b009a21153011c39ef0c",
'token': ""
}
#请求数据
resPage=requests.post(url=url,headers=headers,data=data)
#将json数据转化为Python对象,方便操作
res=json.loads(resPage.text)
print(res)
if(res['msg']!='ok'): #如果状态不对 则直接返回
return False
data=res['data']['data'] #获取整页的信息列表
#循环当页数据,获取指定栏位的值
#并对值进行加工
for contentTemp in data:
contentTemp['content'] = re.sub('<[^<]+?>', '', contentTemp['content'])
contentTemp['subject'] = re.sub('<[^<]+?>', '', contentTemp['subject'])
contentTemp['createDateline'] = datetime.utcfromtimestamp(contentTemp['createDateline']).strftime('%Y-%m-%d %H:%M:%S')
contentTemp['dateline'] = datetime.utcfromtimestamp(contentTemp['dateline']).strftime('%Y-%m-%d %H:%M:%S')
contentTemp['threadsCheckTime'] = datetime.utcfromtimestamp(contentTemp['threadsCheckTime']).strftime('%Y-%m-%d %H:%M:%S')
contentTemp['lastAnswerTime'] = datetime.utcfromtimestamp(contentTemp['lastAnswerTime']).strftime('%Y-%m-%d %H:%M:%S')
contentTemp['canHurryTime'] = datetime.utcfromtimestamp(contentTemp['canHurryTime']).strftime('%Y-%m-%d %H:%M:%S')
print(data)
df = Createxlsx(data)
def SpiderOneItem():
print('1')
def Createxlsx(data):
df = pd.DataFrame(data,columns=['content','subject','typeName','domainName','createDateline','lastAnswerTime', 'stateInfo'])
df.to_excel('人民网.xlsx',index=False)
if __name__=='__main__':
pageindex=3
SpiderOnePage(pageindex)
over!