[python爬虫]Requests-BeautifulSoup-Re库方案--Requests库介绍

作者: 澳门新萄京app  发布:2019-10-20

【根据北京理工大学嵩天老师“Python网络爬虫与信息提取”慕课课程编写  文章中部分图片来自老师PPT

一:Requests库

慕课链接:】

Requests is an elegant and simple HTTP library for Python, built for human beings.


1.安装

一、python爬虫的思路

pip install requests

爬虫是指根据一定规则(如页面HTML结构)可以在网络页面上获取大量数据的代码或程序。python语言提供了很多适合编写爬虫的库。

安装小测

python爬虫有很多种思路,这里使用3个python库搭建:Requests、BeautifulSoup、Re。

>>> import requests
>>> r=requests.get("http://www.baidu.com")
>>> print(r.status_code)
200
>>> r.text
'<!DOCTYPE html>rn<!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible content=IE=Edge><meta content=always name=referrer><link rel=stylesheet type=text/css href=http://s1.bdstatic.com/r/www/cache/bdorz/baidu.min.css><title>çx99¾åº¦ä¸x80ä¸x8bï¼x8cä½xa0å°±çx9f¥éx81x93</title></head> <body link=#0000cc> <div id=wrapper> <div id=head> <div class=head_wrapper> <div class=s_form> <div class=s_form_wrapper> <div id=lg> <img hidefocus=true src=//www.baidu.com/img/bd_logo1.png width=270 height=129> </div> <form id=form name=f action=//www.baidu.com/s class=fm> <input type=hidden name=bdorz_come value=1> <input type=hidden name=ie value=utf-8> <input type=hidden name=f value=8> <input type=hidden name=rsv_bp value=1> <input type=hidden name=rsv_idx value=1> <input type=hidden name=tn value=baidu><input id=kw name=wd class=s_ipt value maxlength=255 autocomplete=off autofocus><input type=submit id=su value=çx99¾åº¦ä¸x80ä¸x8b class="bg s_btn"> </form> </div> </div> <div id=u1> <a href=http://news.baidu.com name=tj_trnews class=mnav>æx96°éx97»</a> <a href=http://www.hao123.com name=tj_trhao123 class=mnav>hao123</a> <a href=http://map.baidu.com name=tj_trmap class=mnav>åx9c°åx9b¾</a> <a href=http://v.baidu.com name=tj_trvideo class=mnav>è§x86é¢x91</a> <a href=http://tieba.baidu.com name=tj_trtieba class=mnav>è´´åx90§</a> <noscript> <a href=http://www.baidu.com/bdorz/login.gif?login&amp;tpl=mn&amp;u=http%3A%2F%2Fwww.baidu.com%2f%3fbdorz_come%3d1 name=tj_login class=lb>çx99»å½x95</a> </noscript> <script>document.write('<a href="http://www.baidu.com/bdorz/login.gif?login&tpl=mn&u='+ encodeURIComponent(window.location.href+ (window.location.search === "" ? "?" : "&")+ "bdorz_come=1")+ '" name="tj_login" class="lb">çx99»å½x95</a>');</script> <a href=//www.baidu.com/more/ name=tj_briicon class=bri style="display: block;">æx9b´å¤x9a产åx93x81</a> </div> </div> </div> <div id=ftCon> <div id=ftConw> <p id=lh> <a href=http://home.baidu.com>åx85³äºx8eçx99¾åº¦</a> <a href=http://ir.baidu.com>About Baidu</a> </p> <p id=cp>&copy;2017&nbsp;Baidu&nbsp;<a href=http://www.baidu.com/duty/>使çx94¨çx99¾åº¦åx89x8då¿x85读</a>&nbsp; <a href=http://jianyi.baidu.com/ class=cp-feedback>æx84x8fè§x81åx8fx8dé¦x88</a>&nbsp;京ICPè¯x81030173åx8f·&nbsp; <img src=//www.baidu.com/img/gs.gif> </p> </div> </div> </div> </body> </html>rn'

Requests库提供了方法获取HTML页面,相当于把网页抓取到了一个变量中,再使用这个变量进行后续处理。更多信息请查看官方文档:。

2.requests库的八个方法

BeautifulSoup库提供了方法解析抓取下来的HTML页面。它根据HTML页面的DOM(Document Object Model)结构,解析我们真正感兴趣的内容。BeautifulSopu(美味汤),就像是Requests库提供了丰富但是杂乱的食材,而BeautifulSoup库知道哪些食材可以用,并用这些食材做成了一锅美味的汤。更多信息请查看官方文档:。

requests.request() 构造一个请求,支撑以下各方法的基础方法
requests.get() 获取HTML网页的主要方法,对应于HTTP的GET
requests.head() 获取HTML网页头信息的方法,对应于HTTP的HEAD
requests.post() 向HTML网页提交POST请求的方法,对应于HTTP的POS
requests.put() 向HTML网页提交PUT请求的方法,对应于HTTP的PUT
requests.patch() 向HTML网页提交局部修改请求,对应于HTTP的PATCH
requests.delete() 向HTML页面提交删除请求,对应于HTTP的DELETE
requests.options(url, **kwargs)

Re库提供了使用正则表达式(Regular Expression)的方法。正则表达式是多个字符串的概括表示,有点像模糊匹配。使用正则表达式,可以更好地匹配HTML的DOM结构。更多信息请查看官方文档:。

3 requests库的两个重要对象:request和response(包含爬虫返回的内容)

使用Requests、BeautifulSoup、Re库搭建python爬虫的思路是:Requests库获取页面内容,BeautifulSoup库解析页面内容,Re库辅助匹配字符串。这3个库都比较简洁,语法也不是很复杂,适合构建中小型的爬虫。

response = requests.get(url) 

 

构造一个向服务器请求**资源的Request对象**

二、Requests库基本使用

*返回一个包含服务器**资源的Response对象 ***

1.Requests库的安装

*∙ url : 拟获取页面的url链接
∙ params : url中的额外参数,字典或字节流格式,可选
∙ **kwargs: 12个控制访问的参数 *

①python的正确安装

Response对象包含服务器返回的所有信息,也包含请求的Request信息

在python官网下载python3.x版本,python官网:。

>>> import requests
>>> r=requests.get("http://www.baidu.com")
>>> print(r.status_code)
200
>>> type(r)
<class 'requests.models.Response'>
>>> r.headers
{'Server': 'bfe/1.0.8.18', 'Date': 'Fri, 17 Nov 2017 02:24:03 GMT', 'Content-Type': 'text/html', 'Last-Modified': 'Mon, 23 Jan 2017 13:28:28 GMT', 'Transfer-Encoding': 'chunked', 'Connection': 'Keep-Alive', 'Cache-Control': 'private, no-cache, no-store, proxy-revalidate, no-transform', 'Pragma': 'no-cache', 'Set-Cookie': 'BDORZ=27315; max-age=86400; domain=.baidu.com; path=/', 'Content-Encoding': 'gzip'}
>>>

python语言有两个版本同步更新:2.x系列和3.x系列。当前最新版本是2.7和3.7。2.x版本是之前的版本,各种库比较丰富。3.x版本是2009年开始开发的,相比较于2.x版本语法有很大的变化。两个版本是不兼容的。发展到现在,3.x系列已经有很多成熟的第三方库了,官方也在支持3.x系列版本的开发。除此之外,BeautifulSoup库对3.x版本也有优化。

4 Response对象的属性

下载并安装python后,需要配置计算机环境变量,为了在使用CMD命令窗口时可以正确找到所需工具的位置。(pip工具)

r.status_code HTTP      请求的返回状态,200表示连接成功,404表示失败
r.text HTTP                  响应内容的字符串形式,即,url对应的页面内容
r.encoding                   从HTTP header中猜测的响应内容编码方式
apparent_encoding     从内容中分析出的响应内容编码方式(备选编码方式)
r.content HTTP           响应内容的二进制形式

图片 1  图片 2

与安装小测比较

右键计算机属性-高级系统设置-环境变量。在用户变量列表中,找到Path变量,点击编辑。新建两个变量,目录是python安装目录下python.exe和pip.exe所在位置。

>>> r.encoding
'ISO-8859-1'
>>> r.apparent_encoding
'utf-8'
>>> r.encoding="utf-8"
>>> r.text
'<!DOCTYPE html>rn<!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible content=IE=Edge><meta content=always name=referrer><link rel=stylesheet type=text/css href=http://s1.bdstatic.com/r/www/cache/bdorz/baidu.min.css><title>百度一下,你就知道</title></head> <body link=#0000cc> <div id=wrapper> <div id=head> <div class=head_wrapper> <div class=s_form> <div class=s_form_wrapper> <div id=lg> <img hidefocus=true src=//www.baidu.com/img/bd_logo1.png width=270 height=129> </div> <form id=form name=f action=//www.baidu.com/s class=fm> <input type=hidden name=bdorz_come value=1> <input type=hidden name=ie value=utf-8> <input type=hidden name=f value=8> <input type=hidden name=rsv_bp value=1> <input type=hidden name=rsv_idx value=1> <input type=hidden name=tn value=baidu><input id=kw name=wd class=s_ipt value maxlength=255 autocomplete=off autofocus><input type=submit id=su value=百度一下 class="bg s_btn"> </form> </div> </div> <div id=u1> <a href=http://news.baidu.com name=tj_trnews class=mnav>新闻</a> <a href=http://www.hao123.com name=tj_trhao123 class=mnav>hao123</a> <a href=http://map.baidu.com name=tj_trmap class=mnav>地图</a> <a href=http://v.baidu.com name=tj_trvideo class=mnav>视频</a> <a href=http://tieba.baidu.com name=tj_trtieba class=mnav>贴吧</a> <noscript> <a href=http://www.baidu.com/bdorz/login.gif?login&amp;tpl=mn&amp;u=http%3A%2F%2Fwww.baidu.com%2f%3fbdorz_come%3d1 name=tj_login class=lb>登录</a> </noscript> <script>document.write('<a href="http://www.baidu.com/bdorz/login.gif?login&tpl=mn&u='+ encodeURIComponent(window.location.href+ (window.location.search === "" ? "?" : "&")+ "bdorz_come=1")+ '" name="tj_login" class="lb">登录</a>');</script> <a href=//www.baidu.com/more/ name=tj_briicon class=bri style="display: block;">更多产品</a> </div> </div> </div> <div id=ftCon> <div id=ftConw> <p id=lh> <a href=http://home.baidu.com>关于百度</a> <a href=http://ir.baidu.com>About Baidu</a> </p> <p id=cp>&copy;2017&nbsp;Baidu&nbsp;<a href=http://www.baidu.com/duty/>使用百度前必读</a>&nbsp; <a href=http://jianyi.baidu.com/ class=cp-feedback>意见反馈</a>&nbsp;京ICP证030173号&nbsp; <img src=//www.baidu.com/img/gs.gif> </p> </div> </div> </div> </body> </html>rn'

图片 3  图片 4

r.encoding 从HTTP header中猜测的响应内容编码方式
r.apparent_encoding 从内容中分析出的响应内容编码方式(备选编码方式)

打开CMD(command,命令提示符),输入python以测试环境变量是否配置成功。若输出python版本信息,则说明配置成功。

r.encoding:如果header中不存在charset,则认为编码为ISO‐8859‐1   r.text根据r.encoding显示网页内容

图片 5

r.apparent_encoding:根据网页内容分析出的编码方式,可以看作是r.encoding的备选

 

5. requests异常

②Requests库的安装

1 异常 说明
2 requests.ConnectionError 网络连接错误异常,如DNS查询失败、拒绝连接等
3 requests.HTTPError          HTTP错误异常
4 requests.URLRequired           URL缺失异常
5 requests.TooManyRedirects     超过最大重定向次数,产生重定向异常
6 requests.ConnectTimeout         连接远程服务器超时异常
7 requests.Timeout             请求URL超时,产生超时异常

以管理员身份启动CMD(右键CMD即可,这里不确定直接运行CMD是否可以安装成功),输入pip install requests即可从网络上下载并安装requests库。pip是python库的管理工具,可以对大部分库进行下载、安装、更新、卸载等。但是也有部分库是使用pip工具安装不了的。如果提示要先更新pip工具,按照指导更新即可。

6.response异常

图片 6

r.raise_for_status() 如果不是200,产生异常 requests.HTTPError

注意这里有一个容易犯错的地方,也是很多人不会注意到的。启动CMD后输入完python测试配置环境变量成功后,要把CMD退出去,再启动,输入pip install requests。因为在CMD中输入完python后,CMD就变成了python交互器了。

r.raise_for_status()在方法内部判断r.status_code是否等于200,不需要增加额外的if语句,该语句便于利用try‐except进行异常处理 
7.HTTP**Hypertext Transfer Protocol,超文本传输协议**
HTTP是一个基于“请求与响应”模式的、无状态的应用层协议
HTTP协议采用URL作为定位网络资源的标识,URL格式如下:
]
host: 合法的Internet主机域名或IP地址
port: 端口号,缺省端口为80
path: 请求资源的路径

图片 7

HTTP URL实例:


HTTP URL的理解:
URL是通过HTTP协议存取资源的Internet路径,一个URL对应一个数据资源 

 

HTTP协议对资源的操作方法:

 

1 GET 请求获取URL位置的资源
2 HEAD 请求获取URL位置资源的响应消息报告,即获得该资源的头部信息
3 POST 请求向URL位置的资源后附加新的数据
4 PUT 请求向URL位置存储一个资源,覆盖原URL位置的资源
5 PATCH 请求局部更新URL位置的资源,即改变该处资源的部分内容
6 DELETE 请求删除URL位置存储的资源          

2.Requests库的7个主要方法

patch与put

Requests库比较简洁,主要的方法只有7个,分别对应HTTP的功能,这里可以先跳过,不用理解。

假设URL位置有一组数据UserInfo,包括UserID、 UserName等20个字段
需求:用户修改了UserName,其他不变
• 采用PATCH,仅向URL提交UserName的局部更新请求
• 采用PUT,必须将所有20个字段一并提交到URL,未提交字段被删除
PATCH的最主要好处:节省网络带宽

这些方法是:

head

requests.get():获取HTML网页的主要方法,对应HTTP的GET

>>> r=requests.head("http://www.baidu.com")
>>> r.headers
{'Server': 'bfe/1.0.8.18', 'Date': 'Fri, 17 Nov 2017 02:51:22 GMT', 'Content-Type': 'text/html', 'Last-Modified': 'Mon, 13 Jun 2016 02:50:50 GMT', 'Connection': 'Keep-Alive', 'Cache-Control': 'private, no-cache, no-store, proxy-revalidate, no-transform', 'Pragma': 'no-cache', 'Content-Encoding': 'gzip'}
>>> r.text
''

requests.head():获取HTML网页的头信息,对应HTTP的HEAD

参数

requests.post():向HTML网页提交POST请求,对应HTTP的POST

 1 **kwargs: 控制访问的参数,均为可选项
 2 params : 字典或字节序列,作为参数增加到url中
 3 data : 字典、字节序列或文件对象,作为Request的内容
 4 json : JSON格式的数据,作为Request的内容
 5 headers : 字典,HTTP定制头
 6 cookies : 字典或CookieJar,Request中的cookie
 7 auth : 元组,支持HTTP认证功能
 8  files : 字典类型,传输文件
 9 timeout : 设定超时时间,秒为单位
10 proxies : 字典类型,设定访问代理服务器,可以增加登录认证
11 allow_redirects : True/False,默认为True,重定向开关
12 stream : True/False,默认为True,获取内容立即下载开关
13 verify : True/False,默认为True,认证SSL证书开关
14 cert : 本地SSL证书路径            

requests.put():向HTML网页提交PUT请求,对应HTTP的PUT

Robots Exclusion Standard**,网络爬虫排除标准**
作用:
网站告知网络爬虫哪些页面可以抓取,哪些不行
形式:
在网站根目录下的robots.txt文件 

requests.patch():向HTML网页提交局部修改请求,对应HTTP的PATCH

网络爬虫:自动或人工识别robots.txt,再进行内容爬取**

requests.delete():向HTML网页提交删除请求,对应HTTP的DELETE

约束性:**Robots协议是建议但非约束性,网络爬虫可以不遵守,但存在法律风险 **

requests.request():构造一个请求,是支撑以上各种方法的基础方法

 

其中,最重要的,也是用的最多的是requests.get()。

安装:pip install beautifulsoup4 

 

Beautiful Soup库,也叫beautifulsoup4 或 bs4
约定引用方式如下,即主要是用BeautifulSoup类

3.Requests库的requests.get()

from bs4 import BeautifulSoup
import bs4

r.requests.get(url)这样一行代码,做的事情其实有很多。requests.get(url)通过get()方法和url构造了一个向网页请求资源的Request对象(注意Request对象的'R'是大写)。而get()方法返回一个Response对象,其中包含了网页所有相关资源(即爬虫返回的全部内容),也包括我们向网页请求访问的Request对象中的相关信息。

Beautiful Soup库解析器 

这里,Request和Response是两个重要的对象。

解析器         使用方法             条件
bs4的HTML解析器     BeautifulSoup(mk,'html.parser')   安装bs4库
lxml的HTML解析器   BeautifulSoup(mk,'lxml')   pip install lxml
lxml的XML解析器   BeautifulSoup(mk,'xml')   pip install lxml
html5lib的解析器   BeautifulSoup(mk,'html5lib')   pip install html5lib

①Response对象的重要属性

BeautifulSoup类的基本元素 

r.status_code:HTTP请求的返回状态,200表示连接成功,不是200表示连接失败

Tag 标签,最基本的信息组织单元,分别用<>和</>标明开头和结尾,任何存在于HTML语法中的标签都可以用soup.<tag>访问获得,当HTML文档中存在多个相同<tag>对应内容时,soup.<tag>返回第一个 **

r.encoding:HTTP头部中猜测的内容字符编码方式

Name 标签的名字,<p>…</p>的名字是'p',格式:<tag>.name,*每个<tag>都有自己的名字,通过<tag>.name获取,字符串类型 ***

r.apparent_encoding:从HTTP内容中解析出的最适合该内容的编码方式(与r.encoding的区别会在后面解释)


r.text:HTTP响应内容的字符串形式,即URL对应的页面内容

Attributes 标签的属性,字典形式组织,格式:<tag>.attrs,一个<tag>可以有0或多个属性,字典类型

r.content:HTTP响应内容的二进制形式。如在HTTP中获取的图片、视频等多媒体资源就是用二进制形式存储的


页面中显示的字符都是有一定要求的。有些页面会在HTTP头部中写入charset字段,来标识该页面中文本字符串的编码方式,但是有些页面的头部中没有charset字段。r.encoding的作用就是查看HTTP头部,以返回charset字段的值;如果没有charset字段,则返回的编码方式是'iso-8859-1'。r.apparent_encoding是实实在在地解析页面的内容,分析其中的字符串的最适合的编码方式,并返回这个编码。所以一般情况下,r.apparent_encoding比r.encoding更合理。一般用get()方法成功获取HTTP相关内容后,将r.apparent_encoding的值赋给r.encoding(即r.encoding=r.apparent_encoding),来根据正确的编码方式显示字符。


 

NavigableString 标签内非属性字符串,<>…</>中字符串,格式:<tag>.string,NavigableString可以跨越多个层次

②关于get()方法的定义


图片 8


从图中可以看到,get()方法实际上返回的是一个request()方法构造的对象,即get()方法是request()方法的封装。不光是get()方法,Requests库提供的其他几个方法也都是request()方法的封装。从这个层面上理解,Requests库只有request()这样一个基础的方法。

Comment 标签内字符串的注释部分,一种特殊的Comment类型,Comment是一种特殊类型

 


③get()方法使用的示例

标签树的下行遍历

本文由澳门新萄京app发布于澳门新萄京app,转载请注明出处:[python爬虫]Requests-BeautifulSoup-Re库方案--Requests库介绍

关键词:

上一篇:python文件操作
下一篇:深浅拷贝