python中数据爬虫requests库使用方法详解


Posted in Python onFebruary 11, 2018

一、什么是Requests

Requests 是Python语编写,基于urllib,采Apache2 Licensed开源协议的 HTTP 库。它urllib 更加方便,可以节约我们大量的工作,完全满足HTTP测试需求。

一句话——requests是python实现的简单易用的HTTP库

二、安装Requests库

进入命令行win+R执行

命令:pip install requests

项目导入:import requests

三、各种请求方式

直接上代码,不明白可以查看我的urllib的基本使用方法

import requests
requests.post('http://httpbin.org/post')
requests.put('http://httpbin.org/put')
requests.delete('http://httpbin.org/delete')
requests.head('http://httpbin.org/get')
requests.options('http://httpbin.org/get')

这么多请求方式,都有什么含义,所以问下度娘:

  1. GET: 请求指定的页面信息,并返回实体主体。
  2. HEAD: 只请求页面的首部。
  3. POST: 请求服务器接受所指定的文档作为对所标识的URI的新的从属实体。
  4. PUT: 从客户端向服务器传送的数据取代指定的文档的内容。
  5. DELETE: 请求服务器删除指定的页面。
  6. get 和 post比较常见 GET请求将提交的数据放置在HTTP请求协议头中
  7. POST提交的数据则放在实体数据中

(1)、基本的GET请求

import requests

response = requests.get('http://httpbin.org/get')
print(response.text)

返回值:

{
 "args": {}, 
 "headers": {
  "Accept": "*/*", 
  "Accept-Encoding": "gzip, deflate", 
  "Connection": "close", 
  "Host": "httpbin.org", 
  "User-Agent": "python-requests/2.18.4"
 }, 
 "origin": "183.64.61.29", 
 "url": "http://httpbin.org/get"
}

(2)、带参数的GET请求

将name和age传进去

import requests
response = requests.get("http://httpbin.org/get?name=germey&age=22")
print(response.text)
{
 "args": {
  "age": "22", 
  "name": "germey"
 }, 
 "headers": {
  "Accept": "*/*", 
  "Accept-Encoding": "gzip, deflate", 
  "Connection": "close", 
  "Host": "httpbin.org", 
  "User-Agent": "python-requests/2.18.4"
 }, 
 "origin": "183.64.61.29", 
 "url": "http://httpbin.org/get?name=germey&age=22"
}

或者使用params的方法:

import requests

data = {
 'name': 'germey',
 'age': 22
}
response = requests.get("http://httpbin.org/get", params=data)
print(response.text)

返回值一样

(3)、解析json

将返回值已json的形式展示:

import requests
import json

response = requests.get("http://httpbin.org/get")
print(type(response.text))
print(response.json())
print(json.loads(response.text))
print(type(response.json()))

返回值:

<class 'str'>
{'args': {}, 'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Connection': 'close', 'Host': 'httpbin.org', 'User-Agent': 'python-requests/2.18.4'}, 'origin': '183.64.61.29', 'url': 'http://httpbin.org/get'}
{'args': {}, 'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Connection': 'close', 'Host': 'httpbin.org', 'User-Agent': 'python-requests/2.18.4'}, 'origin': '183.64.61.29', 'url': 'http://httpbin.org/get'}
<class 'dict'>

(4)、获取二进制数据

记住返回值.content就ok了

import requests

response = requests.get("https://github.com/favicon.ico")
print(type(response.text), type(response.content))
print(response.text)
print(response.content)

返回值为二进制不必再进行展示,

(5)、添加headers

有些网站访问时必须带有浏览器等信息,如果不传入headers就会报错,如下

import requests

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

返回值:

<html><body><h1>500 Server Error</h1>
An internal server error occured.
</body></html>

当传入headers时:

import requests

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

成功返回网页源代码不做展示

(6)、基本POST请求

不明白见我博文urllib的使用方法

import requests

data = {'name': 'germey', 'age': '22'}
response = requests.post("http://httpbin.org/post", data=data)
print(response.text)

返回:

{
 "args": {}, 
 "data": "", 
 "files": {}, 
 "form": {
  "age": "22", 
  "name": "germey"
 }, 
 "headers": {
  "Accept": "*/*", 
  "Accept-Encoding": "gzip, deflate", 
  "Connection": "close", 
  "Content-Length": "18", 
  "Content-Type": "application/x-www-form-urlencoded", 
  "Host": "httpbin.org", 
  "User-Agent": "python-requests/2.18.4"
 }, 
 "json": null, 
 "origin": "183.64.61.29", 
 "url": "http://httpbin.org/post"
}

三、响应

response属性

import requests

response = requests.get('http://www.jianshu.com')
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)

return:

<class 'int'> 200
<class 'requests.structures.CaseInsensitiveDict'> {'Date': 'Thu, 01 Feb 2018 20:47:08 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/"9f70e869e7cce214b6e9d90f4ceaa53d"', 'Cache-Control': 'max-age=0, private, must-revalidate', 'Set-Cookie': 'locale=zh-CN; path=/', 'X-Request-Id': '366f4cba-8414-4841-bfe2-792aeb8cf302', 'X-Runtime': '0.008350', 'Content-Encoding': 'gzip', 'X-Via': '1.1 gjf22:8 (Cdn Cache Server V2.0), 1.1 PSzqstdx2ps251:10 (Cdn Cache Server V2.0)', 'Connection': 'keep-alive'}
<class 'requests.cookies.RequestsCookieJar'> <RequestsCookieJar[<Cookie locale=zh-CN for www.jianshu.com/>]>
<class 'str'> https://www.jianshu.com/
<class 'list'> [<Response [301]>]

状态码判断:常见的网页状态码:

100: ('continue',),
101: ('switching_protocols',),
102: ('processing',),
103: ('checkpoint',),
122: ('uri_too_long', 'request_uri_too_long'),
200: ('ok', 'okay', 'all_ok', 'all_okay', 'all_good', '\\o/', '✓'),
201: ('created',),
202: ('accepted',),
203: ('non_authoritative_info', 'non_authoritative_information'),
204: ('no_content',),
205: ('reset_content', 'reset'),
206: ('partial_content', 'partial'),
207: ('multi_status', 'multiple_status', 'multi_stati', 'multiple_stati'),
208: ('already_reported',),
226: ('im_used',),

# Redirection.
300: ('multiple_choices',),
301: ('moved_permanently', 'moved', '\\o-'),
302: ('found',),
303: ('see_other', 'other'),
304: ('not_modified',),
305: ('use_proxy',),
306: ('switch_proxy',),
307: ('temporary_redirect', 'temporary_moved', 'temporary'),
308: ('permanent_redirect',
 'resume_incomplete', 'resume',), # These 2 to be removed in 3.0

# Client Error.
400: ('bad_request', 'bad'),
401: ('unauthorized',),
402: ('payment_required', 'payment'),
403: ('forbidden',),
404: ('not_found', '-o-'),
405: ('method_not_allowed', 'not_allowed'),
406: ('not_acceptable',),
407: ('proxy_authentication_required', 'proxy_auth', 'proxy_authentication'),
408: ('request_timeout', 'timeout'),
409: ('conflict',),
410: ('gone',),
411: ('length_required',),
412: ('precondition_failed', 'precondition'),
413: ('request_entity_too_large',),
414: ('request_uri_too_large',),
415: ('unsupported_media_type', 'unsupported_media', 'media_type'),
416: ('requested_range_not_satisfiable', 'requested_range', 'range_not_satisfiable'),
417: ('expectation_failed',),
418: ('im_a_teapot', 'teapot', 'i_am_a_teapot'),
421: ('misdirected_request',),
422: ('unprocessable_entity', 'unprocessable'),
423: ('locked',),
424: ('failed_dependency', 'dependency'),
425: ('unordered_collection', 'unordered'),
426: ('upgrade_required', 'upgrade'),
428: ('precondition_required', 'precondition'),
429: ('too_many_requests', 'too_many'),
431: ('header_fields_too_large', 'fields_too_large'),
444: ('no_response', 'none'),
449: ('retry_with', 'retry'),
450: ('blocked_by_windows_parental_controls', 'parental_controls'),
451: ('unavailable_for_legal_reasons', 'legal_reasons'),
499: ('client_closed_request',),

# Server Error.
500: ('internal_server_error', 'server_error', '/o\\', '✗'),
501: ('not_implemented',),
502: ('bad_gateway',),
503: ('service_unavailable', 'unavailable'),
504: ('gateway_timeout',),
505: ('http_version_not_supported', 'http_version'),
506: ('variant_also_negotiates',),
507: ('insufficient_storage',),
509: ('bandwidth_limit_exceeded', 'bandwidth'),
510: ('not_extended',),
511: ('network_authentication_required', 'network_auth', 'network_authentication'),

四、高级操作

(1)、文件上传

使用 Requests 模块,上传文件也是如此简单的,文件的类型会自动进行处理:

实例:

import requests

files = {'file': open('cookie.txt', 'rb')}
response = requests.post("http://httpbin.org/post", files=files)
print(response.text)

这是通过测试网站做的一个测试,返回值如下:

{
 "args": {}, 
 "data": "", 
 "files": {
  "file": "#LWP-Cookies-2.0\r\nSet-Cookie3: BAIDUID=\"D2B4E137DE67E271D87F03A8A15DC459:FG=1\"; path=\"/\"; domain=\".baidu.com\"; path_spec; domain_dot; expires=\"2086-02-13 11:15:12Z\"; version=0\r\nSet-Cookie3: BIDUPSID=D2B4E137DE67E271D87F03A8A15DC459; path=\"/\"; domain=\".baidu.com\"; path_spec; domain_dot; expires=\"2086-02-13 11:15:12Z\"; version=0\r\nSet-Cookie3: H_PS_PSSID=25641_1465_21087_17001_22159; path=\"/\"; domain=\".baidu.com\"; path_spec; domain_dot; discard; version=0\r\nSet-Cookie3: PSTM=1516953672; path=\"/\"; domain=\".baidu.com\"; path_spec; domain_dot; expires=\"2086-02-13 11:15:12Z\"; version=0\r\nSet-Cookie3: BDSVRTM=0; path=\"/\"; domain=\"www.baidu.com\"; path_spec; discard; version=0\r\nSet-Cookie3: BD_HOME=0; path=\"/\"; domain=\"www.baidu.com\"; path_spec; discard; version=0\r\n"
 }, 
 "form": {}, 
 "headers": {
  "Accept": "*/*", 
  "Accept-Encoding": "gzip, deflate", 
  "Connection": "close", 
  "Content-Length": "909", 
  "Content-Type": "multipart/form-data; boundary=84835f570cfa44da8f4a062b097cad49", 
  "Host": "httpbin.org", 
  "User-Agent": "python-requests/2.18.4"
 }, 
 "json": null, 
 "origin": "183.64.61.29", 
 "url": "http://httpbin.org/post"
}

(2)、获取cookie

当需要cookie时,直接调用response.cookie:(response为请求后的返回值)

import requests

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

输出结果:

<RequestsCookieJar[<Cookie BDORZ=27315 for .baidu.com/>]>
BDORZ=27315

(3)、会话维持、模拟登陆

如果某个响应中包含一些Cookie,你可以快速访问它们:

import requests
 
r = requests.get('http://www.google.com.hk/')
print(r.cookies['NID'])
print(tuple(r.cookies))

要想发送你的cookies到服务器,可以使用 cookies 参数:

import requests
 
url = 'http://httpbin.org/cookies'
cookies = {'testCookies_1': 'Hello_Python3', 'testCookies_2': 'Hello_Requests'}
# 在Cookie Version 0中规定空格、方括号、圆括号、等于号、逗号、双引号、斜杠、问号、@,冒号,分号等特殊符号都不能作为Cookie的内容。
r = requests.get(url, cookies=cookies)
print(r.json())

(4)、证书验证

因为12306有一个错误证书,我们那它的网站做测试会出现下面的情况,证书不是官方证书,浏览器会识别出一个错误

import requests

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

返回值:

 python中数据爬虫requests库使用方法详解

 python中数据爬虫requests库使用方法详解

怎么正常进入这样的网站了,代码如下:

import requests
from requests.packages import urllib3
urllib3.disable_warnings()
response = requests.get('https://www.12306.cn', verify=False)
print(response.status_code)

将verify设置位False即可,返回的状态码为200

urllib3.disable_warnings()这条命令主要用于消除警告信息

(5)、代理设置

在进行爬虫爬取时,有时候爬虫会被服务器给屏蔽掉,这时采用的方法主要有降低访问时间,通过代理ip访问,如下:

import requests

proxies = {
 "http": "http://127.0.0.1:9743",
 "https": "https://127.0.0.1:9743",
}

response = requests.get("https://www.taobao.com", proxies=proxies)
print(response.status_code)

ip可以从网上抓取,或者某宝购买

如果代理需要设置账户名和密码,只需要将字典更改为如下:

proxies = {
"http":"http://user:password@127.0.0.1:9999"
}

如果你的代理是通过sokces这种方式则需要pip install "requests[socks]"

proxies= {
"http":"socks5://127.0.0.1:9999",
"https":"sockes5://127.0.0.1:8888"
}

(6)、超时设置

访问有些网站时可能会超时,这时设置好timeout就可以解决这个问题

import requests
from requests.exceptions import ReadTimeout
try:
 response = requests.get("http://httpbin.org/get", timeout = 0.5)
 print(response.status_code)
except ReadTimeout:
 print('Timeout')

正常访问,状态吗返回200

(7)、认证设置

如果碰到需要认证的网站可以通过requests.auth模块实现

import requests

from requests.auth import HTTPBasicAuth

response = requests.get("http://120.27.34.24:9001/",auth=HTTPBasicAuth("user","123"))
print(response.status_code)

当然这里还有一种方式

import requests

response = requests.get("http://120.27.34.24:9001/",auth=("user","123"))
print(response.status_code)

(8)、异常处理

遇到网络问题(如:DNS查询失败、拒绝连接等)时,Requests会抛出一个ConnectionError 异常。

遇到罕见的无效HTTP响应时,Requests则会抛出一个 HTTPError 异常。

若请求超时,则抛出一个 Timeout 异常。

若请求超过了设定的最大重定向次数,则会抛出一个 TooManyRedirects 异常。

所有Requests显式抛出的异常都继承自 requests.exceptions.RequestException 。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
跟老齐学Python之有容乃大的list(2)
Sep 15 Python
python修改注册表终止360进程实例
Oct 13 Python
Python模块包中__init__.py文件功能分析
Jun 14 Python
利用Python批量生成任意尺寸的图片
Aug 29 Python
python实现维吉尼亚加密法
Mar 20 Python
python实现文件的分割与合并
Aug 29 Python
Python 单例设计模式用法实例分析
Sep 23 Python
python实现视频读取和转化图片
Dec 10 Python
python numpy实现多次循环读取文件 等间隔过滤数据示例
Mar 14 Python
Python面向对象实现方法总结
Aug 12 Python
Python GUI之tkinter窗口视窗教程大集合(推荐)
Oct 20 Python
Python实现拼音转换
Jun 07 Python
python 接口测试response返回数据对比的方法
Feb 11 #Python
使用Python读取大文件的方法
Feb 11 #Python
python脚本作为Windows服务启动代码详解
Feb 11 #Python
分析Python读取文件时的路径问题
Feb 11 #Python
Django中针对基于类的视图添加csrf_exempt实例代码
Feb 11 #Python
python jieba分词并统计词频后输出结果到Excel和txt文档方法
Feb 11 #Python
代码讲解Python对Windows服务进行监控
Feb 11 #Python
You might like
PHP和XSS跨站攻击的防范
2007/04/17 PHP
php递归使用示例(php递归函数)
2014/02/14 PHP
使用js检测浏览器的实现代码
2013/05/14 Javascript
简介JavaScript中setUTCSeconds()方法的使用
2015/06/12 Javascript
node.js学习之base64编码解码
2016/10/21 Javascript
JS鼠标3次点击事件实现代码及扩展思路
2017/09/12 Javascript
Vuex实现计数器以及列表展示效果
2018/03/10 Javascript
JS实现可针对算术表达式求值的计算器功能示例
2018/09/04 Javascript
vue利用v-for嵌套输出多层对象,分别输出到个表的方法
2018/09/07 Javascript
Javascript三种字符串连接方式及性能比较
2019/05/28 Javascript
Vue 使用计时器实现跑马灯效果的实例代码
2019/07/11 Javascript
python3下实现搜狗AI API的代码示例
2018/04/10 Python
Python学习小技巧总结
2018/06/10 Python
python爬虫获取小区经纬度以及结构化地址
2018/12/30 Python
flask框架配置mysql数据库操作详解
2019/11/29 Python
python使用协程实现并发操作的方法详解
2019/12/27 Python
Tensorflow中的dropout的使用方法
2020/03/13 Python
Django bulk_create()、update()与数据库事务的效率对比分析
2020/05/15 Python
python3.8.1+selenium实现登录滑块验证功能
2020/05/22 Python
Python Pivot table透视表使用方法解析
2020/09/11 Python
python爬虫爬取网页数据并解析数据
2020/09/18 Python
python3实现飞机大战
2020/11/29 Python
世界上最悠久的自行车制造商:Ribble Cycles
2017/03/18 全球购物
法国一家多品牌成衣精品中/高档商店:Graduate Store
2019/08/28 全球购物
Steiff台湾官网:德国金耳釦泰迪熊
2019/12/26 全球购物
信用社实习人员自我鉴定
2013/09/20 职场文书
商务英语专业应届毕业生求职信
2013/10/28 职场文书
自我鉴定范文
2013/11/10 职场文书
小车司机岗位职责
2013/11/25 职场文书
西式结婚主持词
2014/03/14 职场文书
运动会入场口号
2014/06/07 职场文书
企业法人代表证明书
2014/09/27 职场文书
文明和谐家庭事迹材料(2016精选版)
2016/02/29 职场文书
再读《皇帝的新衣》的读后感悟!
2019/08/07 职场文书
68句权威创业名言
2019/08/26 职场文书
python中sqllite插入numpy数组到数据库的实现方法
2021/06/21 Python