目标:掌握定向网络数据爬取和网页解析的基本能力
课程链接:Python网络爬虫与信息提取_中国大学MOOC(慕课) (icourse163.org)
Python程序编写常用开发环境:
文本工具类IDE | 集成工具类IDE |
IDLE | PyCharm |
Notepad++ | Wing |
Sublime Text | PyDev & Eclipse |
Vim & Edit | Visual Studio |
Atom | Anaconda & Spyder |
Komodo Edit | Canopy |
一、Requests库的入门
1、Requests库的安装:“以管理员身份运行”cmd,执行 pip install requests(Windows平台)
2、Requests库的7个主要方法:
方法 | 说明 |
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 |
3、Requests库的get()方法
![](https://i-blog.csdnimg.cn/blog_migrate/d5ad54305ec1571c23f0212c8f777b44.png)
语法格式:requests.get(url, params=None, **kwargs)
∙ url :拟获取页面的url链接
∙ params :url中的额外参数,字典或字节流格式,可选
∙ **kwargs:12个控制访问的参数
参数 | 说明 |
params | 字典或字节序列,作为参数增加到url中 |
data | 字典、字节序列或文件对象,作为Request的内容 |
json | JSON格式的数据,作为Request的内容 |
headers | 字典,HTTP定制头 |
cookies | 字典或CookieJar,Request中的cookie |
auth | 元组,支持HTTP认证功能 |
files | 字典类型,传输文件 |
timeout | 设定超时时间,秒为单位 |
proxies | 字典类型,设定访问代理服务器,可以增加登录认证 |
allow_redirects | True/False,默认为True,重定向开关 |
stream | True/False,默认为True,获取内容立即下载开关 |
verify |
True/False
,默认为
True
,认证
SSL
证书开关
|
cert | 本地SSL证书路径 |
4、Requests的2个重要对象:Response、Request
Response对象包含服务器返回的所有信息,也包含请求的Request信息
属性 | 说明 |
r.status_code
| HTTP请求的返回状态,200表示连接成功,404表示失败 |
r.text
| HTTP响应内容的字符串形式,即,url对应的页面内容 |
r.encoding | 从HTTP header中猜测的响应内容编码方式 |
r.apparent_encoding
| 从内容中分析出的响应内容编码方式(备选编码方式) |
r.content | HTTP响应内容的二进制形式Response |
异常 | 说明 |
requests.ConnectionError | 网络连接错误异常,如DNS查询失败、拒绝连接等 |
requests.HTTPError | HTTP错误异常 |
requests.URLRequired | URL缺失异常 |
requests.TooManyRedirects | 超过最大重定向次数,产生重定向异常 |
requests.ConnectTimeout | 连接远程服务器超时异常 |
requests.Timeout | 请求URL超时,产生超时异常 |
![](https://i-blog.csdnimg.cn/blog_migrate/e42c18b2cccfdc51645322ee3b1bc617.png)
简易方法:使用r.raise_for_status()在方法内部判断r.status_code是否等于200,不需要增加额外的if语句,该语句便于利用try‐except进行异常处理。
8、HTTP协议
import requests
url = "https://item.jd.com/100057771880.html?bbtf=1"
try:
r = requests.get(url)
r.raise_for_status()
r.encoding = r.apparent_encoding
print(r.text)
except:
print("爬取失败")
实例2:亚马逊商品页面的爬取
#亚马逊不支持user-agent为python中requests库发出的爬取
# import requests
# url = "https://www.amazon.cn/dp/B097F43FQL?ref_=Oct_DLandingS_D_6b0b07a2_6"
# try:
# r = requests.get(url)
# r.raise_for_status()
# r.encoding = r.apparent_encoding
# print(r.text)
# except:
# print("爬取失败")
#在爬取时写入一个键值对,将user-agent修改
import requests
url = "https://www.amazon.cn/dp/B097F43FQL?ref_=Oct_DLandingS_D_6b0b07a2_6"
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)
except:
print("爬取失败")
实例3:百度360搜索关键词提交
#百度搜索
import requests
url = "http://www.baidu.com/s"
keyword = "Java" #关键词
try:
kv = {'wd':keyword} #wd表示搜索引擎接口前面的标识
r = requests.get(url, params = kv)
print(r.request.url)
r.raise_for_status()
r.encoding = r.apparent_encoding
print(len(r.text))
except:
print("爬取失败")
#360搜索
# import requests
# url = "http://www.so.com/s"
# keyword = "Python" #关键词
# try:
# kv = {'q':keyword} #q表示搜索引擎接口前面的标识
# r = requests.get(url, params = kv)
# print(r.request.url)
# r.raise_for_status()
# r.encoding = r.apparent_encoding
# print(len(r.text))
# except:
# print("爬取失败")
实例4:网络图片的爬取和存储
import requests
import os
root ="E://桌面//photo//"
url = "http://img0.dili360.com/pic/2023/05/24/646dd606de72f0k35279632_t.jpg@!rw15"
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("爬取失败")
实例5:IP地址归属地的自动查询
import requests
url = "http://m.ip138.com/ip.asp?ip="
try:
r = requests.get(url+'202.204.80.112')
r.raise_for_status()
r.encoding = r.apparent_encoding
print(r.text[-500:])
except:
print("爬取失败")