Python爬虫从入门到进阶(3)之requests的使用

快速上手(官网地址:http://www.python-requests.org/en/master/user/quickstart/)

发送请求

首先导入Requests模块

import requests

试着获取一个网页

r = requests.get(‘https://api.github.com/events‘)

返回的 r 是 Response 对象,可以从这个对象中获得所有信息。

Requests 简单的 API 意味着所有 HTTP 请求类型都是显而易见的。例如,可以这样发送一个 HTTP POST 请求:

 r = requests.post(‘https://httpbin.org/post‘, data={‘key‘: ‘value‘})

传递 URL 参数

关于 URL 的查询字符串(query string)传递某种数据,如果手动构建 URL,数据以key/value的形式出现在 URL的?后面,例如:httpbin.org/get?key=value

Requests允许参数使用这个params 关键字参数,以字符串字典的形式提供参数。如果你想传递 key1=value1 和 key2=value2 到 httpbin.org/get ,那么你可以使用如下代码:

def url_params():
    payload = {‘key1‘: ‘value1‘, ‘key2‘: ‘value2‘}
    r = requests.get("http://httpbin.org/get", params=payload)
    print(r.url)
    # http://httpbin.org/get?key1=value1&key2=value2

也可以将列表传入

# 2.传递 URL 参数,可以将一个列表作为值传入
def url_params_2():
    payload = {‘key1‘: ‘value1‘, ‘key2‘: [‘value2‘, ‘value3‘]}
    r = requests.get("http://httpbin.org/get", params=payload)
    print(r.url)
    # http://httpbin.org/get?key1=value1&key2=value2&key2=value3

响应内容

Requests 会自动解码来自服务器的内容。大多数 unicode 字符集都能被无缝地解码。

# 3.响应内容
def response_text():
    r = requests.get(‘https://httpbin.org/get‘)
    print(r.text)

二进制响应内容

Requests 会自动为你解码 gzip 和 deflate 传输编码的响应数据。

# 4.二进制响应内容
def response_content():
    r = requests.get(‘https://httpbin.org/get‘)
    print(r.content)

json 响应内容

# 5.json响应内容
def response_json():
    r = requests.get(‘https://httpbin.org/get‘)
    print(r.json())

如果 JSON 解码失败, r.json() 就会抛出一个异常。例如,响应内容是 204 (No Content),或者响应包含无效的 json,尝试访问 r.json() 将会抛出 ValueError: No JSON object could be decoded 异常。

值得注意的是调用r.json()成功并不意味着请求响应成功。有些服务器响应失败会返回 JSON 对象的失败信息。可以通过判断r.raise_for_status() 或者 r.status_code  验证请求是不是成功

定制请求头

如果你想为请求添加 HTTP 头部,只要简单地传递一个 dict 给 headers 参数就可以了。

# 6.定制请求头
def add_header():
    url = ‘https://httpbin.org/get‘
    headers = {
        ‘User-Agent‘:‘Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 2.0.50727; SLCC2; .NET ‘
    }

    r = requests.get(url=url,headers=headers)
    print(r.text)

更加复杂的 post 请求

通常,要想发送表单形式的数据,只需简单地传递一个字典给 data 参数,在发出请求时会自动编码为表单形式:

# 7.复杂的 post 请求
def complicated_post():
    payload = {‘key1‘: ‘value1‘, ‘key2‘: ‘value2‘}
    r = requests.post("https://httpbin.org/post", data=payload)
    print(r.text)

data 参数每个键可以有多个值,可以将元组列表或列表作为值的字典来实现,通常用于将表单中多个元素使用相同的键时使用

def complicated_post_2():
    payload_tuples = [(‘key1‘, ‘value1‘), (‘key1‘, ‘value2‘)]
    r1 = requests.post(‘https://httpbin.org/post‘, data=payload_tuples)
    print(r1.text)
    payload_dict = {‘key1‘: [‘value1‘, ‘value2‘]}
    r2 = requests.post(‘https://httpbin.org/post‘, data=payload_dict)
    print(r1.text == r2.text) # False,官网是 True ???

用时候不需要用表单编码传递数据,可以使用字符串传递数据,例如

def complicated_post_3():
    url = ‘https://api.github.com/some/endpoint‘
    payload = {‘some‘: ‘data‘}
    r = requests.post(url, data=json.dumps(payload))
    print(r.text)

也可以直接传递 json 参数,例如:

def complicated_post_4():
    url = ‘https://api.github.com/some/endpoint‘
    payload = {‘some‘: ‘data‘}
    r = requests.post(url, json=payload)
    print(r.text)

注意:如果已经传递了 data 或者 files 参数,json 参数会被忽略掉

在请求中使用 json 参数会改变header 头Content-Type的值为application/json

POST一个多部分编码(Multipart-Encoded)的文件

Requests使上传Multipart-Encoded文件变得很简单

#  8.post 上传 multipart-Encoded 文件
def post_mulutipart_file():
    url = ‘https://httpbin.org/post‘
    files = {‘file‘: open(‘report.xls‘, ‘rb‘)}
    r = requests.post(url, files=files, timeout=10)
    print(r.text)

可以直接设置文件名称,content_type,和 header

def post_mulutipart_file_2():
    url = ‘https://httpbin.org/post‘
    files = {‘file‘: (‘report.xls‘, open(‘report.xls‘, ‘rb‘), ‘application/vnd.ms-excel‘, {‘Expires‘: ‘0‘})}
    r = requests.post(url, files=files, timeout=10)
    print(r.text)

如果想传递字符串让服务器以文件的方式接收,可以如下设置:

def post_mulutipart_file_3():
    url = ‘https://httpbin.org/post‘
    files = {‘file‘: (‘report.csv‘, ‘some,data,to,send\nanother,row,to,send\n‘)}
    r = requests.post(url, files=files, timeout=10)
    print(r.text)

注意:requests 不支持传递超大文件

响应状态码

# 9.响应状态码
def response_status_code():
    r = requests.get(‘https://httpbin.org/get‘, timeout=10)
    print(r.status_code)
    print(r.status_code == requests.codes.ok)

    # print(raise_for_status)

# 请求错误状态码
def error_response_status_code():
    bad_r = requests.get(‘https://httpbin.org/status/404‘)
    print(bad_r.status_code)
    print(bad_r.raise_for_status())

响应头

# 10.响应头
def response_header():
    r = requests.get(‘https://httpbin.org/get‘, timeout=10)
    print(r.headers)
    print(r.headers[‘Content-Type‘])
    print(r.headers.get(‘content-type‘))

Cookies

# 11.cookie
def cookies():
    # 读取响应内容的 cookie
    # url = ‘http://example.com/some/cookie/setting/url‘
    # r = requests.get(url)
    # print(r.cookies[‘example_cookie_name‘])

    # 发送 cookie 到服务器
    url = ‘https://httpbin.org/cookies‘
    cookies = dict(cookies_are=‘working‘)
    r = requests.get(url, cookies=cookies, timeout=10)
    print(r.text)

Cookie 在RequestsCookieJar中返回,起作用相当于一个字典,但是也提供更完整的接口,适合在多个域或路径上使用,Cookie jars也能在请求时传递

def cookiejar():
    jar = requests.cookies.RequestsCookieJar()
    jar.set(‘tasty_cookie‘, ‘yum‘, domain=‘httpbin.org‘, path=‘/cookies‘)
    jar.set(‘gross_cookie‘, ‘blech‘, domain=‘httpbin.org‘, path=‘/elsewhere‘)
    url = ‘https://httpbin.org/cookies‘
    r = requests.get(url, cookies=jar)
    print(r.text)

重定向和历史

默认情况下,请求将对除HEAD之外的所有谓词执行位置重定向。

可以使用响应对象的history属性来跟踪重定向。

Response.history列表包含为完成请求而创建的 Response 对象,该列表从最早的响应到最近的响应

# 12.重定向和历史记录
def redirection_history():
    r = requests.get(‘http://github.com/‘)
    print(r.url)
    print(r.status_code)
    print(r.history)

如果使用 GET, OPTIONS, POST, PUT, PATCH 或者 DELETE,可以使用allow_reredirect参数禁用重定向处理

使用 HEAD 启用重定向

def redirection_history_2():
    # 禁用重定向
    r = requests.get(‘http://github.com/‘, allow_redirects=False)
    print(r.status_code)
    print(r.history)

    # 使用 HEAD 启用重定向
    r = requests.head(‘http://github.com/‘, allow_redirects=True)
    print(r.status_code)
    print(r.history)

超时

可以使用 timeout 参数告诉请求等待几秒停止响应,几乎所有的生产代码的所有请求中都使用这个参数,不然可能导致程序无限期挂起

注意:超时不是整个响应下载的时间限制;相反,如果服务器没有在超时时间限制内发出响应,则会引发异常。如果没设置超时则请求不会超时

错误和异常

如果出现网络问题(例如DNS失败、拒绝连接等),请求将引发ConnectionError异常。

如果HTTP请求返回不成功的状态代码,则Response.raise_for_status()将引发HTTPError。

如果请求超时,将引发超时异常。

 代码下载

原文地址:https://www.cnblogs.com/zimengfang/p/10141004.html

时间: 2024-11-07 10:17:41

Python爬虫从入门到进阶(3)之requests的使用的相关文章

Python爬虫从入门到进阶(2)之爬虫简介

1.爬虫入门:使用代码模拟真实用户发送网络请求批量获取数据1).爬虫价值: 1.买卖数据(高端领域特别贵) 2.数据分析(出分析报告) 3.流量 4.阿里指数,百度指数2).合法性:灰色产业政府没有法律规定爬虫是否违法 公司概念:公司让你爬取数据 爬虫是否可以爬所有的东西?不可以,爬虫只能爬取到用户可以访问的数据 爱奇艺视频(vip 用户,非 vip 用户) 付费小说(付费才能爬取) 2.爬虫分类: 1.通用爬虫:使用搜索引擎:百度,360,谷歌... 劣势:目标不明确,返回的内容90%是用户不

Python爬虫从入门到进阶(1)之Python概述

1.计算机语言概述 (1).语言:交流的工具,沟通的媒介 (2).计算机语言:人跟计算机交流的工具 (3).Python是计算机语言的一种 2.Python编程语言 代码:人类的语言,同代码命令机器,跟机器交(2).python解释器:担任翻译工作(3)流程: 写代码 --> 执行:由翻译官(Python解释器)把命令(Code)翻译给机器,同时把机器结果翻译给我们 3.Python简史 (1).1989 (2).2008:Python 3.0 诞生 (3)2014:宣布2.7支持到2020年

Python 爬虫从入门到进阶之路(五)

在之前的文章中我们带入了 opener 方法,接下来我们看一下 opener 应用中的 ProxyHandler 处理器(代理设置). 使用代理IP,这是爬虫/反爬虫的第二大招,通常也是最好用的. 很多网站会检测某一段时间某个IP的访问次数(通过流量统计,系统日志等),如果访问次数多的不像正常人,它会禁止这个IP的访问. 所以我们可以设置一些代理服务器,每隔一段时间换一个代理,就算IP被禁止,依然可以换个IP继续爬取. urllib.request 中通过ProxyHandler来设置使用代理服

Python 爬虫从入门到进阶之路(十一)

之前的文章我们介绍了一下 Xpath 模块,接下来我们就利用 Xpath 模块爬取<糗事百科>的糗事. 之前我们已经利用 re 模块爬取过一次糗百,我们只需要在其基础上做一些修改就可以了,为了保证项目的完整性,我们重新再来一遍. 我们要爬取的网站链接是 https://www.qiushibaike.com/text/page/1/ . 我们通过 Xpath Helper 的谷歌插件经过分析获取到我们想要的内容为: //div[@class="content"]/span[

Python 爬虫从入门到进阶之路(十四)

之前的文章我们已经可以根据 re 模块,Xpath 模块和 BeautifulSoup4 模块来爬取网站上我们想要的数据并且存储在本地,但是我们并没有对存储数据的格式有要求,本章我们就来看数据的存储格式 JSON 及 Python 中的 json 模块. JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,它使得人们很容易的进行阅读和编写.同时也方便了机器进行解析和生成.适用于进行数据交互的场景,比如网站前台与后台之间的数据交互. JSON和XML的比较

Python爬虫从入门到进阶(4)之xpath的使用

官网地址:https://lxml.de/xpathxslt.html 导入: from lxml import etree lxml.tree 支持 ElementTree 和 Element 上的 find,findall,findtext方法的简单路径语法,作为特定的 lxml 扩展,这些类提供了 xpath()方法,该方法支持完整xpath语法中的表达式,以及定制的扩展函数. xpath()方法 对于ElementTree,xpath 方法对文档(绝对路径)或者根节点执行全局(相对路径)

python爬虫-基础入门-爬取整个网站《3》

python爬虫-基础入门-爬取整个网站<3> 描述: 前两章粗略的讲述了python2.python3爬取整个网站,这章节简单的记录一下python2.python3的区别 python2.x 使用类库: >> urllib 库 >> urllib2 库 python3.x 使用的类库: >> urllib 库 变化: -> 在python2.x中使用import urllib2 ----- 对应的,在python3.x 中会使用import url

python爬虫小小白入门

python爬虫小小白入门 学习目标: 爬虫基本思想 python爬虫常用包,官方文档,用途,安装方法,常用方法. 简单爬虫实例--从W3Cschool爬取C语言教程文本 python环境:: Anaconda3, spyder, windows10 一.基本思想 爬虫就是从网页上抓取你想要的内容,主要分为三个步骤.首先需要仔细分析目标页面内容,知道你想要的内容:文字,图片,视频在HTML中的哪个标签里,然后通过爬虫代码向服务器发起请求,得到HTML页面内容,最后把目标内容解析出来. 分析目标页

python爬虫从入门到精通-系列教程

开始爬虫之旅 引言 我经常会看到有人在知乎上提问如何入门 Python 爬虫?.Python 爬虫进阶?.利用爬虫技术能做到哪些很酷很有趣很有用的事情?等这一些问题,我写这一系列的文章的目的就是把我的经验告诉大家. 什么是爬虫? 引用自维基百科 网络蜘蛛(Web spider)也叫网络爬虫(Web crawler),蚂蚁(ant),自动检索工具(automatic indexer),或者(在FOAF软件概念中)网络疾走(WEB scutter),是一种“自动化浏览网络”的程序,或者说是一种网络机