2种方法简单爬取JS加载的动态数据
来源:互联网 发布:unity3d无缝地图 编辑:程序博客网 时间:2024/06/08 15:41
需要爬取的网站数据: http://gkcx.eol.cn/soudaxue/queryProvince.html?page=1 一共是165页,将page=1 变成其他的数字即可访问。
获取所有的url: urls = ('http://gkcx.eol.cn/soudaxue/queryProvince.html?page={}'.format(i) for i in range(1,166))
用火狐浏览器打开需要爬取的网页,右键,查看页面源代码,CTRL + F 查找输入293,源代码里面并没有这个值,说明是动态加载的数据。
对于动态加载的数据目前我熟知的有两中办法,一是使用selenium,二是分析网页元素,找出该数据的原始网页,提交表单,获取不同的数据,用来达到爬取的目的。
方法一:
#coding=utf-8from bs4 import BeautifulSoup from selenium import webdriverurls = ('http://gkcx.eol.cn/soudaxue/queryProvince.html?page={}'.format(i) for i in range(1,166))driver=webdriver.Firefox()driver.maximize_window()for url in urls: #print ("正在访问{}".format(url)) driver.get(url) data = driver.page_source soup = BeautifulSoup(data, 'lxml') grades = soup.find_all('tr') for grade in grades: if '<td>' in str(grade): print(grade.get_text())
代码说明:
from bs4 import BeautifulSoup 使用BeautifulSoup 解析网页数据
from selenium import webdriver 使用selenium爬取动态数据
urls = ('http://gkcx.eol.cn/soudaxue/queryProvince.html?page={}'.format(i) for i in range(1,166)) 一个包含所有需要爬取的网站生成器
driver=webdriver.Firefox() 打开Firefox浏览器
driver.maximize_window() 窗口最大化
driver.get(url) 浏览器自动跳转到该url链接
data = driver.page_source 获取页面元素,里面就包含了需要爬取的数据
soup = BeautifulSoup(data, 'lxml')
grades = soup.find_all('tr')
for grade in grades:
if '<td>' in str(grade):
print(grade.get_text())
通过对数据的分析,写出上面的查找方法,即可获取所有数据。
通过这种方法获取数据,简单,也比较直观,缺点是太慢了。
现在通过方法二是获取数据。
用火狐浏览器打开需要爬取的网页,右键 查看元素,选择网络,默认就好。
(有些老版本的火狐浏览器可能需要安装firebug插件)
点击第二页,看看都加载了哪些网页和数据。
分析如下图:
分析得知类型为json的那一栏即是我们需要的数据
查看消息头里面的请求网站
https://data-gkcx.eol.cn/soudaxue/queryProvince.html?messtype=jsonp&callback=jQuery183005011523805365803_1512185796058&luqutype3=&province3=&year3=&luqupici3=&page=2&size=10&_=1512185798203
真正的请求网站 https://data-gkcx.eol.cn/soudaxue/queryProvince.html
参数 messtype=jsonp&callback=jQuery183005011523805365803_1512185796058&luqutype3=&province3=&year3=&luqupici3=&page=2&size=10&_=1512185798203
也可以点击右侧的参数栏参看参数
page 表示当前页数
size表示每页显示的条目数
写出代码
#coding=utf-8import requestsimport jsonfrom prettytable import PrettyTable if __name__=='__main__': url = 'https://data-gkcx.eol.cn/soudaxue/queryProvince.html' row = PrettyTable() row.field_names = ["地区", "年份", "考生类别", "批次","分数线"] for i in range(1,34): data ={"messtype":"json", "page":i, "size":50, "callback": "jQuery1830426658582613074_1469201131959", "_":"1469201133189", } school_datas = requests.post(url,data = data).json() datas = school_datas["school"] for data in datas: row.add_row((data["province"] ,data["year"],data["bath"],data["type"], data["score"])) print(row)
代码说明
for i in range(1,34):
一共是 1644条,每页显示的最大条数是50条,1600/50 = 32,还有44条就是33页,所以范围就应该是(1,34)
data ={"messtype":"json",
"page":i,
"size":50,
"callback":
"jQuery1830426658582613074_1469201131959",
"_":"1469201133189",
}
分析得出的提交数据,使用post方式。
- 2种方法简单爬取JS加载的动态数据
- WebCollector爬取JS加载的数据
- WebCollector爬取JS加载的数据
- python爬虫爬取简单的动态数据-异步加载问题
- 动态加载JS的四种方法
- 动态加载js的方法
- 动态加载js的方法
- 爬取js动态生成后的数据
- HtmlUnit爬取动态数据(js相关)
- Python爬虫实战(十一):两种简单的方法爬取动态网页
- 动态加载JS方法
- 三种获取js加载的动态内容的方法
- 动态加载JS脚本的4种方法
- 动态加载JS脚本的4种方法
- 动态加载JS脚本的4种方法
- 动态加载JS脚本的4种方法
- 动态加载JS脚本的4种方法
- 动态加载JS脚本的4种方法
- Java map
- P
- 遍历与复制数组
- C++游戏服务器编程-LogServer
- RxAndroid之Rxlifecycle使用
- 2种方法简单爬取JS加载的动态数据
- 详解Java中的clone方法 -- 原型模式
- MTK 功能机 MMI绘画
- Linux-Ubuntu环境下使用Shadowsocks
- Android 微信 支付宝支付,2行代码实现支付
- 程序分享:c++实现string类
- HDOJ2156分数矩阵
- 1013: [JSOI2008]球形空间产生器sphere
- Android Intent 小结