美文网首页
python爬虫8: Requests库使用

python爬虫8: Requests库使用

作者: dc630f46ee2d | 来源:发表于2017-11-07 00:14 被阅读0次

前言

Requests实现简单易用的HTTP库,基于urllib,比urllib方便,做爬虫使用Requests比urllib方便。

GET基本用法

  1. 基本GET请求
import requests
response = requests.get('http://www.baidu.com')
print(response.text)

其中response.text是字符串类型

  1. 带参数的GET请求1
import requests #package
response = requests.get('http://httpbin.org/get?name=zhou&age=29') #__init__.py中的方法直接用包名.方法名

?分割参数和路径。&风格参数。

3.使用字典传入参数发送GET请求

dict = {'name':'zhou',
        'age':29
        }
response = requests.get('http://httpbin.org/get',params=dict)
print(response.text)
  1. 解析json.即将返回结果可以用dict保存
dict = {'name':'zhou',
        'age':29
        }
response = requests.get('http://httpbin.org/get',params=dict)
print(response.json())

response.json() 将json用python的dict类型保存

  1. 获取二进制数据 response.conent
response = requests.get("https://github.com/favicon.ico")
print(type(response.content))
with open('2.icon', 'wb') as f:
    f.write(response.content)

解释一下with...open() as f:等价于

response = requests.get("https://github.com/favicon.ico")
print(type(response.content))
with open('2.icon', 'wb') as f:
    f.write(response.content)

对于open()内置方法,第一个参数是文件全路径。第二个参数'wb'表示,以byte形式write.

  1. 添加headers

有些网站爬虫的时候,如果不加上headers(比如请求的应用程序是什么),可能会出现响应不正确返回。

import requests  # package

response = requests.get("https://www.zhihu.com/explore")
print(response.status_code)

输出500而不是200
修改一下

import requests  # package

dict = {'User-Agent':'User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36'}
response = requests.get("https://www.zhihu.com/explore",headers=dict)
print(response.status_code)

输出200

POST基本用法

post和get方法类型,唯一的区别可以添加数据到request body

响应

查看repsonse的一些属性

import requests  # package.

response = requests.get('http://www.jianshu.com') #__init__.py中的方法可以直接这样调用 
print(type(response.status_code), response.status_code)
print(type(response.headers), response.headers)
print(type(response.cookies), response.cookies)
print(type(response.url), response.url)
print(type(response.history), response.history)

输出如下
<class 'int'> 200
<class 'requests.structures.CaseInsensitiveDict'> {'Date': 'Sun, 05 Nov 2017 13:37:40 GMT', 'Server': 'Tengine', 'Content-Type': 'text/html; charset=utf-8', 'Transfer-Encoding': 'chunked', 'X-Frame-Options': 'DENY', 'X-XSS-Protection': '1; mode=block', 'X-Content-Type-Options': 'nosniff', 'ETag': 'W/"85a833d01f43b34ca494a1f2d556eb57"', 'Cache-Control': 'max-age=0, private, must-revalidate', 'Set-Cookie': '_m7e_session=3547b198f318f3554b571be30322df3a; path=/; expires=Sun, 05 Nov 2017 19:37:40 -0000; HttpOnly', 'X-Request-Id': 'ab775f20-eb6c-490e-8fc8-e65a3b36de73', 'X-Runtime': '0.008022', 'Content-Encoding': 'gzip', 'X-Via': '1.1 shendianxin28:0 (Cdn Cache Server V2.0)', 'Connection': 'keep-alive'}
<class 'requests.cookies.RequestsCookieJar'> <RequestsCookieJar[<Cookie _m7e_session=3547b198f318f3554b571be30322df3a for www.jianshu.com/>]>
<class 'str'> http://www.jianshu.com/
<class 'list'> []

状态码类型是int 值 200
headers类型是requests.structures.CaseInsensitiveDict
cookies类型是requests.cookies.RequestsCookieJar
等等其他

状态码的判断

访问一个不存在的页面,返回状态码为404

import requests  # package,只能调用__init__.py中的方法,要调用request.auth.py的方法,需要import request.auth
response = requests.get('http://www.jianshu.com/hello.html')
print(response.status_code)
import requests  # package,只能调用__init__.py中的方法,要调用request.auth.py的方法,需要import request.auth
response = requests.get('http://www.jianshu.com')
exit()  if not response.status_code == 200  else print('succesful') # 如果不等于200 退出程序,否则输出成功

文件上传

import requests  # package,只能调用__init__.py中的方法,要调用request.auth.py的方法,需要import request.auth
files = {'files': open('1.icon', 'rb')}
response = requests.post('http://httpbin.org/post', files = files)
print(response.text)

获取cookies

import requests  # package,只能调用__init__.py中的方法,要调用request.auth.py的方法,需要import request.auth

response = requests.get('https://www.baidu.com')
print(response.cookies.items())
for key, value in response.cookies.items():
    print(key + '=' + value)


# a list of name-value tuples
[('a', 'b'), ('c', 'd')]

注意只有 a list of name-value tuples(list的成员都是tuple,tuple中只有两个值)才能用这种遍历方法,一般list不能用这个方法。
for in 后面要加

会话维持

import requests  # package,只能调用__init__.py中的方法,要调用request.auth.py的方法,需要import request.auth

response = requests.get('http://httpbin.org/cookies/set/num/12312456')
response = requests.get('http://httpbing.org/cookies')
print(response.text)

不会输出cookie值,相当于两个浏览器访问了访问了。

创建一个session,用session发请求,可以拿到cookie

s = requests.Session()
s.get('http://httpbin.org/cookies/set/num/12312456')
response = s.get('http://httpbin.org/cookies')
print(response.text)

输出如下

{
  "cookies": {
    "num": "12312456"
  }
}

https证书验证

有些证书并不是证书颁发机构下发的服务器的,浏览器不信任这个证书。以访问https://12306.cn为例,打开网站后就会下图提示这样的结果。

屏幕快照 2017-11-06 上午12.52.38.png

对于这种情况,如果使用requests库的话,会抛出一个异常

import requests  # package,只能调用__init__.py中的方法,要调用request.auth.py的方法,需要import request.auth

response = requests.get('https://www.12306.cn')

我们只需要设置verify参数为NO,就可以了,不再验证证书合法性

import requests  # package,只能调用__init__.py中的方法,要调用request.auth.py的方法,需要import request.auth

response = requests.get('https://www.12306.cn', verify = False)

现在虽然验证成功了。但是发现log窗口依然会报一个警告,如下。

InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings
  InsecureRequestWarning)

将警告屏蔽掉不输出即可

import requests  # package,只能调用__init__.py中的方法,要调用request.auth.py的方法,需要import request.auth
import urllib3
urllib3.disable_warnings()
response = requests.get('https://www.12306.cn', verify = False)

代理

import requests  # package,只能调用__init__.py中的方法,要调用request.auth.py的方法,需要import request.auth
proxy = {
    'http':'http://127.0.0.1:9734',
    'https': 'https://127.0.0.1:9734'
}
response = requests.get('https:wwww.taobao.com', proxy = proxy)

http认证

有些网站访问的时候会弹出框提示用户输入账号密码才能访问。这个就涉及到了http认证。即服务器查询用户是否有访问服务器资源的权限。

import requests  # package,只能调用__init__.py中的方法,要调用request.auth.py的方法,需要import request.auth
import requests.auth
auth = requests.auth.HTTPBasicAuth('user','123'); # requests.auth.HTTPBasicAuth 对象创建
# print(type(auth))
r = requests.get('http://120.27.34.24',auth=auth)

超时设置

设置允许最大的超时时间,如果一旦这个超时时间内依然没有返回,那么程序就不能正常运行了。

import requests  # package,只能调用__init__.py中的方法,要调用request.auth.py的方法,需要import request.auth
from requests.exceptions import  ReadTimeout
try:
    response = requests.get('http://httpbin.org/get', timeout = 0.5)
    print(response.status_code)
except ReadTimeout:
   print('Timeout')

异常处理

可以google requests,然后查看文档Exceptions,拿到所有的异常类

import  requests.exceptions
try:
    response = requests.get('http://httpbin.org/get', timeout = 0.1)
    print(response.status_code)
except requests.exceptions.ReadTimeout:
    print('Timeout')
except requests.exceptions.HTTPError:
    print('HTTPError')
except requests.exceptions.ConnectionError:
    print('ConnectionError')

参考

相关文章

网友评论

      本文标题:python爬虫8: Requests库使用

      本文链接:https://www.haomeiwen.com/subject/foecmxtx.html