刚来的朋友们可以根据上面的这篇日常,给自己的Python装上Requests模块
之后我们就可以开开心心进入Python爬虫游乐园玩耍啦
简而言之:爬虫入门,首先就要在自己的Python上安装Requests模块
上面的日常记录了我这个憨憨安装Requests模块时的憨批操作,当然也有一些非常有用的安装指南链接,大家加油盘ta!
Requests库的get()方法
get是Requests库里一个非常非常重要的方法
获得一个网页最简单的方法就是:
r = requests.get(url)
我们通过这行代码,构造了一个向服务器请求资源的
R
e
q
u
e
s
t
s
对
象
Requests对象
Requests对象(Python对大小写敏感,所以Requests对象要保持大写)
get()返回了一个包含服务器资源的
R
e
s
p
o
n
s
e
对
象
Response对象
Response对象,包含从服务器返回的所有相关资源
get()函数原型
requests.get(url,params=None,**kwargs)
- url:拟获取页面的url链接
- params:url中的额外参数,字典或字节流格式,可选
- **kwargs:12个控制访问的参数
用help偷偷查看一下get的用法并且假装自己看的懂得亚子:
>>> help(requests.get)
Help on function get in module requests.api:
get(url, params=None, **kwargs)
Sends a GET request.
:param url: URL for the new :class:`Request` object.
:param params: (optional) Dictionary, list of tuples or bytes to send
in the query string for the :class:`Request`.
:param \*\*kwargs: Optional arguments that ``request`` takes.
:return: :class:`Response <Response>` object
:rtype: requests.Response
下面我们就举一个小小的栗子:
import requests
url = 'https://www.bilibili.com/'
r = requests.get(url)
print(r.status_code)
##################################
200
# 输出200表示获取成功
>>> type(r)
<class 'requests.models.Response'>
栗子里得
r
r
r就是一个
R
e
s
p
o
n
s
e
对
象
Response对象
Response对象
R
e
s
p
o
n
s
e
对
象
Response对象
Response对象的常用属性:
属性 | 说明 |
---|---|
r.status_code | HTTP请求的返回状态,200表示连接成功,404表示失败 |
r.text | HTTP相应内容的字符串形式,即url对应的页面内容 |
r.encoding | 从HTTP header中猜测的响应内容编码方式 |
r.apparent_encoding | 从内容中分析出的响应内容编码方式(备选编码方式) |
r.content | HTTP响应内容的二进制形式 |
爬取网页的通用代码框架
Requests库的异常:
异常 | 说明 |
---|---|
requests.ConnectionError | 网络连接错误异常,如DNS查询失败,拒绝连接等 |
requests.HTTPError | HTTP错误异常 |
requests.URLRequired | URL缺失异常 |
requests.TooManyRedirects | 超过最大重定向次数,产生重定向异常 |
requests.ConnectTimeout | 连接远程服务器超时异常 |
requests.Timeout | 请求URL超时,产生超市异常 |
理解Requests库的异常:
异常 | 说明 |
---|---|
r.raise_for_status() | 如果不是200,产生异常requests.HTTPError |
下面我们就利用上述针对异常的操作,给出爬取网页的通用代码框架(可以自己运行一下):
import requests
def getHTMLText(url):
try:
r = requests.get(url,timeout=30)
r.raise_for_status()
# 如果状态不是200,引发HTTPError异常
r.encoding = r.apparent_encoding
# 用apparent_enconding代替encoding,使返回异常的解码是正确的
return r.text
except:
return "产生异常"
if __name__=='__main__':
url = 'http://www.baidu.com'
print(getHTMLText(url))
Requests库的方法
Requests库常见的七种方法:
方法 | 说明 |
---|---|
requests.request() | 构造一个请求,支持以下挨个方法的基础方法 |
requests.get() | 获取HTML网页的主要方法,对应于HTTP的GET |
requests.head() | 获取HTML网页头信息的方法,对应于HTTP的HEAD |
requests.post() | 向HTML网页提交POST请求的方法,对应于HTTP的POST |
requests.put() | 向HTML网页提交PUT请求方法,对应于HTTP的PUT |
requests.patch() | 向HTML网页提交局部修改请求,对应于HTTP的PATCH |
requests.delete() | 向HTML页面提交删除请求,对应于HTTP的DELETE |
这里我们有必要介绍一下HTTP协议:
HTTP协议:
HTTP,Hypertext Transfer Protocol,超文本传输协议
HTTP是一个基于“请求与响应”模式的,无状态的应用层协议
HTTP协议采用URL作为定位网络资源的标识
URL格式
h t t p : / / h o s t [ : p o r t ] [ p a t h ] http://host[:port][path] http://host[:port][path]
- host:合法的Internet主机域名或IP地址
- port:端口号,缺省端口为80
- path:请求资源的路径
HTTP协议对资源的操作
方法 | 说明 |
---|---|
GET | 请求获取URL位置的资源 |
HEAD | 请求获取URL位置资源的响应消息报告,即获得该资源的头部信息 |
POST | 请求向URL位置的资源后附加新的数据 |
PUT | 请求向URL位置存储一个资源,覆盖原URL位置的资源 |
PATCH | 请求局部更新URL位置的资源,即改变该处资源的部分内容 |
DELETE | 请求删除URL位置存储的资源 |
r e q u e s t s . r e q u e s t requests.request requests.request
requests.request(method,url,**kwargs)
- method:请求方式
r = requests.request('GET',url,**kwargs)
r = requests.request('HEAD',url,**kwargs)
r = requests.request('POST',url,**kwargs)
r = requests.request('PUT',url,**kwargs)
r = requests.request('PATCH',url,**kwargs)
r = requests.request('DELETE',url,**kwargs)
r = requests.request('OPTIONS',url,**kwargs)
- url:拟获取页面的url链接
- **kwargs:13个控制访问的参数,可选
- params:字典或字节序列,作为参数增加到url中
import requests
kv = {'kay1':'value1','kay2':'value2'}
r = requests.request('GET','http://python123.io/ws',params=kv)
print(r.url)
# 把键值对增加到url中
https://python123.io/ws?kay1=value1&kay2=value2
- data:字典,字节序列或文件对象,作为Request的内容
kv = {'key1':'value1','key2':'value2'}
r = requests.request('POST','http://python123.io/ws',data=kv)
- json:JSON格式的数据,作为Request的内容
- headers:字典,HTTP定制头
- cookies:字典或CookieJar,Request中的cookie
- auth:元组,支持HTTP认真功能
- files:字典类型,传输文件
fs = {'file' : open('data.xls','rb')}
r = reuqests.request('POST','http://python123.io/ws',file=fs)
- timeout:设定超过时间,秒为单位
r = requests.request('GET','http://www.baidu.com',timeout=10)
- proxies:字典类型,设定访问代理服务器,可以增加登录认证
pxs = {'http':'http://user:pass@10.10.10.1:1234',
'https':'https://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证书路径
r e q u e s t s . g e t requests.get requests.get
requests.get(url,params=None,**kwargs)
- url:拟获取页面的url链接
- params:url中的额外参数,字典或字节流格式,可选
- **kwargs:12个控制访问的参数,可选
r e q u e s t s . h e a d requests.head requests.head
requests.head(url,**kwargs)
- url:拟获取页面的url链接
- **kwargs:13个控制访问的参数,可选(与request一样)
r e q u e s t s . p o s t requests.post requests.post
requests.post(url,data=None,json=None,**kwargs)
- url:拟获取页面的url链接
- data:字典,字节序列或文件,Request的内容
- json:JSON格式的数据,Request的内容
- **kwargs:11个控制访问的参数,可选
r e q u e s t s . p u t requests.put requests.put
requests.put(url,data=None,**kwargs)
- url:拟获取页面的url链接
- data:字典,字节序列或文件,Request的内容
- **kwargs:12个控制访问的参数,可选
r e q u e s t s . p a t c h requests.patch requests.patch
requests.patch(url,data=None,**kwargs)
- url:拟获取页面的url链接
- data:字典,字节序列或文件,Request的内容
- **kwargs:12个控制访问的参数,可选
r e q u e s t s . d e l e t e requests.delete requests.delete
requests.delete(url,**kwargs)
- url:拟获取页面的url链接
- **kwargs:13个控制访问的参数,可选
Robots协议
Robots Exclusion Standard 网络爬虫排除标准
作用: 网站告知爬虫哪些内容可以抓取,那些不行
形式: 在网站根目录下的robots.txt
Robots协议基本语法:
# 注释
* 代表所有
/ 代表根目录
User-agent: *
Disallow: /
讲真我去访问了一些知名网站的robots协议,感觉非常神奇(可能程序员定义中的 " 神奇 " 比较诡谲)
http://www.baidu.com/robots.txt
http://news.sina.com.cn/robots.txt
http://www.qq.com/robots.txt
http://news.qq.com/robots.txt
对于任何一个合格的网络爬虫,都应该自动或人工识别robots.txt,再进行内容爬取
实例一:京东商品页面爬取
我要爬取我一直很想要的这个花京院典明的同款耳钉!
import requests
url = 'https://item.jd.com/55159887218.html'
r = requests.get(url)
>>> r.status_code
200
>>> r.encoding
'gbk'
完整代码(用分片的格式输出前999个字符,看懂了吗)
import requests
url = 'https://item.jd.com/55159887218.html'
try:
r = requests.get(url)
r.raise_for_status()
r.encoding = r.apparent_encoding
print(r.text[:1000])
except:
print('爬取失败')
实例二:网络图片的爬取和存储
网络图片链接的一般格式:
h
t
t
p
:
/
/
w
w
w
.
e
x
a
m
p
l
e
.
c
o
m
/
p
i
c
t
u
r
e
.
j
p
g
http://www.example.com/picture.jpg
http://www.example.com/picture.jpg
试了试爬取大大个人网站上的图片,成功啦!
import requests
import os
url = 'http://images.uchor.com/o_1aa70i5ee18mduagc311fri22g14.jpg?imageMogr2/quality/99|watermark/1/image/aHR0cDovL2ltYWdlcy51Y2hvci5jb20vd2F0ZXJtYXJrLnBuZw==/gravity/South/dx/0'
root = 'D://pic//'
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('爬取失败')