抓取动态网页(url网络url=10,723,35=30)
优采云 发布时间: 2021-12-24 15:15抓取动态网页(url网络url=10,723,35=30)
块标签,打开后没有网页数据json
点击网络选项卡,可以看到网页向服务器发送了很多请求,而且数据量很大,找起来太费时间了
通过点击XHR分类,我们可以减少很多不必要的文件,节省很多时间。接口
【XHR 类型是指通过 XMLHttpRequest 方法发送的请求。它可以在后台与服务器交换数据,这意味着它可以在不加载整个网页的情况下更新网页某一部分的内容。也就是说从数据库请求然后接收到的数据是XHR类型的]浏览器
然后我们开始在XHR类型下一一搜索,发现如下数据服务器
检查请求的消息头并获取其url网络
url=",10,723,35,469,821&limit=30" 函数
在 Firefox 的新窗口中打开地址
打开后,我们可以看到上面的情况,这是一个json格式的文件。然后,它的数据信息以字典的形式存储,数据全部存储在“NewMsgs”键中。
因此,我们可以通过访问["NewMsgs"]的键值来获取网页数据
然后我们会检查我们需要的“好”和“坏”对应的关键值,以及时事通讯推荐的股票和行业的关键值。
查字典后,我们可以很快发现推荐的股票是一个嵌套的字典。字典加列表加字典的情况对应的key值为["NewMsgs"][i]['Stocks']同理,对应的推荐行业key值:["NewMsgs"][i]['BkjInfoArr']
通过对比网页数据,我们可以找到对应的“好”和“坏”通讯。
经过比较,我们发现好标签对应的“Impact”值为1,没有标签的为“0”,坏标签对应的值为“-1”。
知道数据的位置后,我们开始编写代码。
先爬取网页,伪装成火狐浏览器,通过添加headers访问数据库地址,防止被识别后被拦截。
def get_page(url):
headers={
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.79 Safari/537.36'
}
req = urllib.request.Request(url=url,headers=headers)
res = urllib.request.urlopen(req)
html = res.read().decode()
return html
从上面的分析可以知道,数据是以json格式存储的,所以上面爬取的网页返回的html是json格式的数据。所以我们必须格式化json。
json.dumps()#把python对象转化成json格式对象
json.loads()#把json格式转化成python对象
转换后我们可以通过下面字典的键值输出“好”、“坏”、推荐“股票”、推荐“行业”
行业:html["NewMsgs"][i]['BkjInfoArr']
时间:html["NewMsgs"][i]['UpdatedAt']
股票:html["NewMsgs"][i]['Stocks'][j]['Name']
利好:html["NewMsgs"][i]['Impact'] Impact = -1 --->利空 Impact = 1 --->利好
因此,获取数据的代码为:
def get_data(html,url):
html = json.loads(html)
c = len(html["NewMsgs"])
for i in range(0,c):
cun =html["NewMsgs"][i]['Impact']#获取含有信息的字典
if cun == 1 or cun == -1:#判断信息是利好仍是利空
print(html["NewMsgs"][i]['UpdatedAt'])
if cun == 1:
print("*************利好*************")
if cun == -1:
print('*************利空*************')
chang = len(html["NewMsgs"][i]['BkjInfoArr'])#获取信息下含有几个利好或利空行业
ch =html["NewMsgs"][i]['Stocks']
for j in range(0,chang):
print('行业:',html["NewMsgs"][i]['BkjInfoArr'][j]['Name'])
if ch!=None:
du = len(html["NewMsgs"][i]['Stocks'])#同理获取含有几个利好或利空股票
for k in range(0,du):
print('股票:',html["NewMsgs"][i]['Stocks'][k]['Name'])
print("**************************\n\n")#信息获取完毕,换行
return 0
运行后发现获取的数据并不多,只能获取“点击加载更多”上显示的内容,无法获取点击加载后的数据。
我们的爬虫无法爬取这么少的数据。我们需要的是一个可以在点击“加载更多”按钮后抓取数据的爬虫。否则,使用爬虫并不像直接访问网站那么简单。那么如何与以下数据一起捕获呢?
让我们再次输入review元素的XHR类型,点击“加载更多”按钮,然后在review元素中查找与新内容一起保存的文件。
我们找到了保存新数据的文件和新文件的url地址
我们注意到网址已更改。点击打开连接为“,10,723,35,469,821&limit=30&tailmark=1529497523&msgIdMark=310241”
后面有些字符比前面的数据url多。我们再多点“加载更多”,查看新内容的文件数据,看看能不能找到一些规律。
让我们把新的 URL 放在一起进行比较:
https://api.xuangubao.cn/api/pc/msgs?subjids=9,10,723,35,469,821&limit=30&tailmark=1529497523&msgIdMark=310241
https://api.xuangubao.cn/api/pc/msgs?subjids=9,10,723,35,469,821&limit=30&tailmark=1529493624&msgIdMark=310193
https://api.xuangubao.cn/api/pc/msgs?subjids=9,10,723,35,469,821&limit=30&tailmark=1529487816&msgIdMark=310151
第一个网址:
第二个网址:
第三个网址:
经过对比,我们可以发现加载后的json数据文件的地址与之前的json文件的['TailMark']和['TailMsgId']有关。
是在原来的url=",10,723,35,469,821&limit=30"的基础上加上后缀的
“&tailmark=['TailMark']&msgIdMark=['TailMsgId']”
并获取url地址。
因此,我们获取下一个url地址的代码是:
def get_newurl(html):
url="https://api.xuangubao.cn/api/pc/msgs?subjids=9,10,723,35,469,821&limit=30"
url=url+'&tailmark='+html['TailMark']+'&msgIdMark='+html['TailMsgId']
return url
那么我们的爬虫代码就基本完成了,下面是整个爬虫代码:
# -*- coding:utf-8 -*-
import urllib.request
import urllib.parse
import time
import json
#获取网页
def get_page(url):
headers={
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.79 Safari/537.36'
}
req = urllib.request.Request(url=url,headers=headers)
res = urllib.request.urlopen(req)
html = res.read().decode()
return html
#获取下一页网址
def get_newurl(html):
url="https://api.xuangubao.cn/api/pc/msgs?subjids=9,10,723,35,469,821&limit=30"
url=url+'&tailmark='+html['TailMark']+'&msgIdMark='+html['TailMsgId']
return url
#获取数据
def get_data(html,url):
html = json.loads(html)
c = len(html["NewMsgs"])
for i in range(0,c):
cun =html["NewMsgs"][i]['Impact']#获取含有信息的字典
if cun == 1 or cun == -1:#判断信息是利好仍是利空
print(html["NewMsgs"][i]['UpdatedAt'])
if cun == 1:
print("*************利好*************")
if cun == -1:
print('*************利空*************')
chang = len(html["NewMsgs"][i]['BkjInfoArr'])#获取信息下含有几个利好或利空行业
ch =html["NewMsgs"][i]['Stocks']
for j in range(0,chang):
print('行业:',html["NewMsgs"][i]['BkjInfoArr'][j]['Name'])
if ch!=None:
du = len(html["NewMsgs"][i]['Stocks'])#同理获取含有几个利好或利空股票
for k in range(0,du):
print('股票:',html["NewMsgs"][i]['Stocks'][k]['Name'])
print("**************************\n\n")#信息获取完毕,换行
#获取经过函数获取下一页的url地址并返回该地址
url = get_newurl(html)
return url
if __name__=='__main__':
url="https://api.xuangubao.cn/api/pc/msgs?subjids=9,10,723,35,469,821&limit=30"
for i in range(0,5):#进行循环爬取下一页地址的股票信息
html=get_page(url)
url=get_data(html,url)
因为刚学,很多地方写的不好,比较繁琐冗长。请赐教。