前言
一直有这个想法,看到csdn上有人说想学就快速入手,所以尝试的学习学习,记录下。
学习目标
掌握定向网络数据的爬取和网页解析的基本能力
总体内容
- Requests:自动爬取HTML页面,自动网络请求提交
- robots.txt:网络爬虫排除标准
- Beautiful Soup:解析HTML页面
- Projects:实战项目
- Re:正则表达式提取关键信息
- Scrapy:专业网络爬虫的框架
Requests库的安装
1、在pycharm中ctrl + alt + s打开setting
2、打开Projects中的第一项如图:
3、点击右边一栏的 + 号搜索requests如图:
4、点击底下的Install Package安装即可。
5、新建pyfile,输入代码测试
import requests as req
r = req.get("http://www.baidu.com")
print(r.status_code)
r.encoding = 'utf-8'
print(r.text)
看到状态码为200,网页内容已经抓取下来了。
requests库的主要方法
get方法
- 构造一个向服务器请求资源的Requests对象
- 返回一个包含服务器资源的Response对象
Response对象
这个对象包含了网页的全部信息,常用的属性如下图:
访问流程
- get方法回去Response对象
- 检测Response对象的状态码是否是200
- 是200则可以操作r.text,r.encoding等
- 不是200则根据出错原因产生异常
使用例子
import requests as req
r = req.get("http://www.baidu.com")
print(r.status_code)
print(r.encoding)
print(r.text)
r.encoding = 'utf-8'
print(r.text)
输出:
说明:
在未修改encoding的时候输出的text文本是存在乱码的如图:
r.encoding:如果header中不存在charset,则认为编码为ISO-8859-1,他是不支持中文的,修改成‘utf-8’则可以显示中文。
r.apparent_encoding:从http的响应网页内容中分析它应该是什么编码格式,备选编码参数是更可靠的。所以可以直接用备选编码复制给encoding即可。
import requests as req
r = req.get("http://www.baidu.com")
print(r.status_code)
r.encoding = r.apparent_encoding
print(r.text)
requests库的异常
通用异常处理框架
import requests as req
def getHTMLText(url):
try:
r = req.get(url, timeout=30)
r.raise_for_status() # 捕获状态码是否是200不是则抛出异常
r.encoding = r.apparent_encoding
return r.text
except:
return "产生异常"
if __name__ == "__main__":
url = 'http://www.baidu.com'
print(getHTMLText(url))
这里可以断网测试下:就会输出产生异常
http协议
HTTP:Hypertext Transfer Protocol,超文本传输协议,是一种基于“请求与相应”模式的、无状态的应用层协议。
requests库与之对应的方法使用
import requests as req
url = 'http://httpbin.org/post'
r = req.head(url)
print("头部信息" + str(r.headers))
print("文本内容" + str(r.text))
paylooad = {'key1':'value1','key2':'value2'}
r = req.post(url,data = paylooad)
print("测试post" + str(r.text))
r = req.post(url,data = 'ABC')
print("测试post" + str(r.text))
r = req.put(url,data = paylooad)
print("测试put" + str(r.text))
输出:
头部信息{'Allow': 'OPTIONS, POST', 'Access-Control-Allow-Credentials': 'true', 'Content-Length': '178', 'Content-Type': 'text/html', 'Server': 'gunicorn/19.9.0', 'Connection': 'keep-alive', 'Access-Control-Allow-Origin': '*', 'Date': 'Thu, 16 Apr 2020 06:17:00 GMT'}
文本内容
测试post{
"args": {},
"data": "",
"files": {},
"form": {
"key1": "value1",
"key2": "value2"
},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Content-Length": "23",
"Content-Type": "application/x-www-form-urlencoded",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.23.0",
"X-Amzn-Trace-Id": "Root=1-5e97f85d-a25589248bed0d9cae98419c"
},
"json": null,
"origin": "117.162.175.151",
"url": "http://httpbin.org/post"
}
测试post{
"args": {},
"data": "ABC",
"files": {},
"form": {},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Content-Length": "3",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.23.0",
"X-Amzn-Trace-Id": "Root=1-5e97f85f-50fde59a01623de670cebb50"
},
"json": null,
"origin": "117.162.175.151",
"url": "http://httpbin.org/post"
}
测试put<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<title>405 Method Not Allowed</title>
<h1>Method Not Allowed</h1>
<p>The method is not allowed for the requested URL.</p>