学习嵩天老师的爬虫专题课,总结学习内容
嵩天老师慕课课程链接指路:Python网络爬虫与信息提取_中国大学MOOC(慕课) (icourse163.org)
目录
Requests库的7个主要方法
方法 | 说明 |
requests.request() | 构造一个请求对象,是基础方法 |
requests.get() | 用于获取HTML网页 |
requests.head() | 用于获取HTML网页头信息 |
requests.post() | 用于向HTML提交POST请求 |
requests.put() | 用于向HTML提交PUT请求 |
requests.patch() | 用于向HTML提交局部修改请求 |
requests.delete() | 用于向HTML提交删除请求 |
Requests库的get()方法
import requests
r = requests.get(url) # r用于接收一个包含服务器资源的Response对象
request.get(url, params=None, **kwargs)
url:拟获取页面的链接
params:url中的额外参数,用字典或者字节流格式,可选
**kwargs:12个控制访问的参数,可选
Response对象的属性
属性 | 说明 |
r.status_code | HTTP请求的返回状态,200表示连接成功 |
r.text | HTTP响应内容的字符串形式,即url对应的页面内容 |
r.encoding | 从HTTP header中猜测的响应内容编码方式 |
r.apparent_encoding | 从内容中分析出的响应内容编码方式(备选编码方式) |
r.content | HTTP响应内容的二进制形式 |
r.encoding:如果header中不存在charset字段,则接收到的返回编码为ISO-8859-1
URL位置资源的头部信息:URL位置资源的响应消息报告(资源的大概内容)
爬取网页的通用代码框架
import requests
def getHTMLText(url):
try: # 异常处理
r = request.get(url, timeout = 30)
r.raise_for_status() # 若状态码不是200, 引发HTTPError异常
r.encoding = r.apparent_encoding
return r.text # 一般会界定一个文本范围 r.text[:1000]
except:
return "产生异常"
if __name__ == "__main__":
url = "http://www.baidu.com"
print(getHTMLText(url))
HTTP协议
HTTP,Hypertext Transfer Protocol,超文本传输协议
HTTP是一个基于“请求与响应”模式的、无状态的应用层协议
用户发起请求,服务器响应;无状态:第一次和第二次请求之间没有联系
HTTP协议采用URL作为定位网络资源的标识,URL是通过HTTP协议存取资源的Internet路径,一个URL对应一个数据资源
URL格式如下:
http://host[:port][path]
三个域
host:合法的Internet主机域名或IP地址
port::端口号,缺省端口为80
path::请求资源的路径,在服务器或者主机里的内部路径http://202.181.111.188/duty 此IP地址下,duty文件夹里的资源
HTTP协议对资源的操作
GET HEAD DELETE 就是字面意思,不赘述,主要看剩下三种
方法 | 说明 |
POST | 请求向URL位置的资源后附加新的数据 |
PUT | 请求向URL位置存储一个资源,覆盖原URL位置的资源 |
PATCH | 请求局部更新URL位置的资源,即改变该处资源的部分内容 |
注意区分PATCH和PUT:
假设URL位置有一组数据UserInfo,包括UserID、UserName等20个字段
需求:用户修改了UserName,其他不变
- 采用PATCH,仅向URL提交UserName的局部更新请求
- 采用PUT,必须将所有20个字段一并提交到URL,未提交字段被删除
PATCH的最主要好处:节省网络带宽
Requests库的head()方法
r = requests.head('http://httpbin.org/get')
print(r.headers) # 展示反馈的头部信息内容,用很少的网络资源获得概要信息
Requests库的post()方法
put()方法与之类似
payload = {'key1':'value1', 'key2':'value2'} # 提交一个字典
r = requests.post('http://httpbin.org/post', data = payload)
print(r.text) # 提交键值对或者字典,会被默认放到form表单的字段下
# 如果提交一个字符串,自动编码为data,放到data字段下
r = requests.post('http://httpbin.org/post', data = 'ABC')
print(r.text)
实例
更改头部信息,模拟浏览器向服务器发起HTTP请求
r = requests.get(url)
print(r.status_code) # 503,服务器无法处理请求
print(r.request.headers)
# 'User-Agent': 'python-requests/2.26.0'
# 更改头部信息
kv = {'user-agent':'Mozilla/5.0'} # Mozilla/5.0 标准浏览器的身份标识字段
url = ""
r = requests.get(url, headers= kv) # 更改User-agent信息
print(r.status_code)
print(r.request.headers)
print(r.text[:1000])
# 全部代码
url = ""
try:
kv = {'user-agent': 'Mozilla/5.0'}
r = requests.get(url, headers= kv)
r.raise_for_status() # 判断返回的Response类型状态是不是200
r.encoding = r.apparent_encoding
print(r.text[1000:2000])
except:
print("爬取失败")
百度搜索关键词提交
用程序自动向百度搜索引擎提交关键词并获得搜索结果
百度的关键词API接口:http://www.baidu.com/s?wd=keyword
在网站上看到的人机交互方式,比如图形的,文本框的,需要点击按钮的,在正式地向后台服务器提交的时候,是以链接
的形式提交的,只要你能够去通过浏览器的解析知道向后台提交的链接形式,就可以用代码向服务器做正式的提交。
import requests
kv ={'wd':'Python'}
r = requests.get("http://www.baidu.com/s",params= kv )
print(r.status_code)
# 查看我们对百度提交的请求
print(r.request.url)
# 返回值:http://www.baidu.com/s?wd=Python
print(len(r.text))
# 1085590
网络图片的爬取和存储
#网络图片的爬取和存储
path = "D:/Develop/abc.jpg" # 本地保存地址,命名为abc
# https://www.nationalgeographic.com/ 国家地理
# 图片地址
url = "https://i.natgeofe.com/n/8626826d-18fb-4be1-b62a-454259bbd3c7/White_Rhino_to_be_Released_Over_10_Years_Brent_Stirton_and_African_Parks.jpg?w=954&h=636"
r = requests.get(url)
print(r.status_code)
# 把二进制数据(图片)保存为文件
with open (path, 'wb') as f:
f.write(r.content)
f.close()
# 全部代码
import requests
import os
url = "https://i.natgeofe.com/n/8626826d-18fb-4be1-b62a-454259bbd3c7/White_Rhino_to_be_Released_Over_10_Years_Brent_Stirton_and_African_Parks.jpg"
root = "D:/Develop//pics"
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("爬取失败")