第一次写CSDN的博客,正好这两天自己的兴趣突然产生了,自己摸索着学了一点网络爬虫的东西,写篇博客试一下。主要是课上学的都是C语言,C++面向对象…所以课下就想自己学学python,觉得蛮好玩的,练习网络爬虫的时候顺便也当学习一下python的基础语法吧。
学了一段时间的爬虫,觉得网络爬虫就像浏览器访问网站一样,只不过浏览器是为了将网站服务器返回的数据转化为人类看的网页内容,而爬虫则是为了爬取并提取网页的信息。人类看的是图象,而爬虫看的是文本。
windows系统下按Win+R
输入cmd
启动命令行解释器 输入pip install requests
将自动安装requests库
Requests是一个自动向网页发起请求的工具
可以使用这个工具向网站服务器发起请求
主要使用的函数接口是:
r = requests.get(url,params=None,**kwargs)
其中:
url
: 拟获取页面的URL链接
params
: url中的额外参数,字典或者字节流格式(可选)
**kwargs
: 13个控制访问的参数(可选)
返回的对象类型为
Requests库还提供了一共七种请求方法:
request get head post put patch delete
而第一种requests.request
是Requests库提供的最基础的访问请求方式,后六种均是对request方法的不同封装。与之对应的是HTTP对资源的六种操作:
GET
:请求资源
HEAD
:请求相应信息报告,获取头部信息
POST
:附加新的数据
PUT
:储存一个资源,覆盖原URL位置的资源
PATCH
:请求局部更新资源 即改变部分内容
DELETE
:请求删除资源
一、首先,检查服务器响应的结果:
r.status_code
检查HTTP返回的状态,只有当返回值为200时才说明成功获得响应。
>>> r.status_code
200
>>> r.url #查看真实访问的链接
其他的返回值所反映的错误提示,可以搜索引擎一波:
常见的状态代码:
200 – 服务器成功返回网页
404 – 请求的网页不存在
503 – 服务器暂时不可用
–
1xx:请求收到,继续处理
2xx:操作成功收到,分析、接受
3xx:完成此请求必须进一步处理
4xx:请求包含一个错误语法或不能完成
5xx:服务器执行一个完全有效请求失败
二、查看编码方式:
>>> r.encoding #从HTTP header中猜测的响应内容的编码方式
'ISO-8859-1'
>>> r.apparent_encoding #从内容中分析出的响应内容的编码方式(备选编码方式)
'utf-8'
如果HTTP返回信息的header.charset
里告诉了建议的编码方式,则encoding
中是给出的建议编码方式,如果没有默认的是ISO-8859-1
编码。
而apparent_encoding
中的是requests库根据内容推测出的编码方式,一般较准确。所以这个地方我们可以直接采用推测出的编码方式:
>>> r.encoding = r.apparent_encoding
三、查看内容
>>> r.text #文本信息
>>> r.content #内容的二进制形式
r.text
可以后续用BeautifulSoup库和正则表达式库进行信息的提取,也可以直接保存成HTML文件(不过我们的目的应该不是这个吧),就可以在本地用浏览器打开了。
r.content
可以保存成二进制文件用来爬取图片,音乐,视频等多媒体文件到本地。
四、实例
我们以百度首页为例查看网页信息:
>>> import requests #引入requests库
>>> url = "http://www.baidu.com"
>>> r = requests.get(url) #获取网页信息
>>> r.status_code #查看是否成功返回信息
200
>>> r.encoding
'ISO-8859-1'
>>> r.apparent_encoding
'utf-8'
>>> r.encoding = r.apparent_encoding #改变编码方式
>>> r.text #查看返回的文本信息
'\r\n 百度一下,你就知道 \r\n'
五、添加异常处理
>>> r.raise_for_status() #如果不是200,则引发HTTPError异常
异常处理:
ConnectionError
网络链接错误一场,如DNS查询异常、拒绝连接等
HTTPError
HTTP错误异常
URLRequired
URL缺失异常
TooManyRedirects
超过最大重定向次数,产生重定向异常
ConnectTimeout
连接远程服务器超时异常 (只指连接服务器时异常)
Timeout
请求URL超时,产生超时异常 (整个访问过程异常)
try:
r = requests.get(url)
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text
except:
return "访问异常"
这里有13个参数,具体的用法我也不了解。。。
params:
字典或者字节序列,作为参数增加到url中
>>> kv = {'key1' : 'value1','key2' : 'value2'}
>>> r = requests.get(url,params = kv)
.../ws?key1=value1&key2=value2
data:
字典或者字节序列,作为Request的内容
json:
JSON格式,作为Request的内容
headers:
字典,HTTP定制头 模拟访问协议头
hd = {‘user-agent’ : ‘Chrome/10’} #可模拟Chrome浏览器访问
cookies:
字典 or CookieJar格式
auth:
元组,认证用
file:
传输文件
timeout:
设置超时时间,以秒为单位
proxies:
字典类型,设定访问代理服务器,可以增加登陆认证
用于隐藏用户爬取网站的原IP地址 防止对爬虫的反追踪
allow_redirects:
重定向开关 True/False 默认True
stream:
获取内容立即下载开关 True/False 默认True
verify:
认证SSL证书开关 True/False 默认True
cert:
保存SSL证书路径
www.amazon.cn不允许爬虫访问不过我们可以通过更改header来模拟浏览器访问。
>>> import requests
>>> url = "https://www.amazon.cn/dp/B07746ZX27/ref=cngwdyfloorv2_recs_0?pf_rd_p=d0690322-dfc8-4e93-ac2c-8e2eeacbc49e&pf_rd_s=desktop-2&pf_rd_t=36701&pf_rd_i=desktop&pf_rd_m=A1AJ19PSB66TGU&pf_rd_r=HHTPNVJHEBG92FV87WXR&pf_rd_r=HHTPNVJHEBG92FV87WXR&pf_rd_p=d0690322-dfc8-4e93-ac2c-8e2eeacbc49e"
>>> kv = {"User-Agent" : "Chrome\10"}
>>> r1 = requests.get(url)
>>> r2 = requests.get(url,headers = kv)
>>> r1.status_code
503
>>> r2.status_code
200
用params参数为百度搜索引擎添加搜索关键字
>>> import requests
>>> kv = {"wd" : "Python"}
>>> r = requests.get("http://www.baidu.com/s",params = kv)
>>> r.url
'http://www.baidu.com/s?wd=Python'
爬取并储存照片到本地
import requests
import os
url = "https://www.baidu.com/img/bd_logo1.png?where=super"
root = "D://pictures//"
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("文件保存成功")
except:
print("爬取失败")