java爬虫抓取动态网页( 简单聊一聊如何用python爬取动态网站(一)_Python版本 )
优采云 发布时间: 2022-03-21 06:13java爬虫抓取动态网页(
简单聊一聊如何用python爬取动态网站(一)_Python版本
)
Python爬虫爬取动态网站——爬取各大币种交易网站公告(二)
我们经常发现网页中的很多数据并不是用 HTML 编写的,而是通过 js 动态加载的。因此,引入了动态数据的概念。这里的动态数据是指网页中通过Javascript动态生成的页面内容,是页面加载到浏览器之后动态生成的,而不是之前动态生成的。
在编写爬虫爬取网页数据的时候,经常会遇到这种需要动态加载数据的HTML网页。如果还是直接从网页爬取,就无法获取任何数据。
今天就在这里简单的说一下如何使用python爬取动态网站。
Python版本:Python3.X
操作平台:Windows
IDE:PyCharm
浏览器:铬
网站: , CoinEx 等。这里以 , 为例。
(一)分析网站
查看网页源码,如下图,我们在HTML中找不到对应的公告信息:
在Chrome浏览器中,点击F12打开网络中的XHR,我们抓取对应的js文件进行解析。如下所示:
按F5刷新,我们看到如下界面:
通知公告,明显和我们想要的有关,点击获取:
显然,我们想要的只是在右侧,我们将在下面获得该信息。点击标题:
我们得到了 Requests Header 和请求参数。
(二)通过requests模块发送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'
}
(三)提取信息
点击预览,我们得到:
我们在其中找到了我们正在寻找的信息——时间、标题和 ID。
看到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。
常见的表单表单可以直接使用data参数进行消息提交,data对象是python中的字典类型;而在最新爬虫的过程中,遇到了payload消息,是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)