近期在MOOC上通过看北京理工大学嵩天老师的Python课程学习网络爬虫,对Requests库内容进行如下总结。
一、主要方法
方法 | 说明 |
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页面提交删除请求,对应于HTTP的DELETE |
1、request方法
requests.request(method,url,**kwargs)
method:请求方式,有‘GET’‘HEAD’‘POST’‘PUT’‘PATCH’‘delete’‘OPTIONS’等7种
url:拟获取页面的url链接
**kwargs:控制访问的参数,共13个
参数 | 说明 |
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证书路径 |
2、get方法
requests.get(url,params = None,**kwargs)
url:拟获取页面的url链接
params:url中的额外参数,字典或字节流格式(可选)
**kwargs:12个控制访问的参数(与request方法相比少了一个proxies参数)
1 r = requests.get(url)
get方法构造一个向服务器请求资源的Ruquest对象,返回一个包含服务器资源的Response对象
Response对象的常用属性
属性 | 说明 |
r.status_code | HTTP请求的返回状态,200表示连接成功,404表示失败 |
r.text | HTTP相应内容的字符串状态,即url对应的页面内容 |
r.encoding | 从HTTP header中猜测的响应内容编码方式(如果header中不存在charset,则认为编码为ISO-8859-1) |
r.apparent_encoding | 从内容中分析出的响应内容编码方式(备选编码方式) |
r.content | HTTP响应内容的二进制形式 |
1 r = requests.get("http://www.baidu.com") 2 print(r.status_code) 3 200 4 type(r) 5 <class 'requests.models.Response'> 6 r.headers 7 {'Cache-Control': 'private, no-cache, no-store, proxy-revalidate, no-transform', 'Connection': 'keep-alive', 'Content-Encoding': 'gzip', 'Content-Type': 'text/html', 'Date': 'Sun, 01 Mar 2020 09:29:13 GMT', 'Last-Modified': 'Mon, 23 Jan 2017 13:27:56 GMT', 'Pragma': 'no-cache', 'Server': 'bfe/1.0.8.18', 'Set-Cookie': 'BDORZ=27315; max-age=86400; domain=.baidu.com; path=/', 'Transfer-Encoding': 'chunked'}
1:利用get方法获取Response对象(赋值给r)
2:打印HTTP请求返回状态
3:HTTP返回状态
4:检测r的类型
5:r的类型
6:查看r的头部信息
7:r的头部信息
理解Response的编码
1 r = requests.get("http://www.baidu.com") 2 r.text 3 '\r\nç\x99¾åº¦ä¸\x80ä¸\x8bï¼\x8cä½\xa0å°±ç\x9f¥é\x81\x93 \r\n' 4 r.encoding 5 'ISO-8859-1' 6 r.apparent_encoding 7 'utf-8' 8 r.encoding = r.apparent_encoding 9 r.text 10 '\r\nå\x85³äº\x8eç\x99¾åº¦ About Baidu
©2017 Baidu 使ç\x94¨ç\x99¾åº¦å\x89\x8då¿\x85读 æ\x84\x8fè§\x81å\x8f\x8dé¦\x88 京ICPè¯\x81030173å\x8f·
百度一下,你就知道 \r\n'
r的header中不存在charset,encoding默认编码为“ISO-8859-1”。将apparent_encoding(由r的内容得出编码方式)赋值给encoding,获得正确的编码。
3、head方法
requests.head(url,**kwargs)
url:拟获取页面的url链接
**kwargs:控制访问的参数,共13个(与request方法参数完全一样)
4、post方法
requests.post(url,data = None,json = None,**kwargs)
url:拟获取页面的url链接
data:字典、字节序列或文件,Request的内容
json:JSON格式的数据,Request的内容
**kwargs:控制访问的参数,共11个
5、put方法
requests.put(url,data = None,**kwargs)
url:拟获取页面的url链接
data:字典、字节序列或文件,Request的内容
**kwargs:控制访问的参数,共12个
6、patch方法
requests.patch(url,data = None,**kwargs)
url:拟获取页面的url链接
data:字典、字节序列或文件,Request的内容
**kwargs:控制访问的参数,共12个
7、delete方法
requests.delete(url,**kwargs)
url:拟获取页面的url链接
**kwargs:控制访问的参数,共13个(与request方法参数完全一样)
二、网页爬取
1、HTTP
HTTP,Hypertext Transfer Protocol,超文本传输协议。HTTP是一个基于“请求与响应”模式的、无状态的应用层协议,采用URL作为定位网络资源的标识。URL是通过HTTP协议存取资源的Internet路径,一个URL对应一个数据资源。
URL格式: http://host[:port][path]
host:合法的Internet主机域名或IP地址
port:端口号,缺省端口为80
path:请求资源的路径
HTTP协议对资源的操作
方法 | 说明 |
GET | 请求获取URL位置的资源 |
HEAD | 请求获取URL位置资源的响应消息报告,即获取该资源的头部信息 |
POST | 请求向URL位置的资源后附加新的数据 |
PUT | 请求向URL位置存储一个资源,覆盖原URL位置的资源 |
PATCH | 请求局部更新URL位置的资源,即改变该处资源的部分内容 |
DELETE | 请求删除URL位置存储的资源 |
2、异常
异常 | 说明 |
requests.ConnectionError | 网络连接错误异常,如DNS查询失败、拒绝连接等 |
requests.HTTPError | HTTP错误异常 |
requests.URLRequired | URL缺失异常 |
requests.TooManyRedirects | 超过最大重定向次数,产生重定向异常 |
requests.ConnectTimeout | 连接远程服务器超时异常 |
requests.Timeout | 请求URL超时,产生超时异常 |
r.raise_for_status() | 如果不是200,产生异常requests.HTTPError |
3、爬取网页通用代码框架
1 try: 2 r = requests.get(url,timeout = 30) 3 r.raise_for_status() #如果状态不是200,引发HTTPError异常 4 r.encoding = r.apparent_encoding 5 return r.text 6 except: 7 return "产生异常"
三、实例
1、京东商品页面的爬取
1 r = requests.get("https://item.jd.com/100008348542.html") 2 r.status_code 3 200 4 r.text[:1000] #前1000个字符 5 '\n\n\n \n \n【AppleiPhone 11】Apple iPhone 11 (A2223) 128GB 黑色 移动联通电信4G手机 双卡双待【行情 报价 价格 评测】-京东 \n \n \n \n \n \n \n \n '
该例子直接爬取网站数据,查看返回状态正常,然后输出。
京东商品页面爬取全代码
1 import requests 2 url = "https://item.jd.com/100008348542.html" 3 try: 4 r = requests.get(url) 5 r.raise_for_status() 6 r.encoding = r.apparent_encoding 7 print(r.text[:1000] #前1000个字符 8 except: 9 print("爬取失败")
2、亚马逊商品页面的爬取
1 import requests 2 r = requests.get("https://www.amazon.cn/dp/B01N5RGXYR/ref=Oct_DLandingS_rdp_db4d4b3c") 3 r.status_code 4 503 5 r.encoding 6 'ISO-8859-1' 7 r.apparent_encoding 8 'utf-8' 9 r.encoding = r.apparent_encoding 10 r.text[2000:3000] #第2001到第3000个字符 11 ' \n请输入您在下方看到的字符
\n抱歉,我们只是想确认一下当前访问者并非自动程序。为了达到最佳效果,请确保您浏览器上的 Cookie 已启用。
\n