前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Python】【爬虫】Requests库详解

【Python】【爬虫】Requests库详解

作者头像
阿黎逸阳
发布2020-09-08 16:28:48
1.2K0
发布2020-09-08 16:28:48
举报

Requests是用Python语言编写的第三方库,使用前需要另外安装。它基于urllib,采用Apache2 Licensed开源协议的HTTP库。它比urllib更加方便,完全满足HTTP测试需求,可以节约我们很多的工作。

举三个Requests的实际应用:

  • 如果你是店家,想对比自己店铺和同行店铺的差异,你可以用Requests库爬取同行店铺的评价,找到自己店铺的改进方向。
  • 如果你是学生,想快速获取自己研究方向的资料,你可以用Requests库爬取所学领域的相关资料,进行数据提取分析。
  • 如果你最近刚好想换电脑,不太确定想买哪一款,你可以用Requests库爬取相关网站的评论,给自己的决定做个参考。

一、Requests库的主要方法

Requests库中有7个主要方法

图1 Requests库中的7个主要方法

其中最常用的是get和post方法,get请求将提交的数据放置在HTTP请求协议头中,post提交的数据则放在实体数据中。下面详细阐述Requests库中六个方法:

代码语言:javascript
复制
 import requests                            #导入requests模块

requests.get("http://www.baidu.com")       #GET请求
requests.post('http://httpbin.org/post')   #POST请求
requests.put('http://httpbin.org/put')     #PUT请求 
requests.delete('http://httpbin.org/delete') #DELETE请求
requests.head('http://httpbin.org/head')     #HEAD请求 
request.patch('http://httpbin.org/patch')    #PATCH请求

代码解析:

requests.get:请求指定的页面信息,并返回实体主体。

requests.post:请求服务器接受所指定的文档作为对所标识的URI的新的从属实体。

requests.put:从客户端向服务器传送数据,并取代指定的文档的内容。 requests.delete:请求服务器删除指定的页面。

requests.head:只请求页面的首部。

request.patch:请求局部修改。

二、Requests的重要对象

Requests库中有2个重要对象

图2 Requests库中的2个重要对象

其中Response对象包含服务器返回的所有信息,例如状态码、首部等。

由于爬取网页信息一般采用的是get方法,故下文中着重讲解get方法,post方法会在后续文章中进行阐述。

三、Requests.get使用方法

1 Requests.get基本语法

代码语言:javascript
复制
requests.get(url, params=None, **kwargs)

代码解析:

url:待爬取网页的url链接,是通过http协议存取资源的一个路径,类似我们电脑中文件的存储路径;

params:url中的额外参数,字典或字节流格式,非必有项,默认值为None;

**kwargs:12个控制访问的参数。

注:当我们使用requests.get()时,返回的是response对象,该对象包含服务器返回的所有信息,也包含请求的request的信息。

2 requests.get使用实例

实例一:不带参数的GET请求

代码语言:javascript
复制
import requests   #导入requests库

r = requests.get('https://www.sohu.com/a/378969781_100078132')  #获取搜狐新闻中

代码解析:

requests.get:构造一个向服务器请求资源的url对象,实例一选取的链接是搜狐新闻中一篇关于刘诗雯的报道,你可以根据自己的需要另换网址。

这时候返回的是一个包含服务器资源的Response对象,r中包含从服务器返回的所有相关资源。

实例二:带参数的GET请求

代码语言:javascript
复制
import requests

data = {
    'name': 'tom',
    'age': 20
}
r = requests.get('http://httpbin.org/get', params=data)

:相比实例一,本例只是增加了data参数。

实例三:带头部的GET请求

代码语言:javascript
复制
import requests,json

url = "https://club.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98&productId=100004380824&score=0&sortType=5&page=0&pageSize=10&isShadowSku=0&fold=1"
headers = {'User-Agent':'User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36',
        'Request Method':'Get',
         'callback':'fetchJSON_comment98'
        }
r = requests.get(url,timeout=30,headers=headers)

:有些网站访问时必须带有浏览器等信息,如果不传入headers就会报错,所以本例中加入了头部的一些信息。

3 Response对象的常用属性

Response对象中有6个常用属性

图3 Response中6个常用属性

用实例一的结果r,运行下面关于属性的代码,并查看返回的结果。

1.响应状态码status_code

代码语言:javascript
复制
r.status_code  #响应状态码,200表示连接成功,404表示失败

结果:

代码语言:javascript
复制
200

2.响应头headers

代码语言:javascript
复制
r.headers  #以字典对象存储服务器响应头,但是这个字典比较特殊,字典键不区分大小写,若键不存在则返回None

结果:

代码语言:javascript
复制
{'Content-Type': 'text/html;charset=UTF-8', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'Server': 'nginx', 'Date': 'Fri, 27 Mar 2020 12:21:58 GMT', 'Access-Control-Allow-Credentials': 'true', 'Vary': 'Origin,Access-Control-Request-Method,Access-Control-Request-Headers', 'Access-Control-Allow-Headers': 'Origin,Content-Type,authorization,Accept,token,X-Requested-With', 'Content-Encoding': 'gzip', 'X-Application-Context': 'pc-article:prod-yz:10030', 'Access-Control-Allow-Methods': 'POST,GET,OPTIONS,DELETE', 'Content-Language': 'en-US', 'Access-Control-Expose-Headers': 'Origin,Access-Control-Request-Method,Access-Control-Request-Headers,X-forwared-port,X-forwarded-host', 'Cache-Control': 'max-age=60', 'X-From-Sohu': 'X-SRC-Source', 'FSS-Cache': 'MISS from 8868025.16076995.9867815', 'FSS-Proxy': 'Powered by 2969695.4280425.3969395'}

3.响应内容text

代码语言:javascript
复制
r.text  #字符串方式的响应体,会自动根据响应头部的字符编码进行解码,返回url对应的页面内容 

结果:

代码语言:javascript
复制
'<!DOCTYPE html>\n<html data-log-pv=\'{"mpc":17}\'>\n    <head>\n        <title>大爱无疆!刘诗雯的善举让人为之动容 球迷:娶妻,当娶刘诗雯_国乒</title>\n        <meta http-equiv="Cache-Control" content="no-transform" /> \n<meta http-equiv="Cache-Control" content="no-siteapp" /> \n<meta name="copyright" content="Copyright © 2017 Sohu.com Inc. All Rights Reserved." />\n<meta name="mediaid" content="体育哲学"/>\n<meta property="og:type" content="news"/>\n<meta property="og:image" content="${mpNews.image}"/>\n<meta property="og:url" content="www.sohu.com/a/378969781_100078132"/>\n<meta property="og:release_date" content="2020-03-10 14:18"/></body>\n</html>'

:由于text中内容太多,本文只是截取了部分信息。

4.响应内容content

代码语言:javascript
复制
r.content  #字节方式的响应体,会自动为你解码 gzip 和 deflate 压缩,是http响应内容的二进制形式

结果:

代码语言:javascript
复制
b'<!DOCTYPE html>\n<html data-log-pv=\'{"mpc":17}\'>\n    <head>\n        <title>\xe5\xa4\xa7\xe7\x88\xb1\xe6\x97\xa0\xe7\x96\x86\xef\xbc\x81\xe5\x88\x98\xe8\xaf\x97\xe9\x9b\xaf\xe7\x9a\x84\xe5\x96\x84\xe4\xb8\xbe\xe8\xae\xa9\xe4\xba\xba\xe4\xb8\xba\xe4\xb9\x8b\xe5\x8a\xa8\xe5\xae\xb9 \xe7\x90\x83\xe8\xbf\xb7\xef\xbc\x9a\xe5\xa8\xb6\xe5\xa6\xbb\xef\xbc\x8c\xe5\xbd\x93\xe5\xa8\xb6\xe5\x88\x98\xe8\xaf\x97\xe9\x9b\xaf_\xe5\x9b\xbd\xe4\xb9\x92</title>\n        <meta http-equiv="Cache-Control" content="no-transform" /> \n<meta http-equiv="Cache-Control" content="no-siteapp" /> \n<meta name="copyright" content="Copyright \xc2\xa9 2017 Sohu.com Inc. All Rights Reserved." />\n<meta name="mediaid" content="\xe4\xbd\x93\xe8\x82\xb2\xe5\x93\xb2\xe5\xad\xa6"/>\n<meta property="og:type" content="news"/>\n<meta property="og:image" content="${mpNews.image}"/>\n<meta property="og:url" content="www.sohu.com/a/378969781_100078132"/>   </body>\n</html>'

注:由于content中内容太多,本文只是截取了部分信息。

5.响应内容编码方式encoding

代码语言:javascript
复制
r.encoding  #从http的header中猜测的响应内容编码方式

结果:

代码语言:javascript
复制
'UTF-8'

6.响应内容编码方式encoding

代码语言:javascript
复制
r.apparent_encoding  #从内容中分析出响应的内容编码方式

结果:

代码语言:javascript
复制
'UTF-8'

注:响应内容text和content两者区别:

  • 1.content中间存的是字节码,而text中存的是字符串(由Beautifulsoup根据猜测的编码方式将content内容编码而成)。
  • 2.直接输出content,会发现前面存在b'这样的标志,这是字节字符串的标志,而text输出没有前面的b。
  • 3.对于纯ascii码,两者输出一致,对于其他的文字,需要正确编码才能正常显示。
  • 4.建议使用.text,因为输出显示的是汉字。如果显示乱码,可以用.content.decode('utf-8')手动选择文字编码方式中文常用utf-8、GBK、GB2312等。

简而言之,.text是现成的字符串,.content还要编码,但是.text不是所有时候都能正常显示,这时就需要用.content进行手动编码。

本文是本人对Request库的个人总结,如有问题,请指正。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-03-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 阿黎逸阳的代码 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档