刚来的朋友们可以根据上面的这篇日常,给自己的Python装上requests模块
之后我们就可以开开心心进入Python爬虫游乐园玩耍啦
简而言之:爬虫入门,首先就要在自己的Python上安装requests模块
上面的日常记录了我这个憨憨安装requests模块时的憨批操作,当然也有一些非常有用的安装指南链接,大家加油盘ta!
requests库的get()方法
get是requests库里一个非常非常重要的方法
获得一个网页最简单的方法就是:
r = requests.get(url)
我们通过这行代码,构造了一个向服务器请求资源的
(Python对大小写敏感,所以Requests对象要保持大写)
get()返回了一个包含服务器资源的
,包含从服务器返回的所有相关资源
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.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格式
- host:合法的Internet主机域名或IP地址
- port:端口号,缺省端口为80
- path:请求资源的路径
HTTP协议对资源的操作
方法 | 说明 |
---|---|
GET | 请求获取URL位置的资源 |
HEAD | 请求获取URL位置资源的响应消息报告,即获得该资源的头部信息 |
POST | 请求向URL位置的资源后附加新的数据 |
PUT | 请求向URL位置存储一个资源,覆盖原URL位置的资源 |
PATCH | 请求局部更新URL位置的资源,即改变该处资源的部分内容 |
DELETE | 请求删除URL位置存储的资源 |
(这个模块还需要完善一下,看看浏览量吧。。。今天太累了,如果人多我就去扒扒资料介绍完这七种方法)
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:网页地址
- **kwargs:控制访问的参数,可选
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
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('爬取失败')
实例二:网络图片的爬取和存储
网络图片链接的一般格式:
试了试爬取大大个人网站上的图片,成功啦!
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('爬取失败')