此为北理嵩天老师mooc课程【网络爬虫与信息提取】的课程学习笔记,附带一些其他书籍博客的资料。
1、安装 Requests 库
使用命令行输入:
pip install requests
或者:
python -m pip install requests
2 、requests 的常用方法
方法名称 | 说明 |
---|---|
requests.request() | 最基础的,构造请求,支撑其他方法的使用 |
.get() | 获取 html 网页的主要方法,对应GET |
.head() | 获取html网页头信息,对应HEAD |
.post() | 向html网页提交post请求 |
.put() | 向网页提交PUT请求 |
.patch | 向网页提交局部修改的请求 |
.delete() | 向网页提交删除的请求 |
requests.requests()为基础方法
request.requests(method, url, **kwargs)
- method包含上述的get/put/post/options 等七种方法
- url为获取页面的链接
- **kwargs 为控制访问的参数,共13个,可自主按需选择
- params :字典或字节序列,可以作为 参数 加入到url中
- data :对象,作为request的对应内容
- json:JSON格式的数据,作为Request的内容
- headers :字典,http定制的头 字段
- cookies :request中的cookie
- files :字典,向链接传输文件
- auth :元祖,认证http功能
- timeout :设定超时时间,秒为单位
- proxies :字典类型,可以设定访问的代理服务器
- allow_redirects :开关,允许不允许重定向
- stream :文件下不下载,默认下载
- verify :认证ssl
- cert :本地ssl路径
具体说明可以转到函数定义去查看。
获取数据可以使用head和get, head方法获取的信息头部、即为摘要。get为全部信息,内容详细
发送修改可以使用post、patch、put等方法。
r = requests.post(url,data = “”ABC“”)
patch 和 put的区别在于patch可以只提交需要更新的数据,而put需要将所有字段数据重新提交,不更改的会被删除。
post向url内容添加指定的表单、data等
r = requests.post(url,data = '字符串"或字典键值对等)
get方法
构造向服务器请求资源的requests对象,返回的的为response对象,包含各种信息。
requests.get(url, params=None, **kwargs)
包含页面链接、URL额外参数字典或字节流格式、其他访问控制可选参数。
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 | 用户访问url重定向次数过多 |
requests.ConnectTimeout | 仅指与远程服务器连接时的超时异常 |
requests.Timeout | 发起到获得URL整个过程的超时异常 |
判断返回的response类型的状态是不是200,如果返回的不是200说明有错误,在程序中产生requests.HTTPError异常
r.raise_for_status()
3、网页爬取
爬取网页的通用代码框架:
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 "产生异常"
if __name__ == "__main__":
url = "https://www.csdn.net/"
print(getHTMLText(url))
示例3.1
爬取网页时网站可以通过robots.txt和识别requests请求的header规范、约束爬虫访问。所以有些网站会识别你的requests请求,如果其中的headers为python相关时可能报错、无法获取信息。此时人为构造键值对,改变用户属性
状态码503 说明访问异常。
修改User-Agent 模拟为浏览器身份表示。加入到原来headers中,再去访问。
kv = {"User-Agent":"Mozilla/5.0"}
url = "https://www.amazon.cn/dp/0545377579/ref=cngwdyfloorv2_recs_0/461-7699818-3098529?pf_rd_m=A1AJ19PSB66TGU&pf_rd_s=desktop-2&pf_rd_r=R9180B92B8TKWZC9QP4M&pf_rd_r=R9180B92B8TKWZC9QP4M&pf_rd_t=36701&pf_rd_p=db4e96ef-5fc1-47f8-92b2-b9a5e737b326&pf_rd_p=db4e96ef-5fc1-47f8-92b2-b9a5e737b326&pf_rd_i=desktop"
r = requests.get(url, headers = kv)
r.status_code
#输出200,表示成功
示例3.2
向搜索引擎提供关键词,自动获取检索结果。
百度搜索的关键词接口url连接为 http://www.baidu.com/s?wd=keyword
更改要搜索的关键词即可。以百度搜索CSDN为例
代码实现:
import requests
keyword = "CSDN"
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("产生异常")
示例3.3
爬取网页上的一张图片,并保存在电脑指定路径内。
爬取一张帅气的哈士奇美照。
不知道为什么我在设置保存的文件路径时文件夹层数过多就会爬取失败,如果有大神了解原因,还望不吝赐教。
import requests
import os
url = "http://i.hao123.cn/attachment/info/201808/1533094309cjm12.jpg"
root = "E://pyrelat//"
#路径文件夹层数再多一点时就报错爬取失败
path = root + url.split("/")[-1]
try:
if not os.path.exists(root):
os.mkdir(root)
if not os.path.exists(path):
kv = {"User-Agent": "Mozilla/5.0"}
r = requests.get(url, headers = kv)
with open(path, "wb") as f:
f.write(r.content)
f.close()
print("文件保存成功")
else:
print("文件已经存在")
except:
print("爬取失败")