首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Python网络爬虫(五)-Requests和Beautiful Soup

1.简介

Requests 是用Python语言编写,基于 urllib,采用 Apache2 Licensed 开源协议的 HTTP 库。它比 urllib 更加方便,可以节约我们大量的工作,完全满足 HTTP 测试需求。

Beautiful is better than ugly.(美丽优于丑陋)

Explicit is better than implicit.(清楚优于含糊)

Simple is better than complex.(简单优于复杂)

Complex is better than complicated.(复杂优于繁琐)

Readability counts.(重要的是可读性)

2.安装

利用 pip 安装

或者利用 easy_install

3.基本请求方式

requests为爬虫开发者们提供了8种基本的请求方式,由于在web开发过程中,大家发现对于服务器数据的处理方式没有一开始制定标准时设计的那么复杂,所以一般情况下都简化成了get/post两种常见的请求方式

1.基本GET请求

最基本的GET请求可以直接用get方法

如果想要加参数,可以利用 params 参数

运行结果:

如果想请求JSON文件,可以利用 json() 方法解析

写一个JSON文件命名为a.json

利用如下程序请求并解析

运行结果如下,其中一个是直接输出内容,另外一个方法是利用 json() >方法解析

如果想获取来自服务器的原始套接字响应,可以取得 r.raw 。 不过需要>在初始请求中设置 stream=True 。

这样就获取了网页原始套接字内容。

如果想添加 headers,可以传 headers 参数

2.基本POST请求

对于 POST 请求来说,我们一般需要为它增加一些参数。那么最基本的传参方法可以利用 data 这个参数。

运行结果:

有时候我们需要传送的信息不是表单形式的,需要我们传JSON格式的数据过去,所以我们可以用 json.dumps() 方法把表单数据序列化。

运行结果:

通过上述方法,我们可以POST JSON格式的数据

上传文件,那么直接用 file 参数即可

新建一个 a.txt 的文件,内容写上 Hello World!

运行结果:

这样我们便成功完成了一个文件的上传。

requests 是支持流式上传的,这允许你发送大的数据流或文件而无需先把它们读入内存。要使用流式上传,仅需为你的请求体提供一个类文件对象即可

3.Cookies

如果一个响应中包含了cookie,那么我们可以利用 cookies 变量来拿到

4.超时配置

用 timeout 变量来配置最大请求时间

注:timeout 仅对连接过程有效,与响应体的下载无关。

5.会话对象

在以上的请求中,每次请求其实都相当于发起了一个新的请求。也就是相当于我们每个请求都用了不同的浏览器单独打开的效果。也就是它并不是指的一个会话,即使请求的是同一个网址。比如

结果:

很明显,这不在一个会话中,无法获取 cookies,那么在一些站点中,我们需要保持一个持久的会话,就像用一个浏览器逛淘宝一样,在不同的选项卡之间跳转,这样其实就是建立了一个长久会话。

在这里我们请求了两次,一次是设置 cookies,一次是获得 cookies

运行结果

发现可以成功获取到 cookies 了,这就是建立一个会话到作用。

那么既然会话是一个全局的变量,那么我们肯定可以用来全局的配置了。

通过 s.headers.update 方法设置了 headers 的变量。两个变量都传送过>去了。

运行结果:

get方法传的headers 同样也是 x-test,它会覆盖掉全局的配置

如果不想要全局配置中的一个变量设置为 None 即可

运行结果:

6.SSL证书验证

现在随处可见 https 开头的网站,Requests可以为HTTPS请求验证SSL证书,就像web浏览器一样。要想检查某个主机的SSL证书,你可以使用 verify 参数,比如12306的证书无效。

测试如下:

结果:

测试12306的证书无效

如果我们想跳过刚才 12306 的证书验证,把 verify 设置为 False 即可

在默认情况下 verify 是 True,所以如果需要的话,需要手动设置下这个变量。

源码中我们可以看到默认verify=False

也可以引入python 关于证书的处理模块SSL

7.代理

如果需要使用代理,你可以通过为任意请求方法提供 proxies 参数来配置单个请求

私密代理验证(特定格式) 和 Web客户端验证(auth 参数)

web客户端验证

如果是Web客户端验证,需要添加 auth = (账户名, 密码)

也可以通过环境变量 HTTP_PROXY 和 HTTPS_PROXY 来配置代理

通过以上方式,可以方便地设置代理。

4.程序中的使用

安装好request模块之后,在程序中就可以通过import引入并且使用了

代码操作(一)爬取天气

结果:

代码操作(二)- 爬取百度图片你的名字

先获取图片链接地址

结果:

你的名字

写到最后说些题外话,今天爬取一个网站的时候还发生了一件好玩的事,网站的反爬机制导致爬取的数据只是一个html网页,看到了页面上的话,我想起了一句话,对于爬虫工程师来说每天都是不停地和对方的反爬工程师斗智斗勇。

那么问题来了,到底什么是世界上最牛逼的语言

5.BeautifulSoup4

1.Beautiful Soup的简介

Beautiful Soup是python的一个库,最主要的功能是从网页抓取数据。官方解释如下:

Beautiful Soup提供一些简单的、python式的函数用来处理导航、搜索、修改分析树等功能。它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出一个完整的应用程序。

Beautiful Soup自动将输入文档转换为Unicode编码,输出文档转换为utf-8编码。你不需要考虑编码方式,除非文档没有指定一个编码方式,这时,Beautiful Soup就不能自动识别编码方式了。然后,你仅仅需要说明一下原始编码方式就可以了。

Beautiful Soup已成为和lxml、html6lib一样出色的python解释器,为用户灵活地提供不同的解析策略或强劲的速度。

2. Beautiful Soup 安装

Beautiful Soup 3 目前已经停止开发,推荐在现在的项目中使用Beautiful Soup 4,不过它已经被移植到BS4了,也就是说导入时我们需要 import bs4 。所以这里我们用的版本是 Beautiful Soup 4.3.2 (简称BS4),另外据说 BS4 对 Python3 的支持不够好,不过我用的是 Python2.7.7,如果有小伙伴用的是 Python3 版本,可以考虑下载 BS3 版本。

可以利用 pip 或者 easy_install 来安装,以下两种方法均可

由于我的是python2和python3共存,所以安装时需加上python版本安装

另一个可供选择的解析器是纯Python实现的 html5lib , html5lib的解析方式与浏览器相同,可以选择下列方法来安装html5lib:

Beautiful Soup支持Python标准库中的HTML解析器,还支持一些第三方的解析器,如果我们不安装它,则 Python 会使用 Python默认的解析器,lxml 解析器更加强大,速度更快,推荐安装。

Beautiful Soup 4.4.0 文档官方文档

BeautifulSoup 主要用来遍历子节点及子节点的属性,通过点取属性的方式只能获得当前文档中的第一个 tag,例如,soup.li。如果想要得到所有的

标签,或是通过名字得到比一个 tag 更多的内容的时候,就需要用到 find_all(),find_all() 方法搜索当前 tag 的所有 tag 子节点,并判断是否符合过滤器的条件find_all() 所接受的参数如下:

几乎是 Beautiful Soup中最常用的搜索方法,也可以使用其简写方法,以下代码等价:

如果只想得到 tag 中包含的文本内容,那么可以只用 方法,这个方法获取到 tag 中包含的所有文版内容包括子孙 tag 中的内容,并将结果作为 Unicode 字符串返回:

参考文档:Requests官方文档http://docs.python-requests.org/en/master/及崔庆才老师的个人博客http://cuiqingcai.com/1319.html、 Beautiful Soup 4.4.0 文档 http://beautifulsoup.readthedocs.io/zh_CN/latest/#id18(中文文档)

编程从未如此有趣!

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180704G0C14J00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券