当前位置:   article > 正文

python爬虫之——request基础_python request

python request

request库

一、request库的安装

  1. win + R,输入cmd进入命令行
  2. 在命令行中直接输入:pip install requests
    在这里插入图片描述

二、 request库的七个主要方法

1. requests.request():构造一个方法【其他六个方法的实现都是通过调用该方法实现的】

  • requests.request(method,url,**kwargs)
  • method:请求方式,对应get/put/post/head/patch/delete/options七种方法【options并不与获取资源直接相关故平时使用的比较少】
  • url:待获取页面的url链接
  • **kwargs:控制访问的参数,共13个,均为可选项。

params:字典或字节序列,作为参数增加到url中。

mx={'key1':'value1','key2':'value2'}
r=requests.request('GET','http://python123.io/ws',params=mx)
print(r.url)
  • 1
  • 2
  • 3

在这里插入图片描述

data:字典、字节序列或文件对象,作为Request的内容【向服务器提供/提交资源时使用】

mx={'key1':'value1','key2':'value2'}
r=requests.request('POST','http://python123.io/ws',data=mx)
body='aha'
r=requests.request('POST','http://python123.io/ws',data=body)
  • 1
  • 2
  • 3
  • 4

json:JSON格式的数据,作为Request的内容

mx={'key1':'value1','key2':'value2'}
r=requests.request('POST','http://python123.io/ws',json=mx)
  • 1
  • 2

headers:字典,HTTP定制头【可用于模拟浏览器实现访问】
cookies:字典或CookieJar,Request中的cookie
auth:元组,支持HTTP认证功能
files:字典类型【是向服务器传输文件时所用的字段】
timeout:设定超时时间,以秒为单位。【规定时间内没有收到请求的内容,将产生timeout的异常】

r=requests.request('GET','http://python123.io/ws',timeout=10)
  • 1

proxies:字典类型【可以为爬取网页设定访问代理服务器,可以增加登录认证,可以隐藏用户的原ip地址信息,有效地防止对爬虫的逆追踪】

pxs={'http:':'http://user:pass@10.10.10.1:1234'
		'https':'http://10.10.10.1:4321'}
r=requests.request('GET','http://www.baidu.com',proxies=pxs)
  • 1
  • 2
  • 3

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

2.requests.get():获取HTML网页的主要方法(对应于HTTP的GET)【常用MAX】

requests.get():该函数的原型为requests.get(url,params=None,**kwargs):

url:待获取页面的url链接
params:url的额外参数,字典或字节流格式,可选;
**kwargs:12个控制访问的参数,可选。即requests.request()方法中,除了param的12个参数
出自文章下方链接视频截图

3.requests.head():获取HTML网页的头信息的方法(对应于HTTP的HEAD)【只能获取网络资源的head信息,当想输出内容的时候是不星滴】

url:待获取页面的url链接。
**kwargs:13个控制访问的参数,可选。

r=requests.head('http://httpbin.org/get')
r.headers
//返回网页头的信息
r.text
  • 1
  • 2
  • 3
  • 4

在这里插入图片描述

4.requests.post():向网页提交对应的post方法(对应于HTTP的POST)

向URL POST一个字典,自动编码为form表单【实例接上方head】
requests.post(url,data=None,json=None,**kwargs)

url:待获取页面的url链接
data:字典、字节序列或文件对象,作为Request的内容。
json:JSON格式的数据,作为Request的内容
**kwargs:11个控制访问的参数,可选。

payload={'key1':'value1','key2':'value2'}
r.requests.post('http://httpbin.org/post',data=payload)
print(r.text)
//返回的data为空,但form表单不为空
  • 1
  • 2
  • 3
  • 4

在这里插入图片描述

//向URL POST一个字符串自动编码为data
r.requests.post('http://httpbin.org/post',data=ABC')
print(r.text)
//返回的data为Aha,form表单为空

  • 1
  • 2
  • 3
  • 4
  • 5

在这里插入图片描述

5.requests.put():向网页提交PUT请求方法(对应于HTTP的PUT)

可将原有的数据覆盖掉
requests.put(url,data=None,**kwargs)

url:待获取页面的url链接
data:字典、字节序列或文件对象,作为Request的内容。
**kwargs:12个控制访问的参数,可选。即requests.request()方法中,除了data的12个参数

payload={'key1':'value1','key2':'value2'}
r.requests.put('http://httpbin.org/put',data=payload)
print(r.text)
  • 1
  • 2
  • 3

在这里插入图片描述

6.requests.patch():向网页提交局部修改请求(对应于网页的PATCH)

requests.patch(url,data=None,**kwargs)

url:待获取页面的url链接
data:字典、字节序列或文件对象,作为Request的内容。
**kwargs:12个控制访问的参数,可选。即requests.request()方法中,除了data的12个参数

7.requests.delete():向网页提交删除请求(对应于网页的DELETE)

requests.delete(url,**kwargs)

url:待删除页面的url链接
**kwargs:13个控制访问的参数,可选。

三、request库的重要对象——Response

出自文章尾部链接视频的截图
下面以代码为例介绍response的对象

import requests
r=requests.get("http://baidu.com")
print(r.status_code)//返回200说明连接成功,返回404说明没有找到该链接,可能是输入有误
type(r)//查看当前r的类型——Response
r.headers
//查看网页头的信息
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

在这里插入图片描述
Response对象包含服务器返回的所有信息,同时也包含了我们向服务器发送请求的Request信息。

Response对象的属性:
  1. r.status_code:HTTP 请求的返回状态,如200,404,500等。
  2. r.text:HTTP响应内容的字符串形式,即url对应的页面内容。
  3. r.encoding:从HTTP的header中猜测响应内容的编码方式,如utf-8等。【如果header里面没
    有设置编码格式即不存在charset,则默认返回ISO-8859-1】
  4. r.apparent_encoding:从内容中分析出响应内容编码方式【备选编码方式,更靠谱】。
  5. r.content:HTTP响应内容的二进制形式。
    在这里插入图片描述

四、爬虫的通用框架

通用代码框架:一行代码能够准确、可靠地爬取网页的内容。
通常我们都是使用requests.get()方法来获取网页的信息,但是因为网页连接有风险,所以异常处理异常重要。

1.request库的异常

  1. requests.ConnectionError:网络连接错误异常,如DNS查询失败、拒绝连接等。
  2. requests.HTTPError:HTTP错误异常。
  3. requests.URLRequired:URL缺失异常。
  4. requests.TooManyRedirects:超过最大重定向次数,产生重定向异常。
  5. requests.ConnectTimeout:连接远程服务器超时异常。
  6. requests.Timeout:请求URL超时,产生超时异常。

Response对象返回了所有的网页内容同时提供了一个方法r.raise_for_status()。该方法可以判断返回的response类型,如果返回的不是200,则产生异常requests.HTTPError。

2.通用代码框架

可以有效地处理我们在访问爬取网页的过程中,可能出现的错误。

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 "产生了异常“
```![在这里插入图片描述](https://img-blog.csdnimg.cn/20200421172446540.png#pic_center)
***应用上述框架***
```javascript
name="main"
if name="main":
	url="http://www.baidu.com"
	print(getHTMLText(url))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

在这里插入图片描述

五、代码实例

(一)使用request爬取”python之禅界面“

import requests
url = 'https://www.python.org/dev/peps/pep-0020/'
res = requests.get(url)
text = res.text
text
with open('zon_of_python.txt', 'w') as f:
//创建一个名为zon_of_python的文件并向其中执行写操作
     f.write(text[text.find('<pre')+28:text.find('</pre>')-1])//将爬取内容带格式写入txt文件中
print(text[text.find('<pre')+28:text.find('</pre>')-1])
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9


(二)使用python自带的urllib完成上述操作【但是一定要导入request库!!!】

import urllib
import requests
url= 'https://www.python.org/dev/peps/pep-0020/'
res = urllib.request.urlopen(url).read().decode('utf-8')
print(res[res.find('<pre')+28:res.find('</pre>')-1])
  • 1
  • 2
  • 3
  • 4
  • 5

在这里插入图片描述
(三)爬取亚马逊商品信息

url="https://www.amaZon.cn/gp/product/B01M8L5Z3Y"
try:
	kv={'user-agent':'Mozilla/5.0'}
	r=requests.get(url,headers=kv)
	r.raise_for_status()
	r.encoding=r.apparent_encoding
	print(r.text[1000:2000])
except:
	print("爬取失败")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

在这里插入图片描述
(四)百度/360搜索关键词提交

百度的关键词接口:http://www.baidu.com/s?wd=keyword
360的关键词接口:http://www.so.com/s?q=keyword

百度:关键字:wd

import requests
keyword="Python"
try:
	kv={'wd':keyword} #注意关键字
	r=requests.get("http://www.baidu.com/s",params=kv)
	print(r.request.url)
	r.raise_for_status()
	print(len(r.text)) #输出字段长度
 except:
	print("爬取失败")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

360:关键字:q

import requests
keyword="Python"
try:
	kv={'q':keyword} #注意关键字
	r=requests.get("http://www.so.com/s",params=kv) 
	print(r.request.url)
	r.raise_for_status()
	print(len(r.text)) #输出字段长度
except:
	print("爬取失败")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

在这里插入图片描述
(五)网络图片的爬取
网络图片链接的格式:
http://www.example.com/picture.jpg
如:http://pic32.nipic.com/20130822/2531170_213039750000_2.jpg
单个案例

import requests
 path="C:/Users/Alicecy/Desktop/abc.jpg"#存储位置及名称
 url="http://pic32.nipic.com/20130822/2531170_213039750000_2.jpg" #图片地址
 r=requests.get(url)
 r.status_code
200
 with open(path,'wb') as f:
	f.write(r.content) #以二进制的形式写入图片
112639
 f.close()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

图片爬取的全代码

import requests
import os
url="http://pic32.nipic.com/20130822/2531170_213039750000_2.jpg"
root="C:/Users/Alicecy/Desktop/picture//" #在picture文件夹下保存图片
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)
		with open(path,'wb') as f:
			f.write(r.content)
			f.close()
			print("文件保存成功")
	else:
		print("文件已经存在")
except:
	print("爬取失败")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

在这里插入图片描述
(六)IP地址归属地的自动查询
***手动查询:***https://m.ip138.com/iplookup.asp?ip=ipaddress

import requests
url="https://m.ip138.com/iplookup.asp?ip="
#r=requests.get(url+'202.204.80.112') #有些时候会被拒绝访问,所以就有了接下来的两行
kv={'user-agent':'Mozilla/5.0'}
r=requests.get(url+ '202.204.80.112',headers=kv)
r.text[-500:]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

在这里插入图片描述

import requests
url="https://m.ip138.com/iplookup.asp?ip="
kv={'user-agent':'Mozilla/5.0'}
try:
	r=requests.get(url+'2020.204.80.112',headers=kv)
	r.raise_for_status()
	r.encoding=r.apparent_encoding
	print(r.text[-500:])
except:
	print("爬取失败")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

在这里插入图片描述

HTTP协议

为了更好地理解request,需要结合HTTP协议

1.定义

HTTP:超文本传输协议,是一个基于“请求与响应”模式的、无状态的应用层协议。采用 URL作为网络资源的标识。

无状态:表示第一次请求与第二次请求之间没有关联。
应用层协议:该协议规定于TCP协议之上

2.URL标识:http://host[:port][path]

  1. URL标识以http://开头
  2. host:合法的Internet主机域名或者IP地址
  3. port::端口号,缺省端口为80
  4. path:请求资源的路径(资源包含的内部路径)
  5. URL是通过HTTP协议存取资源的Internet路径,一个URL对应一个数据资源。
  6. 一个简单的表格是这么创建的:

3.HTTP协议对资源的操作(方法)【其实就是request库提供的功能】

  1. GET:请求获取URL位置的资源。
  2. HEAD:请求获取URL位置资源的响应信息报告,即获得该资源的头部信息。
  3. POST:请求想URL位置的资源后附加新的数据。
  4. PUT:请求想URL位置存储一个资源,覆盖原URL位置的资源。
  5. PATCH:请求局部更新URL位置的资源,即改变该处资源的部分内容。【与put相比,节省带宽】
  6. DELETE:请求删除位置存储的资源。
    在这里插入图片描述

小结

HTTP协议方法Request 库方法功能一致性
GETrequests.get()一致
HEADrequests.head()一致
POSTrequests.post()一致
PUTrequests.put()一致
PATCHrequests.patch()一致
DELETErequests.delete()一致

小编有话说:
感谢路过的各位能够看到这里,本篇内容是学习嵩天教授的Python网络爬虫与信息提取课程.的笔记,感兴趣的您可以前去溜溜。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/463242
推荐阅读
相关标签
  

闽ICP备14008679号