python抓取动态网页(Python爬虫之爬取各大币交易网站公告(二) )
优采云 发布时间: 2021-09-16 14:03python抓取动态网页(Python爬虫之爬取各大币交易网站公告(二)
)
Python爬虫爬行动态网站-爬行每个主要货币交易网站公告(二))@
我们经常发现网页中的许多数据不是用HTML编写的,而是通过JS动态加载的。因此,我们提出了动态数据的概念。动态数据是指网页中由JavaScript动态生成的页面内容,该内容是在页面加载到浏览器后动态生成的,而不是在加载之前
在编写爬虫程序获取网页数据时,我们经常会遇到这种需要动态加载数据的HTML网页。如果我们仍然直接从网页上获取数据,我们将无法获得任何数据
今天,让我们来讨论如何使用Python对动态网站进行爬网@
Python版本:Python3.X
运行平台:Windows
IDE:PyCharm
浏览器:Chrome
网站:、coinex等。例如
(一)analysis网站)@
查看网页源代码,如下图所示。我们无法在HTML中找到相应的公告信息:
在Chrome浏览器中,单击F12在网络中打开XHR。抓取对应的JS文件进行解析,如下图所示:
按F5刷新,出现如下界面:
公告显然与我们想要的有关。单击以获取:
显然,我们想要的是正确的。我们将在下面获得这些信息。单击标题:
我们得到请求头和请求参数
(二)@通过请求模块发送post请求
headers = {
'User - Agent': 'Mozilla / 5.0(Linux;Android6.0;Nexus5Build / MRA58N) AppleWebKit / 537.36(KHTML, likeGecko) Chrome / 67.0.3396.62MobileSafari / 537.36',
'Cookie': 'SESSION= 6b464d53 - 0609 - 4165 - 936a - a05755e6aa50;__jsluid = 2116ec5d7ed6479ffcc767fe36fcc671;Hm_lvt_0c4a3a6d4432aa88adff38d3193396ce = 1538189398;_uab_collina = 153818939825788460139305;__jsl_clearance = 1538189703.864 | 0 | UEnHiXDEq4kQ805BL4iBLIKbm % 2Fc % 3D;Hm_lpvt_0c4a3a6d4432aa88adff38d3193396ce = 1538189712',
'Referer': 'https: // www.cointiger.pro /'
}
data = {
'page': '1',
'pageSize': '20'
}
(三)extract-information)
单击“预览”,我们将获得:
我们找到了我们想要的信息——时间、头衔和*敏*感*词*
当你看到一个ID时,你可能想知道为什么你想要一个ID
让我们看看其中的一些文章
比较ID后,我们会发现每个公告的链接实际上是'
提取方法说明如下:
title = html_doc.get('data').get('noticeInfoList')[n].get('title')
另外两种提取方法相同
此外,这里的时间是一个时间戳,我们需要将其转换为本地时间
timestamp = html_doc.get('data').get('noticeInfoList')[n].get('ctime') / 1000 #/1000是因为时间戳一般为10位
timeArray = time.localtime(timestamp)
now_time = time.strftime("%Y-%m-%d-%H:%M:%S", timeArray)
(四)在当地时间前一天收到公告)
与静态一样,我们首先得到当地时间的前一天:
now_time = datetime.datetime.now()
yes_time = now_time + datetime.timedelta(days=-1)
yes_time_nyr = yes_time.strftime('%Y-%m-%d')
然后根据if语句进行判断
(五)总代码)
import requests
import json
import time
import datetime
if __name__=='__main__':
now_time = datetime.datetime.now()
yes_time = now_time + datetime.timedelta(days=-1)
yes_time_nyr = yes_time.strftime('%Y-%m-%d')
headers = {
'User - Agent': 'Mozilla / 5.0(Linux;Android6.0;Nexus5Build / MRA58N) AppleWebKit / 537.36(KHTML, likeGecko) Chrome / 67.0.3396.62MobileSafari / 537.36',
'Cookie': 'SESSION= 6b464d53 - 0609 - 4165 - 936a - a05755e6aa50;__jsluid = 2116ec5d7ed6479ffcc767fe36fcc671;Hm_lvt_0c4a3a6d4432aa88adff38d3193396ce = 1538189398;_uab_collina = 153818939825788460139305;__jsl_clearance = 1538189703.864 | 0 | UEnHiXDEq4kQ805BL4iBLIKbm % 2Fc % 3D;Hm_lpvt_0c4a3a6d4432aa88adff38d3193396ce = 1538189712',
'Referer': 'https: // www.cointiger.pro /'
}
data = {
'page': '1',
'pageSize': '20'
}
target = 'https://www.cointiger.pro/exchange/internal/sperate/public/notices?page=1&pageSize=20' #此为Request URL
req = requests.get(url=target, headers=headers, data=data)
html = req.text
html_doc = json.loads(html) #json.loads()解码python json格式
num = len(html_doc.get('data').get('noticeInfoList'))
n = 0
judge = []
while (n < num):
title = html_doc.get('data').get('noticeInfoList')[n].get('title')
timestamp = html_doc.get('data').get('noticeInfoList')[n].get('ctime') / 1000
timeArray = time.localtime(timestamp)
now_time = time.strftime("%Y-%m-%d-%H:%M:%S", timeArray)
id = html_doc.get('data').get('noticeInfoList')[n].get('id')
href = 'https://www.cointiger.pro/#/notice_detail/%s' % id
all = now_time + '\t' + title + '\t' + href
n = n + 1
if yes_time_nyr in all:
print(all)
judge += all
if len(judge) == 0:
print('本日无公告')
(注)
通过requests.post()发出post请求时,传入消息有两个参数,一个是data,另一个是JSON
普通表单表单可以直接使用数据参数提交消息,数据对象是Python中的字典类型,在最新的爬虫过程中遇到一条负载消息,是JSON格式的消息,所以传入的消息对象也应该是格式的,这里有两种提交消息的方法:
import requests
import json
url = "http://example.com"
data = { 'a': 1,
'b': 2,
}
#1
requests.post(url, data=json.dumps(data))
#2,json参数会自动将字典类型的对象转换为json格式
requests.post(url, json=data)