爬虫进阶(四)

总第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)利用正则表达式取出想要的多个内容。

原文发布于微信公众号 - 张俊红(zhangjunhong0428)

原文发表时间:2017-07-04

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏mwangblog

git,版本控制界的魔术师(1/18/2018)

11520
来自专栏tkokof 的技术,小趣及杂念

小话游戏脚本(一)

( 题记:近来在网上学习到一个新的观点(应该是来自刘未鹏的BLOG :) ):书写是为了更好的学习,这与之前脑子里传道授业解惑的观点颇为迥异,品一品又颇以为然...

11310
来自专栏更流畅、简洁的软件开发方式

【自然框架 NatureFramework】 项目结构、命名空间和命名规范

  请注意,这里说的是自然框架内部代码的项目结构,并不是说给客户做开发的时候,也需要这些项目。在给客户开发的时候,只需要引用编译后的dll 即可。 一、项目结...

21250
来自专栏文大师的新世界

3. react-redux

react-redux是reactjs官方推荐的state管理器。具体的定义我就不说了,因为有很多地方比我说的好,大家可以Google或参照:redux、中文文...

28820
来自专栏圣杰的专栏

DDD理论学习系列(6)-- 实体

1.引言 实体对应的英语单词为Entity。提到实体,你可能立马就想到了代码中定义的实体类。在使用一些ORM框架时,比如Entity Framework,实体作...

30280
来自专栏WeTest质量开放平台团队的专栏

iOS微信内存监控

目前iOS主流的内存监控工具是Instruments的Allocations,但只能用于开发阶段。本文介绍如何实现离线化的内存监控工具,用于App上线后发现内存...

29150
来自专栏企鹅号快讯

反编译对于黑客技术的帮助有多大

目前很多技术都被涉及了,也有很多的技术被挖掘出来,但是很多人对技术不是这么了解的,可能会吃亏,比如说目前挺火的黑客技术还有反编译技术都是属于很多了解却不是这么熟...

398110
来自专栏美团技术团队

美团外卖Android Crash治理之路

Crash率是衡量一个App好坏的重要指标之一。如果你忽略了它的存在,它就会得寸进尺,愈演愈烈,最后造成大量用户的流失,进而给公司带来无法估量的损失。本文讲述美...

30930
来自专栏花叔的专栏

这是一个聚集了各路大神思路的小程序

楼主是个热衷技术的小伙伴,偶尔会做一下小玩意,今天给大家说说我做的第一个小程序 该小程序名字叫Nodes,顾名思义就是Node(节点)的聚合,就是思维的集合,首...

40360
来自专栏守候书阁

用vue一个计算属性,实现一个常见表单交互效果

vue.js是现在用的非常火热的一个前端框架,表单又是网站基本不会缺少的一环。用vue操作表单。表单的操作方式也是多种多样。今天我说的,就是我项目那里做的这一种...

11410

扫码关注云+社区

领取腾讯云代金券