抓取动态网页(一下动态网站快讯 )
优采云 发布时间: 2021-09-27 20:03抓取动态网页(一下动态网站快讯
)
今天研究了一下动态网站的爬取,以及这里使用的世轩股票宝网站:
这个小案例简单抓取了轩宝的7x24时事通讯的信息内容,并将数据保存在Mysql数据库中。
网页分为静态网页和动态网页。静态网页一般是指不与嵌入在页面或js中的后端数据交互的网页,而动态网页通过Ajax与数据库交互,可以实时从数据库中获取数据并显示在页面上.
如何判断一个网站是动态的网站:
1. 浏览网页时,部分网站可以在翻页的同时不断向下滚动和加载数据。这通常是动态的网站。
2. 也可以在网络上查看XHR,在浏览器控制台查看和后台数据交互记录。
首先,我们必须找到数据源。经过观察,我们发现时事通讯是由上图中名为newsflash的请求加载的。通过这个请求,我们可以得到他的url,10,723,35,469,821&platform=pcweb。通过观察这个请求,我们可以找到newsflashlimit参数控制请求。返回的记录数,游标是毫秒时间戳,因为这里的咨询内容是动态更新的,每隔一段时间就会加载新的咨询,这里是按时间排序的,所以只要控制这两个参数就可以得到咨询你想要的内容。
这里我尝试抓取一个时间段内的咨询内容,时间间隔设置为10分钟。也就是说,每次咨询内容在10分钟内生成,当然可能会有重复,这里就不做处理了。
用于时间戳和时间转换的在线工具:
代码显示如下
#!/usr/bin/env python
# -*- 编码:utf-8 -*-
# @File: 蜘蛛侠.py
# @Author: 小橙
# @日期:2019-1-6
# @Desc :Dynamic 网站 抓取选择共享
*敏*感*词*请求
从 fake_useragent 导入 UserAgent
从 sqlalchemy 导入 create_engine
将熊猫导入为 pd
导入时间
#时间:1月7日12:00-17:00
#对应时间戳:00-00
#发送请求获取返回数据
定义获取数据(网址):
如果 url 为 None:
返回
ua = 用户代理()
headers = {'User-Agnet':ua.random}
r = requests.get(url,headers=headers)
如果 r.status_code == 200:
#如果请求返回的是json格式的数据,可以使用json()函数
#也可以使用json.load()函数将json格式的字符串转换成json对象
返回 r.json()
#提取返回数据中的字段信息
定义解析器数据(数据):
#提取数据中的id、title、汇总字段信息
retdata = data.get('数据')
msglist = retdata.get('消息')
保存列表 = []
对于 msglist 中的 msg:
id = int(msg.get('id'))
title = msg.get('title')
总结 =''
#summary中的字段为空时,将title的值赋给summary
如果 msg.get('summary') !='':
summary = msg.get('summary').replace('\n','')#去掉摘要中的换行符
别的:
摘要 = 标题
温度 = []
temp.append(id)
temp.append(标题)
temp.append(总结)
savelist.append(temp)
返回保存列表
#保存数据到数据库
def saveData(result_data,con):
#向数据库写入数据
如果 len(result_data)>0:
#这里创建DataFrame的时候忘记加header了,写数据的时候一直报错
df = pd.DataFrame(result_data,columns=['id','title','summary'])
# 打印('df:',df)
#如果要自动建表,用replace替换if_exists的值,建议自己建表,if_exists的值是append
#name是表名,con是数据库连接
df.to_sql(name="stock_news", con=con, if_exists='append', index=False)
# print('数据保存成功!')
#获取数据库连接
def getContact():
#连接数据库
engine = create_engine('mysql+pymysql://root:123456@localhost:3306/demo01?charset=utf8')
con = engine.connect()
print('Mysql 连接创建成功...')
返回引擎
如果 __name__ =='__main__':
url =';cursor={}&subj_ids=9,10,723,35,469,821&platform=pcweb'
开始时间 = 00
con = getContact() #创建数据库连接
计数 = 0
为真:
#这里设置的时间间隔是10分钟,意思是每次取消息10分钟内更新
结束时间 = 开始时间 + 600000
如果 end_time>00:
休息
开始时间 = 结束时间
now_url = url.format(end_time)
数据 = 获取数据(now_url)
time.sleep(2) #每2秒请求一次
result_data = parserData(data)
# 打印(结果数据)
保存数据(result_data,con)
计数 += len(result_data)
print('{} 数据保存成功!'.format(count))
两小时的测试更新