python爬虫之——request基础
- request库
- 一、request库的安装
- 二、 request库的七个主要方法
- 1. requests.request():构造一个方法【其他六个方法的实现都是通过调用该方法实现的】
- 2.requests.get():获取HTML网页的主要方法(对应于HTTP的GET)【常用MAX】
- 3.requests.head():获取HTML网页的头信息的方法(对应于HTTP的HEAD)【只能获取网络资源的head信息,当想输出内容的时候是不星滴】
- 4.requests.post():向网页提交对应的post方法(对应于HTTP的POST)
- 5.requests.put():向网页提交PUT请求方法(对应于HTTP的PUT)
- 6.requests.patch():向网页提交局部修改请求(对应于网页的PATCH)
- 7.requests.delete():向网页提交删除请求(对应于网页的DELETE)
- 三、request库的重要对象——Response
- 四、爬虫的通用框架
- 五、代码实例
- HTTP协议
- 小结
request库
一、request库的安装
- win + R,输入cmd进入命令行
- 在命令行中直接输入: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)
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)
json:JSON格式的数据,作为Request的内容
mx={'key1':'value1','key2':'value2'}
r=requests.request('POST','http://python123.io/ws',json=mx)
headers:字典,HTTP定制头【可用于模拟浏览器实现访问】
cookies:字典或CookieJar,Request中的cookie
auth:元组,支持HTTP认证功能
files:字典类型【是向服务器传输文件时所用的字段】
timeout:设定超时时间,以秒为单位。【规定时间内没有收到请求的内容,将产生timeout的异常】
r=requests.request('GET','http://python123.io/ws',timeout=10)
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)
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
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表单不为空
//向URL POST一个字符串自动编码为data
r.requests.post('http://httpbin.org/post',data=‘ABC')
print(r.text)
//返回的data为Aha,form表单为空
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)
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
//查看网页头的信息
Response对象包含服务器返回的所有信息,同时也包含了我们向服务器发送请求的Request信息。
Response对象的属性:
- r.status_code:HTTP 请求的返回状态,如200,404,500等。
- r.text:HTTP响应内容的字符串形式,即url对应的页面内容。
- r.encoding:从HTTP的header中猜测响应内容的编码方式,如utf-8等。【如果header里面没
有设置编码格式即不存在charset,则默认返回ISO-8859-1】 - r.apparent_encoding:从内容中分析出响应内容编码方式【备选编码方式,更靠谱】。
- r.content:HTTP响应内容的二进制形式。
四、爬虫的通用框架
通用代码框架:一行代码能够准确、可靠地爬取网页的内容。
通常我们都是使用requests.get()方法来获取网页的信息,但是因为网页连接有风险,所以异常处理异常重要。
1.request库的异常
- requests.ConnectionError:网络连接错误异常,如DNS查询失败、拒绝连接等。
- requests.HTTPError:HTTP错误异常。
- requests.URLRequired:URL缺失异常。
- requests.TooManyRedirects:超过最大重定向次数,产生重定向异常。
- requests.ConnectTimeout:连接远程服务器超时异常。
- 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))
五、代码实例
(一)使用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])
(二)使用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])
(三)爬取亚马逊商品信息
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("爬取失败")
(四)百度/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("爬取失败")
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("爬取失败")
(五)网络图片的爬取
网络图片链接的格式:
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()
图片爬取的全代码
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("爬取失败")
(六)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:]
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("爬取失败")
HTTP协议
为了更好地理解request,需要结合HTTP协议
1.定义
HTTP:超文本传输协议,是一个基于“请求与响应”模式的、无状态的应用层协议。采用 URL作为网络资源的标识。
无状态:表示第一次请求与第二次请求之间没有关联。
应用层协议:该协议规定于TCP协议之上
2.URL标识:http://host[:port][path]
- URL标识以http://开头
- host:合法的Internet主机域名或者IP地址
- port::端口号,缺省端口为80
- path:请求资源的路径(资源包含的内部路径)
- URL是通过HTTP协议存取资源的Internet路径,一个URL对应一个数据资源。
- 一个简单的表格是这么创建的:
3.HTTP协议对资源的操作(方法)【其实就是request库提供的功能】
- GET:请求获取URL位置的资源。
- HEAD:请求获取URL位置资源的响应信息报告,即获得该资源的头部信息。
- POST:请求想URL位置的资源后附加新的数据。
- PUT:请求想URL位置存储一个资源,覆盖原URL位置的资源。
- PATCH:请求局部更新URL位置的资源,即改变该处资源的部分内容。【与put相比,节省带宽】
- DELETE:请求删除位置存储的资源。
小结
HTTP协议方法 | Request 库方法 | 功能一致性 |
---|---|---|
GET | requests.get() | 一致 |
HEAD | requests.head() | 一致 |
POST | requests.post() | 一致 |
PUT | requests.put() | 一致 |
PATCH | requests.patch() | 一致 |
DELETE | requests.delete() | 一致 |
小编有话说:
感谢路过的各位能够看到这里,本篇内容是学习嵩天教授的Python网络爬虫与信息提取课程.的笔记,感兴趣的您可以前去溜溜。