Python爬虫入门——Requests库

  学习爬虫之前呢,最好要对HTTP协议有了解,我前面有写过几篇关于HTTP协议的文章,建议读者阅读一下,对爬虫帮助很大。

1. 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

最常用的get方法:

requests.get(url,params=None,**kwargs)
  • url:
  • params:url中的额外参数,字典或字节流格式,可选字段
  • **kwargs:12个控制访问参数,可选字段(后面会具体讲解每个参数的含义)

其他几个方法如下:

requests.request(method,url,**kwargs)
requests.post(url,data=None,json=None**kwargs)
requests.head(url,**kwargs)
requests.put(url,data=None**kwargs)
requests.patch(url,data=None**kwargs)
requests.delete(url,**kwargs)

PS:这里要说明一下:

r = requests.request(method='GET', url=url, **kwargs)
r = requests.get(url, **kwargs)

这两句代码的意思完全一样,只是为了方便,做了一层封装而已。

2. Requests中两个重要的对象

r = requests.get(url)

r:是一个Response对象,一个包含服务器资源的对象,Request对象包含爬虫返回的内容。
.get(url):是一个Request对象,构造一个向服务器请求资源的Request。
  PS:这两个对象指的就是就是HTTP协议中的请求和响应报文。

常见的Response对象的属性:

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

3. **kwargs 控制访问的参数

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

参数说明
params字典或字节序列,作为参数增加到url中。
data字典、字节序列或文件对象,作为Request的内容 ,放在url链接对应位置的地方,作为数据来存储
jsonJSON数据格式,作为Request的内容
headers字典,HTTP定制头
cookies字典或CookieJar,Request中的cookie
auth元组类型,它是支持http认证功能的。
files字典类型,传输文件
timeout设置超时时间,秒为单位
proxies字典类型,设定访问代理服务器,可以增加登录认证。(有效地防止对爬虫的逆追踪)
allow_redirectsTrue/False,默认为True,表示允许对url进行重定向
streamTrue/False,默认为True,获取内容即下载开关
verifyTrue/False,默认为True,认证SSL证书开关
cert保存本地SSL证书路径的字段

这十三个控制访问参数具体使用如下:

  • params
import requests
kv = {'key1': 'one', 'key2': 'two'}
r = requests.request('GET', 'http://python123.io/ws', params=kv)
print(r.request.url)      #看看提交的URL变成了什么

'https://python123.io/ws?key1=one&key2=two'
  • data
import requests
key = {'key1':'one', 'key2':'two'}
url = 'http://httpbin.org/put'
r = requests.request('POST', 'http://python123.io/ws', data=key)
# or 
r = requests.request('POST', 'http://python123.io/ws', data='FDGDFG') #字符串
  • json,一种数据格式。
import requests
kv = {'name': 'youdi', 'role': 'king', 'rank': 'the one'}
url = 'http://httpbin.org/post'
r = requests.request(method='POST', url=url, json=kv)
print(r.text)

{
  "args": {}, 
  "data": "{\"role\": \"king\", \"rank\": \"the one\", \"name\": \"youdi\"}",  #json格式,其实就是字符串
  "files": {}, 
  "form": {}, 
  "headers": {
    "Accept": "*/*", 
    "Accept-Encoding": "gzip, deflate", 
    "Connection": "close", 
    "Content-Length": "52", 
    "Content-Type": "application/json", 
    "Host": "httpbin.org", 
    "User-Agent": "python-requests/2.13.0"
  }, 
  "json": {
    "name": "youdi", 
    "rank": "the one", 
    "role": "king"
  }, 
  "origin": "183.60.175.16", 
  "url": "http://httpbin.org/post"
}
  • headers
import requests
url = 'http://httpbin.org/post'
r = requests.request('POST', url)
print(r.request.headers)    # 请求头部信息
# 观察User-Agent
{'User-Agent': 'python-requests/2.22.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Length': '0'}

#加入headers后
headers = {"User-Agent": "Mozilla/5.0"}
r = requests.request('POST', url, headers=headers)
# 观察User-Agent
print(r.request.headers)
 {'User-Agent': 'Mozilla/5.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Length': '0'}
  • cookies
#先获取百度的cookie
import requests
r = requests.request('GET', 'https://www.baidu.com')
cookie = r.cookies

# cookie类型
print(type(cookie))
   <class 'requests.cookies.RequestsCookieJar'>
  • auth,用于支持HTTP认证。类似于网页上登录填写账号密码的意思~
import requests
# 最简单的http验证
from requests.auth import HTTPBasicAuth

r = requests.get('http://httpbin.org/auth', auth=HTTPBasicAuth('user', 'user'))
# r = requests.get('http://httpbin.org/auth', auth=('user', 'user'))
print(r.status_code)
  • files
fs = {file: open('data.xls', 'rb')}
# 使用files参数就可以了
r = requests.request('POST','http://httpbin.org/post',files=fs)
  • timeout
import requests
from requests.exceptions import ReadTimeout

try:
  # 设置必须在500ms内收到响应,不然或抛出ReadTimeout异常
  response = requests.get("http://httpbin.org/get", timeout=0.5)
  print(response.status_code)
except ReadTimeout:
  print('Timeout')
  • proxies,字典类型,设定访问代理服务器,可以增加登录认证。
import requests

#普通代理
proxies = {
   "http": "http://127.0.0.1:1080",
   "https": "https://127.0.0.1:1080",
}
# 往请求中设置代理(proxies)
r = requests.get("https://www.taobao.com", proxies=proxies)
print(r.status_code)

# 带有用户名和密码的代理
proxies = {
   "http": "http://user:password@127.0.0.1:9743/",
}
r = requests.get("https://www.taobao.com", proxies=proxies)
print(r.status_code)

# 设置socks代理,翻墙必备。但是得提前安装库:pip install pysocks
proxies = {
   'http': 'socks5://127.0.0.1:1080',
   'https': 'socks5://127.0.0.1:1080'
}
r = requests.get("https://www.google.com", proxies=proxies)
print(r.status_code)
  • allow_redirects,True/False,默认为True,重定向开关。
r = requests.request('GET','http://httpbin.org/get',allow_redirects=False)
  • stream,True/False,默认为True,获取内容立即下载开关。
r = requests.request('GET','http://httpbin.org/get/**.txt',stream=False)
  • verity,True/False默认Ture,认证ssl证书开关。
# 无证书访问
r = requests.get('https://www.12306.cn')
# 在请求https时,request会进行证书的验证,如果验证失败则会抛出异常
print(r.status_code)


# 关闭验证,但是仍然会报出证书警告
r = requests.get('https://www.12306.cn',verify=False)
print(r.status_code)

# 消除关闭证书验证的警告
from requests.packages import urllib3

# 关闭警告
urllib3.disable_warnings()
r = requests.get('https://www.12306.cn',verify=False)
print(r.status_code)
  • cert,本地ssl证书路径。
# 设置本地证书
r = requests.get('https://www.12306.cn', cert=('/home/youdi/Download/**.crt', '/hone/youdi/.ssh/**.key'))
print(r.status_code)

4. 理解Requests的异常

不是所有请求都能成功的,会有许多异常。

异常说明
requests.ConnectionError网络连接异常,如DNS查询失败,拒绝连接等
requests.HTTPErrorHTTP错误异常
requests.URLRequiredURL缺失异常
requests.TooManyRedirects超过最大重定向次数,产生重定向异常
requests.ConnectTimeout连接远程服务器超时异常
requests.Timeout请求URL超时,产生超时异常
import requests
import requests.exceptions 

try:
  response = requests.get("http://httpbin.org/get", timeout = 0.5)
  print(response.status_code)
except requests.ReadTimeout:
  print('Timeout')  # 超时异常
except requests.ConnectionError:
  print('Connection error')  # 连接异常
except requests.HTTPError:
  print('Error') 

5. 理解Response的异常

r.raise_for_status(),如果status_code不是200,产生异常requests.HTTPError。
r.raise_for_status()方法内部判断r.status_code是否等于200,不需要增加额外的if语句,该语句便于利用try-except进行异常处理。

import requests
import requests.exceptions
url = "https://www.amazon.cn/dp/B00J7E381S?ref_=Oct_DotdV2_PC_2_GS_DOTD_f0f9ddb1&pf_rd_r=269HMTWP7R5ZPFRGY17V&pf_rd_p=8c48638a-3752-448a-8685-5a17153fb132&pf_rd_m=A1AJ19PSB66TGU&pf_rd_s=desktop-2"
try:
    r = requests.get(url)
    r.raise_for_status()
except requests.HTTPError:
   print("error")
   #报错,显示HTTPError异常

6. Robots协议

网络爬虫的限制:

  1. 来源审查
    判断User-Agent进行限制。检查来访HTTP协议头的User-Agent域,只响应浏览器或友好爬虫。我们可以根据修改User-Agent域,来避免被限制。
  2. 发布公告
    Robots协议 ,告诉所有的爬虫,网站的爬取策略,要爬虫遵守。
    形式:在网站根目录下的robots.txt文件(例如:www.JD.com/robots.txt),告诉想要爬去网站的人,哪些目录是允许爬取的,哪些是不允许的。
User-Agent:*
Disallow:/
Robots协议语法:*代表所有,/代表根目录

7.总结

  文章对Python的Request库进行了详解,爬虫系列有时间话会一直更新下去。这里也强烈推荐《中国大学慕课》上北京理工大学嵩天老师的Python爬虫课,非常好!文章也是根据嵩老师的课程所写。
  本宝才疏学浅,文章如有不当之处,还请多多指教~~ (●′ω`●)

  • 15
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值