爬虫进阶(四)
总第71篇
01|背景:
前段时间给人填报志愿,无意间发现这个网站的:http://gkcx.eol.cn/soudaxue/queryschoolgufen.html,这个网站整体不错,会根据生源地、高考分数、和文理科来推荐一些可以报考的学校,但是使用不是很方便,不可以设置多个条件(比如我想把东三省的学校挑出来),只能一个省份一个去点击。再比如我想要录取概率在50%以上的学校,同样也做不到,要是能下载excel中的话可以多条件筛选的,平日里学的爬虫终于派上用场了。
但是在爬取的过程中发现了一个问题在审查元素中存在的内容但在网页源代码中不存在,所以通过request请求得到的response内容中也不存在,导致我们最后在用find_all查找的时候结果为空,于是乎就各种百度终于找到了解决方案,原来是因为我们要查找的数据是通过AJAX来加载的。关于js数据的获取,发现一篇前人写的很不错的文章,现在贴出来:https://sanwen8.cn/p/46fgV6R.html
在之前也写过一篇关于AJAX加载的数据,上次那一篇是直接通过查找XHR中来获取js数据:爬虫进阶(一),这次我们用selenium来获取js数据。
02|明确爬虫目的:
我想要爬取该网站的学校名字、学校类别、报该学校的风险大小以及录取概率。
03|获取目标url:
该网站的网页构成还是相对简单,由基础的网页域名+一些参数就是目标url。这里有一个重点内容是将字符串转化为url参数,需要利用urlencode.
base="http://gkcx.eol.cn/soudaxue/queryschoolgufen.html"for i in range(1,10): #这里的10根据结果页数来调整
data={
"mark":450,
"fsxxxS":"山西",
"examineeType":"理科",
"page":i
}
dated=urllib.parse.urlencode(data)
url=base+"?"+dated
这里的mark(分数)、fsxxxs(生源地)、examineeType(文科or理科)均可以修改。
04|请求目标url:
这里因为我们需要的数据是通过AJAX加载的,利用request请求不能够直接得到我们想要的内容(我们想要的数据未加载出来),这里我们利用selenium模拟浏览器让网页数据全部加载完成(包括我们想要的数据)。
browser = webdriver.Chrome()#创建一个浏览器对象
browser.get(url)
html=browser.page_source#将selenium加载出来的网页内容传递给html
05|解析selenium所获得的内容:
这里我们还是借助Beautifulsoup库来进行解析。
soup = BeautifulSoup(html,'lxml')
06|获取我们需要的内容:
这里我们利用正则表达式来获取我们所需要的内容。需要注意的是re.search的被匹配内容需要是字符串,所以用str将soup列表中的内容转化。
soup1=soup.find_all("tr")
for m in range(1,len(soup1),2):
result=re.search("<a.*?title=.*?>(S+)</a>.*?<span>(S+)</span>.*?<span class=.*?>(S+)</span>(S+)</td>",str(soup1[m]))
school.append(result.group(1))
category.append(result.group(2))
risk.append(result.group(3))
probability.append(result.group(4))
school、category、risk、probability是用来存放对应值而建立的空列表。最后将这些列表利用pandas进行合并导出为excel即可。可以参考下文:
07|本篇的一些重点:
1)将字符串urlencode成url参数。 2)利用selenium对js数据进行加载。 3)利用正则表达式取出想要的多个内容。
- JavaWeb13-设计模式案例实现(Java真正的全栈开发)
- 运维平台的建设思考-元数据管理(三)(r8笔记第15天)
- JavaWeb12-JSP, EL表达式,JSTL标签
- JavaWeb11-jsp.cookie.session(1)
- 交互式使用 R题(shell)
- union(并),setdiff(差),intersect(交)R语言含义
- JavaWeb11-jsp.cookie.session(2)
- 一个慢查询报警的简单处理 (r8笔记第12天)
- 厚土Go学习笔记 | 38. goroutine轻量级线程
- 厚土Go学习笔记 | 36. web服务指定路径下的get参数接收与处理
- Java开发Spring笔记第二天
- PHP调用Go服务的正确方式 - Unix Domain Sockets
- 一条看似平常的报警邮件所做的分析(r8笔记第9天)
- 55. 上传文件(Web版) | 厚土Go学习笔记
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 110分钟使用Python搭建自己的IP定位查询接口
- python实现在线微博数据可视化
- 在tinycolinux上安装chrome
- 如何在Ubuntu 18.04服务器上安装Python 3和设置编程环境
- python趣味题-数字加密
- 快手解析视频真实链接(爬取快手视频)
- 在tinycolinux上安装和使用cloudwall
- 洛谷 P1896 [SCOI2005]互不侵犯(状压dp)
- Mybatis 详解
- 用Python玩转微信
- Python播放暂停音乐
- Leetcode 785. 判断二分图(贪心,二分图判定,DFS)
- Mybatis 主键返回
- 整合 SSM
- 使用 Lombok 释放百行代码