Python3-Requests库入门及爬取实战

原创
2018/08/17 11:47
阅读数 696

实验环境准备

Python环境安装

腾讯云所提供的的镜像中已经包含了 Python 3.5

大部分情况我们只需要单独安装 pip 即可

sudo apt-get update
sudo apt-get install python3 python3-pip -y

requests库的安装

我们使用 pip 软件管理工具安装 requests ,如果你需要其他方法请访问官方网站指导页面。

请执行

pip3 install requests

在了解爬虫之前,我们有必要了解 robots 协议。

·--------------------------------------------------------

*以下部分内容来自维基百科 robots.txt 词条

robots.txt(统一小写)是一种存放于网站根目录下的 ASCII 编码的文本文件,它通常告诉网络搜索引擎的漫游器(又称网络蜘蛛),此网站中的哪些内容是不应被搜索引擎的漫游器获取的,哪些是可以被漫游器获取的。因为一些系统中的 URL 是大小写敏感的,所以 robots.txt 的文件名应统一为小写。robots.txt 应放置于网站的根目录下。如果想单独定义搜索引擎的漫游器访问子目录时的行为,那么可以将自定的设置合并到根目录下的 robots.txt,或者使用 robots 元数据(Metadata,又称元数据)。

这个协议也不是一个规范,而只是约定俗成的,有些搜索引擎会遵守这一规范,而其他则不然。通常搜索引擎会识别这个元数据,不索引这个页面,以及这个页面的链出页面。

·---------------------------------------------------

在使用爬虫过程中,我们应尽可能的遵循 robots 协议,在非学习交流与为目的的场合严格遵循其规定。

同时,我们在爬取数据的过程中应该注重服务器负载,避免给服务器带来较大压力,很多小众网站服务器工作能力并没有我们想象的那么好,数个并发爬虫就能使服务器宕机。

对于设计企业数据,网站所有者隐私的信息我们应尽可能避免爬取,换位思考,如果你是网站搭建者,你也不希望你的数据被轻松盗用吧。

Robots 协议暂且介绍这么多,现在,点击下一步,让我们进入 Python 爬虫的世界吧

cd ~
python3
  •  

当看到>>>的输入提示符时表示进入成功,请注意确认版本为 3.X 版本

导入requests库

之后的一些内容都在Python命令行中完成

import requests
  •  

定义网址为字符串变量

targetUrl = "http://www.baidu.com"
  •  

现在请跟随示例完成,之后您可以自行爬取其他页面

进行网页爬取

res = requests.get(targetUrl)
  •  

查看返回码

res.status_code
  •  

如果是200那么我们继续,如果不是、、、额、、、再试一次?

查看网页返回的字符集类型

res.encoding
  •  

你会发现得到的结果是 ISO-8859-1 然而百度真的是这样的吗?

尝试输出爬取结果

res.text
  •  

发现了什么?中文乱码,没错,很显然百度用的不是 ISO-8859-1 的字符集

查看爬取内容的二进制数据

res.content
  •  

你觉得是什么? utf-8 !没错,那么让我们继续

自动判断字符集类型

res.apparent_encoding
  •  

那么我们尝试直接更改 res.encoding 一项

更改字符集声明

res.encoding = res.apparent_encoding
  •  

再次尝试输出

res.text

Requests 库入门

  • 从简单的例子开始

  • requests 库提供的方法

    requests.request() 构造一个请求

    requests.request(method, url, **kwargs)

    **kwargs 的含义我们暂且放一放

    requests.get() 获取 HTML 网页,类似于 HTTP 的 GET

    requests.get(url, params=None, **kwargs)

    Response = requests.get(url)

    Response 这里是 requests 返回的一个对象,我们之后会具体讲解

    requests.head() 获取 HTML 网页头信息,类似于 HTTP 的 HEAD

    requests.head(url, **kwargs)

    requests.post() 向 HTML 网页提交 POST 请求,类似于 HTTP 的 POST

    requests.post(url, data=None, json=None, **kwargs)

    requests.put() 向 HTML 网页提交 PUT 请求,类似于 HTTP 的 PUT

    requests.put(url, data=None, **kwargs)

    requests.patch() 向 HTML 网页提交局部修改请求,类似于 HTTP 的 PATCH

    requests.patch(url, data=None, **kwargs)

    requests.delete() 向 HTML 页面提交删除请求,类似于 HTTP 的 DELETE

    requests.delete(url, **kwargs)

Response 返回类型的基本属性

稍安勿躁,在进行下一步实操之前,让我们再了解一下之前我们涉及到的 Response 的部分基本属性

.status_code

HTML 返回的状态码,你可以参考百度百科上的内容了解具体的含义

.text

内容的字符串形式,简而言之,就是网页上的内容

.encoding

从 HTTP header中获得响应内容编码方式,如果在 header 里没有声明,那么将会是 ISO-8859-1

.apparent_encoding

从内容中分析出的响应内容编码方式,在执行过程中会对各种编码的概率进行计算,给出最可能的编码类型,注意在程序中使用它会导致程序速度变慢。

.content

html 内容的二进制显示,对于图片这样的非文本文件,二进制的输出是必要的

raise_for_status()

这是我们上一个程序示例中没有出现的内容,但它很重要

如果不是 200,产生异常

网络传输存在着不确定性,发现并及时处理异常非常重要

重新打开 Python 命令行

cd ~
python3
  •  

导入 requests 库,这次我们爬取一个不存在的页面

targetUrl = "https://cloud.tencent.com/dsadfas"
res = requests.get(targetUrl)
res.raise_for_status()
  •  

不出意外的话你就能看到 Python 的报错信息

值得我们注意的是这里是产生中断的报错,而不是一个警告,通过 try...except... 我们可以实现对 http 请求错误的处理。

问题分析与处理

如果你对html请求熟悉,那么一定知道 user-agent 这玩意儿,它标识了访问者浏览器的类型,Python 很诚实的告诉网站服务器它是一个 Python 程序,然而如果我们希望获得其中的内容就需要更改这个 user-agent

在之前基础上这么尝试:

h = {
    "user-agent":"Mozilla/5.0 (MSIE 10.0; Windows NT 6.1; Trident/5.0)"
}
#这里用的是IE的user-agent
res = requests.get(url,headers = h)
print(res.status_code)

小结

http 请求 headers 中包含的信息并不只有 user-agent,很多网站都有反爬的基本策略,有的检查 user-agent,类似于我们之前看到的亚马逊,有的网站会检查 host,refer 等字段,这些内容是否需要确定,如何更改相信有了之前的例子你已经懂了,关于更多这部分的内容不属于本教程的范畴,请自行查阅相关资料。

headers 作为参数传递给 requests 库时,应该使用字典格式,把需要的内容放到字典中,剩下的 requests 会帮你解决。

更多参数

和之前出现过的 headers 类似,还有一些参数是我们所需要的这里给出简要,具体使用请自行尝试。

params : 字典或字节序列,作为参数增加到 url 中

data : 字典、字节序列或文件对象,作为 Request 的内容

json : JSON 格式的数据,作为 Request 的内容

headers : 字典,HTTP 定制头

cookies : 字典或 CookieJar, Request 中的 cookie

auth : 元组,支持 HTTP 认证功能

files : 字典类型,传输文件

timeout : 设定超时时间,秒为单位

proxies : 字典类型,设定访问代理服务器,可以增加登录认证

allow_redirects : True/False,默认为 True,重定向开关

stream : True/False, 默认为 True, 获取内容立即下载开关

verify : True/False, 默认为 True, 认证 SSL 证书开关

cert : 本地 SSL 证书路径

*以上内容来源网络

 

 

 

展开阅读全文
打赏
0
2 收藏
分享
加载中
更多评论
打赏
0 评论
2 收藏
0
分享
返回顶部
顶部