java爬虫抓取动态网页( 简单聊一聊如何用python爬取动态网站(一)_Python版本 )

优采云 发布时间: 2022-03-21 06:13

  java爬虫抓取动态网页(

简单聊一聊如何用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)

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线