【python爬虫基础入门】python爬虫requests库使用操作全解

文章目录

  • 一.HTTP协议
    • 1. HTTP协议的框架
    • 2. HTTP协议对资源的操作
    • 3. 用户对HTTP协议的操作
  • 二.requests库的安装
  • 三.requests库的7个主要使用方法
    • 1.方法的解析
    • 2.方法的使用
      • a. get方法使用
      • b. head方法的使用
      • c. post方法的使用
    • 3. requests库的异常处理
  • 四.爬取网页的通用代码框架
  • 五.requests库爬虫实例
    • 1. 对京东商品页面的爬取
    • 2. 百度/360搜索关键字的提交
    • 3. 网络图片的爬取
  • 六.网络爬虫的正确使用方法
    • 1. 网络爬虫的规模分类
    • 2. 网络爬虫的风险
    • 3. Robots协议
  • 七.结语
  • 八.参考

写在前面
【python爬虫基础入门】系列是对python爬虫的一个入门练习实践,旨在用最浅显易懂的语言,总结最明了,最适合自己的方法,本人一直坚信,总结才会使人提高

一.HTTP协议

使用python爬虫是建立在HTTP协议之上的,何为HTTP协议呢?

1. HTTP协议的框架

用比较容易理解的话来说,HTTP协议是一种超文本传输协议,是一个基于“请求与响应”模式的、无状态的应用层协议

  • 请求和响应:简单来说就是用户对服务器发起请求,服务器对用户的请求作出响应:
  • 无状态:用户的第一次请求和第二次请求之间没有必然的联系,
  • 应用层协议:表示该协议工作在TCP协议之上

此外HTTP协议将使用URL作为定位网路资源的标识,其URL格式如http://host[:port][path]

  • host: 合法的Internet主机域名或者IP地址
  • port:端口号,如果不写,默认缺省端口为80
  • path:请求资源的内部路径

HTTP url实例

  • http://www.baidu.com
  • http://234.190.111.148/list //list目录下的相关资源

HTTP中的url通过HTTP协议存取资源的Internet路径,一个url对应的是一个数据资源。类似于在自己电脑上各个目录下的文件 ,只不过这里的资源是放在网上的服务器中

2. HTTP协议对资源的操作

HTTP协议对资源的操作如下,requests库的各种方法是依托于HTTP的各种资源操作。

方法 说明
GET 请求获取URL位置的资源
HEAD 请求获取URL位置资源的头部信息
POST 请求向URL位置的资源后面追加新的数据
PUT 请求向URL位置的资源储存一个新的资源,将覆盖原有的资源
PATCH 请求局部更新URL位置的资源,即改变该处资源的一部分(更新部分内容,更节省带宽)
DELETE 请求删除URL位置存储的资源

3. 用户对HTTP协议的操作

  • 用户想通过url获取资源
    • 使用GET或者HEAD方法
  • 用户想将自己的资源放在URL位置上
    • 使用POST或者PATCH或者PUT方法
  • 用户想删掉这个URL上的资源
    • 使用DELETE方法

综上来看,HTTP协议是网络传输协议的基本,也是python中requests库的爬取操作的基本,更好的理解HTTP协议可以更清楚的理解requests爬虫

二.requests库的安装

python中的requests库用于对特定的网页进行访问抓抓取操作,是python功能强大的一个库,常常应用于特定静态网页的数据抓取。使用pip工具在命令行中输入安装request库

pip install requests

三.requests库的7个主要使用方法

requests库中包含有七个主要的方法,其中requests.request()为主方法,其他的六种方法如get,head方法等等等均是对requests.request()的封装使用。在使用的过程中,可以更具特定的需要方便选择主方法或者封装的方法,七种方法如下

方法 说明
ruquests.request() 构造一个请求,支撑一下各种方法的基础方法
ruquests.get() 获取html网页的主要方法,对应于http的get(最常用)
ruquests.head() 获取html网页头信息的方法,对应于http的head(最常用)
ruquests.post() 向html网页提交post请求的方法,对应于http的post
ruquests.put() 向html网页提交put请求的方法,对应于http的put
ruquests.patch() 向html网页提交局部的修改请求,对应于http的patch
ruquests.delete() 想html网页提交删除请求,对应于http的delete

1.方法的解析

这里以主方法request方法为例子如下

ruquests.request(method,url,**kwargs)

这里包含有三个参数method,url,**kwargs

  • method:请求方式对应GET/HEAD/POST/PUT/PATCH/OPPTIONS七种方法,调用格式为’GET’
  • url:获取的链接
  • **kwargs:控制访问的参数,均为可选择项,共13个

其中,**kwargs包含params,data,json,headers,cookies,auth,files,timeout,proxies,allow_redirects,stream,verify,cert13个参数,参数使用说明如下

  • params:字典或者字节序列,作为参数增加到url中(常用与请求服务器特定资源)

  • kv = {'hey1':'value1', 'key2':'value2'}
    r = requests.request('GET','http://python123.io/ws', params=kv)
    print('r.url')
    
    >>>http://python123.io/ws?key1=value1&key2=value2 # ? 号后面才是要跟上的内容
    
  • data:字典、字节序列或者文件对象,作为Request的内容(常作为向服务器提交资源使用)

  • kv = {'hey1':'value1', 'key2':'value2'}
    r = requests.request('POST','http://python123.io/ws', data=kv)
    
    # 或者直接使用字段
    body='主题内容'
    r = requests.request('POST','http://python123.io/ws', data=body)
    
  • json:JSON格式的数据,作为Request的内容(常用于向服务器提交)

  • r = requests.request('POST','http://python123.io/ws', json=kv)
    
  • headers:字典,HTTP定制头(常用于模拟游览器)

  • hd = {'user-aget':'Chrome/10'}
    r = requests.request('POST','http://python123.io/ws', hheader=hd)
    
  • cookies:字典或者CookieJar,Requests中的cookie,在不同用户游览器的特定页面中有特定的值

  • 【python爬虫基础入门】python爬虫requests库使用操作全解_第1张图片

  • auth:元祖,支持HTTP认证功能

  • files:字典类型,传输文件(常用于向服务器传输文件使用)

  • fs = {'file' : open('data.xls','rb')}
    r = requests.request('POST','http://python123.io/ws', files=fs)
    
  • timeout:设定超时单位,秒为单位(常用于服务器请求)

  • r = requests.request('GET','http://python123.io/ws', timeout=10)
    
  • proxies:字典类型,设定访问代理服务器,可以增加登陆认证(常用于隐藏原ip地址)

  • pxs = {'http': 'http://user:pass@10/.10.10.1:1234'
    		'https': 'https://10.10.10.1:4321'}		
    r = requests.request('GET','http://python123.io/ws', proxies=pxs)
    
    

【python爬虫基础入门】python爬虫requests库使用操作全解_第2张图片

  • allow_redirects:重定向开关,默认为开启True,
  • stream:获取内容立即下载开关,默认为开启True
  • verify:认证SSL证书开关,默认为开启True
  • cert:本地SSL证书路径

request方法是最基本的方法,其他的类似于get方法等都是基于Request方法之上的一种封装形式

2.方法的使用

在网页请求中,常常使用get,head,post三种方法

a. get方法使用

import requests

r = requests.get(url)	# 获取网页网址 
print(r.status_code)			# 请求状态码

r.encoding = 'utf-8'	# 设置编码
r.text					# 将打印输出

这样的r作为Response返回的对象,包含从服务器返回的所有相关资源

  • requests.get方法的完整使用

  • requests.get(url,params=None,**kwargs)
    
    • url: 指定页面的链接
    • params: url中的额外参数,字典或者字节流格式,为可选择项
    • **kwargs:12个控制访问的参数

Response对象的属性表如下

属性 说明
r.status_code http请求的返回状态码,200表示连接成功,404或者其他字符表示连接失败
r.text 打印http响应内容的字符串形式,即为url对应的页面内容
r.encoding 从http的header中猜测的响应内容的编码方式
r.apparent_encoding 从内容中分析出的响应内容编码方式(备选编码方式)
r.content http响应内容的二进制形式

需要注意的是

  • r.encoding:使用的http协议中charset的默认编码格式,通常为ISO-8859-1
  • r.apparent_encoding:将会根据网页内容分析出可读的编码方式,通常为UTF-8

Response对象属性的基本流程

  • 首先使用r.status_code来检查返回的Response对象的返回状态码
    • 若返回200(可使用r.textr.encodingr.apparent_encodingr.content来解析返回的内容)
    • 若返回404或者其他编码。则访问失败

b. head方法的使用

用head方法来获取url中的头部信息,应用如下

r = requests.head(url,**kwargs)		# 获取头部信息
r.headers					# 输出头部信息

c. post方法的使用

post方法可以对请求向URL位置的资源后面追加新的数据,应用如下

r = requests.post(url,**kwargs) # 模版

# 如下
payload = {'key1':'valu1', 'key2':'value2'}		# 创建一个字典
# 向URL POST一个字典,自动编码为一个form表单
r = requests.post('http://httpbin.org/post',data = payload)			# 提交修改
print(r.text)								# 打印追加后的内容

【python爬虫基础入门】python爬虫requests库使用操作全解_第3张图片

如果不提交一个字典,只是传入一个数据,如data,这样将会自动传入一个数据量,如下

r = requests.post('http://httpbin.org/post',data = 'ABC')			# 提交修改
print(r.text)								# 打印追加后的内容

【python爬虫基础入门】python爬虫requests库使用操作全解_第4张图片

3. requests库的异常处理

常用的requests的异常处理如下

异常 说明
ruquests.ConnectionError 网络连接错误异常,如DNS查询失败、拒绝连接等
ruquests.HTTPError HTTP错误异常
ruquests.URLRequired URL缺失异常
ruquests.TooManyRedirects 超过最大重定向次数,产生重定向异常
ruquests.ConnectTimeout 连接远程服务器超时异常(仅仅为与远程服务器连接过长)
ruquests.Timeout 请求URL超时,产生超时异常(获得内容的整个过程)

requests库中对于异常处理的方法调用

异常方法 说明
r.raise_for_status() 此方法将检测返回状态码是否是200,如果不是200,则产生ruquests.HTTPError异常

四.爬取网页的通用代码框架

在爬取网页的时候需要我们搭建好一套流程,如同一套框架,清晰的框架可以使得在爬取数据的过程中,更容易检测错误。爬取原声静态网页框架可参照如下

import requests


def getHTMLText(url):
    try:
        r = requests.get(url,timeout = 30)
        r.raise_for_status()    # 检测返回状态码,反之则报错
        r.encoding = r.apparent_encoding
        return r.text           # 返回获取网页的内容
    except:
        return '产生异常'


# 主函数
if __name__ == "__main__":
    url = 'http://www.baidu.com'
    print(getHTMLText(url))

五.requests库爬虫实例

1. 对京东商品页面的爬取

将游览器网址url设置为https://itm.jd.com/2967929.html使用Request库获取商品页面信息,具体代码如下

import requests
url = 'https://item.jd.com/2967929.html'
kv = {'user-agent': 'Mozilla/5.0'}      # 加入游览器头部信息,隐藏头

try:
	r = requests.get(url,header=kv)
	r.raise_for_status()
	r.encoding = r.appraent_encoding
	printf(r.txt[:1000])		# 限定显示前1000个字符
expect:
	print('爬取出错')

【python爬虫基础入门】python爬虫requests库使用操作全解_第5张图片

2. 百度/360搜索关键字的提交

  • 百度的关键字接口http://www,baidu.com/s?wd=keyword
  • 360的搜索关键字接口http://www.so.com/s?q=keyword

代码如下

import requests
'''
使用requests库使用百度进行关键字搜索
'''

keyword = "Python"      # 要搜索的关键字

try:
    kv = {'wd':keyword}
    url = 'http://www.baidu.com/s'
    r = requests.request('Get',url,params=kv)
    # r = requests.get(url,params=kv)   # 也可用使用这样的做法
    print(r.request.url)
    r.raise_for_status()
    print(len(r.text))

except:
    print('something wrong!')

【python爬虫基础入门】python爬虫requests库使用操作全解_第6张图片

3. 网络图片的爬取

使用requests库在特定的网页中进行网络图片的爬取,具体代码如下

# -*- coding: utf-8 -*-
# @Time  : 2020/4/14 22:08
# @Author: 哦嚯嚯哦
# @File  : Demo3.py
# @tool  : PyCharm

import requests
import os
'''
使用requests库在特定的网址获取图片,并保存在本地文件夹
'''

kv = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.108 Safari/537.36',
      'Referer': 'https://www.baidu.com/'     # 请求防盗链,用于请求网站的反爬
      }
url = 'https://i.loli.net/2020/05/16/nwGVPKSbtToYOac.jpg' # 图片网址
root = 'F://User_Desktop/py_test/'			# 保存路径
path = root + url.split('/')[-1]     # 使用图片的最后几个字节作为文件名存储

try:
    if not os.path.exists(root):
        os.mkdir(root)
    if not os.path.exists(path):
        r = requests.get(url, headers=kv)
        with open(path,'wb') as f:      # 以二进制方式写入
            f.write(r.content)
            r.close()
            print('文件保存成功')
    else:
        print('文件已经存在')

except:
    print('something wrong!')




将上述代码改进加入循环爬取可以实现批量定向爬取网站图片,效果的话,可以自己尝试下,这里就不予展示了。

六.网络爬虫的正确使用方法

1. 网络爬虫的规模分类

根据使用网络爬虫的功能的不同,尺寸的不同,将网络爬虫分为三个类

  • 小规模:
    • 数据量小,对爬取速度不敏感
    • 主要用于爬取特定的网页
    • 主要使用Requests库
  • 中规模:
    • 数据量较大,爬取速度叫敏感
    • 主要用于爬取网站,或者爬取一系列的网站,如爬取携程上的火车票数据
    • 主要使用Scrapy库
  • 大规模
    • 搜索引擎级别
    • 用于爬取全网
    • 需要定制开发

2. 网络爬虫的风险

  • 知识 产权的风险
  • 用户隐私的泄露
  • 服务器的骚然问题(加重对网站服务器的负担量)

3. Robots协议

该协议作为网络爬虫的一种标准,内嵌于网站中,存在于网站根目录下的robots.txt文件中,告知网络爬虫哪些页面可以抓取,哪些不允许被抓取

Robots协议的基本语法

# *通配符代表素有,/表示根目录
User-Agent: *
Disallow: /

Robots协议的网站举例

https://www.baidu.com/robots.txt
https://www.csdn.net/robots.txt

Robots协议的使用方法,在编写网络爬虫的时候,应当做到以下几点

  • 编写自动或者人工识别robots.txt,再进行爬取
  • 类人行为的网站访问,可以不用参考robots.txt协议

虽然规则已经定在哪里,但是使用爬虫的时候还是要将规则牢记于心,违法犯罪的事情千万不能做。

七.结语

有句话说的好,“爬虫学的好,监狱蹲到老”(当然这只是开玩笑的),使用爬虫需要遵循一定的规则,但只要正确使用,爬虫还是很好玩滴,(富强,民主,和谐)

八.参考

  • 中国大学MOOC

你可能感兴趣的:(python爬虫,python,运维,httpwebrequest,http)