Python爬虫之爬取动态网站——爬取各大币交易网站公告(二).md

Python爬虫之爬取动态网站——爬取各大币交易网站公告(二)

我们经常会发现网页中的许多数据并不是写死在HTML中,而是通过js动态载入的。所以也就引出了什么是动态数据的概念, 动态数据在这里指的是网页中由Javascript动态生成的页面内容,是在页面加载到浏览器后动态生成的,而之前并没有的。

在编写爬虫进行网页数据抓取的时候,经常会遇到这种需要动态加载数据的HTML网页,如果还是直接从网页上抓取那么将无法获得任何数据。

今天,我们就在这里简单聊一聊如何用python爬取动态网站。

Python版本:Python3.X

运行平台:Windows

IDE:PyCharm

浏览器:Chrome

网站:fubt,CoinEx,cointiger等等。此处以,cointiger为例。

(一)分析网站

查看网页源代码,如下图所示,我们无法在HTML中找到对应公告信息:

在Chrome浏览器中,点击F12,打开Network中的XHR,我们来抓取对应的js文件来进行解析。如下图:

按F5刷新,我们看到以下界面:

notice公告,很显然与我们想要的相关,点击得到:

img

很明显我们想要的都在右侧,下面将获取这些信息。点击Headers:

我们得到了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'
}

(三)提取信息

点击Preview,我们得到:

我们在这当中找到了我们想要的信息——时间,标题和id。

看到id,可能会产生疑问,为什么要id?

我们看一下其中几篇文章。

在对比一下id,我们会发现每一篇公告的链接其实就是‘https://www.cointiger.pro/#/notice_detail/’再加上每一篇文章对应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。

常见的form表单可以直接使用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)


猜你喜欢

转载自blog.csdn.net/qq_41813030/article/details/82941010