MOOC爬虫

本文最后更新于:2022年5月18日 晚上

requests模块

Response对象的属性

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

注意
r.encoding: 如果header中不存在charset,则认为编码为ISO-8859-1
r.text根据r.encoding显示网页内容
r.apparent_encoding: 根据网页内容分析出的编码方式
可以看作是r.encoding的备选

Requests库的异常

异常 说明
requests.ConnectionError 网络连接错误异常,如DNS查询失败、拒接俩捏等
requests.HTTPError HTTP错误异常
requests.URLRequired URL缺失异常
requests.TooManyRedirects 超过最大重定向次数,产生重定向异常
requests.ConnectTimeout 连接远程服务器超时异常
requests.Timeout 请求URL超时,产生超时异常
requests.raise_for_status() 如果不是200,产生异常 requests.HTTPError

Requests库的7个重要方法

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

HTTP协议

HTTP,Hypertext Transfer Protocol,超文本传输协议
HTTP是一个基于“请求与响应”模式的,无状态的应用层协议
HTTP协议采用URL作为定位网络资源的标识,URL格式如下:

http://host[:port][path]

host: 合法的Internet主机域名或IP地址

port: 端口号,缺省端口为80

path: 请求资源的路径

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

HTTP协议对资源的操作

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

HTTP协议与Requests库
协议方法和Requests库对应的方法功能一致

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

method: 请求方式
get、head、post、put、patch、delete、optios

**kwargs: 控制访问的参数,均为可选项(13个)

params: 字典或字节序列,作为参数增加到url中
r.url: 可以查看请求连接和所带的参数

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

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

headers: 字典,HTTP定制头

cookies: 字典或CookieJar,Request中的cookie

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

files: 字典类型,传输文件

1
2
fs = {'file': open('data.xls', 'rb')}
r = requests.request('POST', url, file=fs)

timeout: 设定超时时间,单位为秒(超时会产生一个Timeout异常)

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

1
2
3
pxs = {'http': 'http://user:pass@10.10.10.1:1234',
'https': 'https://10.10.10.1:4321'}
r = requests.request('GET', url, proxies=pxs)

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

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

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

cert: 本地SSL证书路径

Beautiful Soup库的使用

库的小测

1
2
3
4
5
6
7
import requests
from bs4 import BeautifulSoup
url = "http://python123.io/ws/demo.html"
r = requests.get(url)
demo = r.text
soup = BeautifulSoup(demo, "html.parser") # html的解析器
print(soup.prettify())

Beautiful Soup库的理解
\

...\


\

..\

: 标签Tag
p: 名称Name成对出现
属性域Attributes 0个或多个(来定义标签的特点的)

Beautiful Soup库解析器

解析器 使用方法 条件
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

Beautiful Soup类的基本元素

基本元素 说明
Tag 标签,最基本的信息组织单元,分别用<>和表明开头和结尾
Name 标签的名字,\

...\

的名字是’p’,格式:.name
Attributes 标签的属性,字典形式组织,格式:.attrs
NavigableString 标签内非属性字符串,<>...中字符串,格式:.string
Comment 标签内字符串的注释部分,一种特殊的Comment类型
1
2
3
4
5
6
7
8
9
10
print(soup.title)

print(soup.a.parent.name)

print(soup.a.attrs)
print(soup.a.attrs['href'])

newsoup = BeautifulSoup("<b><!--这是注释--></b><p>这不是注释</p>", "html.parser")
print(newsoup.b.string, type(newsoup.b.string))
print(newsoup.p.sting, type(newsoup.p.string))

bs4库的HTML内容遍历方法
标签树的下行遍历

属性 说明
.contents 子节点的列表,将所有儿子节点存入列表
.children 子节点的迭代类型,与.contents类似,用于循环遍历儿子节点
.descendants 子孙节点的迭代类型,包含所有子孙节点,用于循环遍历

遍历

1
2
3
4
5
for child in soup.body.children:
print(child)

for child in soup.body.descendants:
print(child)

标签树的上行遍历

属性 说明
.parent 节点的父亲标签
.parents 节点先辈标签的迭代类型,用于循环遍历先辈节点

标签树的平行遍历

属性 说明
.next_sibling 返回按照HTML文本顺序的下一个平行节点标签
.previous_sibling 返回按照HTML文本顺序的上一个平行节点标签
.next_siblings 迭代类型,返回按照HTML文本顺序的后续所有平行节点标签
.previous_siblings 迭代类型,返回按照HTML文本顺序的前续所有平行节点标签
1
2
3
4
5
for sibling in soup.a.next_siblings:
print(sibling)

for sibling in soup.a.previous_siblings:
print(sibling)

实例:提取html文件中所有a标签中的URL连接

1
2
3
soup = BeautifulSoup(demo, "html.parser") # html的解析器
for link in soup.findAll('a'):
print(link.attrs['href'])

基于bs4库的HTML内容查找方法
<>.find_all(name, attrs, recursive, string, **kwargs)
返回一个列表类型,存储查找的结果。

name: 对标签名称的索引字符串。

1
2
3
4
soup.find_all('a') # 查找a标签
soup.find_all(['a', 'b']) # 查找a和b标签
soup.find_all(True) #所有标签
suop.find_all(re.compile('b')) #查找所有以b开头的标签

attrs: 对标签属性值的索引字符串,可标注属性索引。

1
2
3
soup.find_all('p', 'course')
soup.find_all(id='link1')
soup.find_all(id=re.compile('link')) #查找link开头的标签

recursive: 是否对子孙全部索引,默认True。

1
2
soup.find_all('a') #是有返回值的
soup.find_all('a', recursive=False) #没有返回值(说明soup的根节点下没有a标签)

string: <>...中字符串区域的检索字符串。

1
2
soup.find_all(string='Besic Python') #返回值只有一个
soup.find_all(string=re.comile('python')) #返回值不止一个

\(..) 等价于 \.find_all(..)
soup(..) 等价于 soup.find_all(..)

扩展方法

方法 说明
<>.find() 搜索且只返回一个结果,字符串类型,同.find_all()参数
<>.find_parents() 在先辈节点中搜索,返回列表类型,同.find_all()参数
<>.find_parent() 在先辈节点中返回一个结果,字符串类型,同.find()参数
<>.find_next_siblings() 在后续平行节点中搜索,返回列表类型,同.find_all参数
<>.find_next_sibling() 在后续平行节点中返回一个结果,字符串类型,同.find()参数
<>.find_previous_siblings() 在前序平行节点中搜索,返回列表类型,同.find_all()参数
<>.find_previous_sibling() 在前序平行节点中返回一个结果,字符串类型,同.find()参数

MOOC爬虫
https://kd-happy.github.io/posts/2021/04-227548fa7ce917.html
作者
KD
发布于
2021年4月22日
许可协议