如何轻松爬取网页数据?

一、引言

在实际工作中,难免会遇到从网页爬取数据信息的需求,如:从微软官网上爬取最新发布的系统版本。很明显这是个网页爬虫的工作,所谓网页爬虫,就是需要模拟浏览器,向网络服务器发送请求以便将网络资源从网络流中读取出来,保存到本地,并对这些信息做些简单提取,将我们要的信息分离提取出来。

在做网页爬虫工作时会发现并不是所有网站都是一样,比如有些网址就是一个静态页面、有些需要登录后才能获取到关键信息等等。此外,python简单而又强大,又有不少第三方库可以让我们轻松拿到浏览器中所看到的内容。因而,本文将根据网站特性进行分类介绍几种使用python完成网页爬虫的方法。

二、静态页面

在做爬虫工作时,什么类型的网站最容易爬取数据信息呢?不需要登录等处理,直接用Get方法请求URL即可从服务器获取到返回数据,如我们访问一些博客文章,一个Get请求就可以拿到博客文章里的内容。下面将举例介绍如何爬虫这种类型页面内容该如何爬取。

示例

1、需求说明:假设我们需要及时感知到电脑管家官网上相关产品下载链接的变更,这就要求我们写个自动化程序从官网上爬取到电脑管家的下载链接。

2、分析过程:在浏览器中打开https://guanjia.qq.com,按下F12, 查看网络请求,内容如下图。这里只有一个Get请求,没有登录,也不涉及加密过程。此外,点击Elements,可以很容易的从源码中找到下载链接。

图1

3、解决方案: requests是python的第三方库,可以发送网络请求数据并获取服务器返回的源码。使用requests库获取到html文件,然后利用正则等字符串解析手段或者BeautifulSoup库(第三方库)完成信息提取。下面代码展示的是利用requests库和BeautifulSoup库完成信息提取。

图2 源码截图

知识点

1、有些网络服务器反感爬虫,会对请求头做个简单判别,直接拒绝那些明显是由自动化程序发起的请求。就例如图2中的代码,python使用的默认请求头User-Agent值为Python-urllib/3.4,而浏览器访问时User-Agent值为:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36(KHTML, like Gecko) Chrome/43.0.2357.124 Safari/537.3。为了避免自动化程序被拒绝,在请求时可以修改请求头,让自动化程序更像一个浏览器。

2、在网页爬取时,可能会遇到公司网络不允许访问外网的情况,这时就需要设置代理IP: requests.get("https://guanjia.qq.com", proxies={“http”:“127.0.0.1:8087”})

3、BeautifulSoup库是HTML/XML解析器,它可以很好的处理不规范标记并生成剖析树,通常用来分析爬虫抓取的web文档,可以大大节省编程时间。

三、POST表单

前面介绍的是通过HTTP协议的Get方法去请求信息,对应网站不涉及post表单。表单是含有
标签,是要交互的数据区域,你可能需要输入文字、做下拉选择等,完成与服务器的交互。下面将给个简单的示例让大家理解post表单情况。

示例

1、需求说明:访问网址,并输出服务器返回内容。

2、分析过程:在浏览器中打开http://pythonscraping.com/pages/cookies/welcome.php,展示在面前的是个登录界面, 按下F12,可看到如下图的信息。很明显这是一个表单。点击登录后查看Network,会发现看到一个post请求以及请求参数。当登录完成后,即可访问http://pythonscraping.com/pages/cookies/profile.php,查看网址中详细内容。

3、解决方案:仍然使用强大的requests库完成post表单操作,下面将仅展示post登录那里,登录过后的页面内容解析和第二部分一致,这里不再详细赘述。

知识点

1、需要注意cookie的追踪。一旦网站验证了你的登录权证,它将会将登陆权证保存在浏览器的cookie中,若是我们一直自己处理cookie的追踪,在面对复杂网址时将会比较麻烦,降低开发效率。我们可以使用Session对象解决这个问题,就如上述截图代码中。Session会持续跟踪会话信息,包括cookie,header。可以调用session.cookie.get_dict()查看当前session cookie值。

2、在表单中存在“隐含”字段,该字段是对浏览器可见,但是对用户不可见。一般而言,“隐含”字段是在每次Get请求时生成,每次打开同个网址,同个“隐含”值不一样。这个处理有一定的反爬虫效果。至于“隐含”字段是否作为post参数,可以手动在浏览器下完成表单请求,观察请求参数是否包含某个“隐含”参数。如下图:网址包含“隐含”字段,并在post时带上。

第二部分介绍的header、代理IP同样适用于这里。

四、HTTP基本接入认证

基本认证是一种用来允许Web浏览器后者其他客户端程序在请求时,提供用户名和口令形式的身份凭证的一种登录验证方式。把“用户名+冒号+密码”用BASE64算法加密后的字符串放到httprequest中的headerAuthorization中发送给服务端。在发明cookie之前,HTTP基本认证是处理网站登录最常用的方法,目前一些安全性比较高网址还在使用这种方式。

示例

1、需求说明:访问某网站(涉及内部,不对外公布)。

2、分析过程:在浏览器中输入该网址,看到如下页面。这时候需要输入用户名和密码才能得到所需要的数据。否则会返回错误代码401,要求用户重新提供用户名和密码。此外用fiddle抓取中间数据时,header中有如下信息:,很明显这是一个HTTP基本认证。

3、解决方案:这个实际是个post请求,和普通post的请求区别是:在每次请求数据时,需要用BASE64加密用户名和密码,并附加到请求头中。requests库提供了一个auth模块专门用于处理HTTP认证,这样就不用程序自己做加密处理。下面给出具体代码:

知识点

目前有多种http登录验证方法,其中最广泛应用的是基本验证和摘要验证,auth模块也提供摘要验证处理方法,具体使用方法我也没有研究过,请各位查询相关资料。

五、JavaScript动态页面

前面介绍了静态页面和含有post表单网站的爬虫方式,相对比较简单。而实际在做网页爬虫工作时页面情况更加多样复杂。如:

1、网页中包含javascript代码,需要经过渲染处理才能获取原始数据;

2、网站具有一定反爬虫能力,有些cookie是需要客户端脚本执行JS后才会产生,而requests模块又不能执行JS代码,如果我们按照第三部分操作来post表单,会发现部分少了部分cookie,导致请求被拒绝。在当前知名网站反爬虫工作做的比较好,很难找到简单post表单就可以。

那有什么好的方式解决这种类型网站的爬虫呢?

“python+ selenium + 第三方浏览器“。

示例

1、需求说明:登录微软官网https://connect.microsoft.com/site1304/Downloads,自动下载微软最近发布iso文件。

2、分析过程:

(1) 当我们使用python request库去获取服务器源码时,发现python获取的源码和浏览器上渲染出的场景不一样,Python拿到是JS源码。如下图:

Python有个第三方库PyV8,该库可以执行JS代码,但执行效率低,此外微软官网还涉及JS加密的Cookie,若是采用requests + Pyv8 + BeautifulSoup 三种库组合方式处理,那代码会显得臃肿杂乱。

那是否有其他更为简洁易懂的方式呢?

有, selenium。

(2)“Selenium+ 第三方浏览器”,可以让浏览器自动加载页面,由浏览器执行JS从而获取到需要的数据,这样我们的python代码就无需实现浏览器客户端的功能。可以说,“Selenium + 第三方浏览器”组成了一个强大的网络爬虫,可以处理cookie、javascript等页面爬取情况。第三方浏览器分有界面(chrome)和无界面(PhantomJS),有界面浏览器就是可以直接看到浏览器被打开以及跳转的过程。无界面浏览器会将网站加载到内存并执行页面上的JS,不会有图形界面。可以自己喜好或者需求选择第三方浏览器。

3、解决方案:采用“selenium+ chrome”方式完成需求。

(1)下载安装python的selenium库;

(2)下载chromeDriver到本地;

(3)利用webdriver api完成对页面的操作。下面给出一个示例,完成微软官网的登录。示例代码在初始化webdriver时设置了网络代理、指定了浏览器下载文件保存路径、让chrome提示下载进度等信息。

知识点

在实例化webdriver时,可以通过参数对浏览器做些设置,如设置网络代理、浏览器下载文件保存路径等。若是不传参数,则默认继承本地浏览器设置。若是对浏览器启动时属性进行设置,则就利用到了ChromeOption类。具体信息可参考chromedriver官网。

“python + selenium + 第三方浏览器”可以处理多种爬虫场景,包括静态页面,post表单,以及JS等。应用场景很强大,使用selenium操作浏览器进行模拟点击的方式就可以让我们省心很多,不需要担心有什么“隐藏字段”、cookie追踪等。但对于包含验证码网页的操作,这种方式也不好处理,主要困难在于图像识别。

六、总结

本文主要针对各网站特点给出不同的爬虫方式,可以应对大量场景的数据爬取。在实际工作中使用频率最多还是“静态页面”、“javascript动态页面”这两种。当然,若是页面包含验证码,那就需要结合图像识别工具做些事情了,这种情况相对也比较难处理,图像识别准确率受到图片内容影响。

这里是个人的一些小总结,不知道大家是否有其他更好的方法呢?

大家若是有其他比较好的爬虫案例,欢迎在评论区留言,大家一起学习交流!

想知道更多测试相关干货 请关注我们的微信公众号:腾讯移动品质中心TMQ。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Crossin的编程教室

如何安装 Python 的第三方模块

正所谓“人生苦短,我用 Python”。Python 的一大优势就是有丰富且易用的第三方模块,省去了大量重复造轮子的时间,节约了众多开发者的生命。对于已经熟悉 ...

30390
来自专栏小白课代表

软件分享 | AutoCAD 2015安装教程

2、64位打开安装包,双击安装程序,点击更改,选择解压目标文件夹,可在D盘或其它盘里面新建一个CAD2015文件夹,然后点击确定

11110
来自专栏云加头条

微信小程序开发工具,腾讯云服务支持PHP语言啦!

如今,触手可及、用完即走的微信小程序受到了众多企业、商家的追捧,单一的NodeJS语言已无法满足广大用户人群。因此,昨日腾讯云工具新增了使用人群更为广泛的PHP...

1.3K10
来自专栏杨建荣的学习笔记

一个清理脚本的改进思路(r5笔记第51天)

前几天同事问我一个问题,说在unix环境下有个目录下的文件/文件夹太多了,已经报了开始报系统错误了,客户希望能够定时进行这些目录的清理。 我连到那个环境去查看,...

33380
来自专栏知晓程序

不小心给了小程序「授权」,怎么撤回?| 小程序问答 #49

最常见的,大概就是请求「获取你的昵称、头像」。除此之外,当小程序想要使用你的地理位置、麦克风等的时候,也需要你的授权才能获取。

15420
来自专栏云飞学编程

Python抓包获取网友上传的视频!世界那么大,只能在网上看了

作为一个小私企的(伪)程序员,你不止要负责软件,还得管硬件【大哭】,前几天给公司安装了一套监控,顺便浏览了下监控厂家的主页,发现一个很好玩的地方,正好在学习爬虫...

17640
来自专栏杨建荣的学习笔记

在eclipse中配置MySQL源码环境(r12笔记第14天)

今天费了些周折,总算搭建好了MySQL源码的调试环境,主要的目的就是想在看代码的时候有一些头绪,让这些开发技巧派上用场。不至于盲人摸象一般的拿着命令肉眼扫...

42960
来自专栏区块链

XSS攻击入门

反射性XSS XSS又叫CSS(Cross Site Script)跨站脚本攻击。它指的是恶意攻击者往Web页面TM入恶意代码,当用户浏览该页之时。嵌入其中We...

29150
来自专栏马铖的专栏

npm5 新版功能特性解析及与 yarn 评测对比

前言 前段时间 npm 发布了 5.0 版本,提供了自动记录依赖树,下载使用强校验,重写缓存系统等功能升级和改造,吸引了不少关注。本文将对 npm5 的新功能和...

2.4K70
来自专栏有趣的django

Django REST framework+Vue 打造生鲜超市(七) 八、商品详情页功能

八、商品详情页功能  8.1.viewsets实现商品详情页接口 (1)商品详情页只需要多继承一个类(mixins.RetrieveModelMixin)就可以...

563110

扫码关注云+社区

领取腾讯云代金券