文章目录
- 1、导入urllib库
- 2、get方式访问
- 3、post方式访问
- 4、超时处理
- 5、网页相关信息
- 6、模拟浏览器
urllib库主要用于操作网页URL并对网页内容进行抓取,通常我们用Python进行爬虫会用到。这里对部分功能进行简单说明以便后面进行爬虫。
1、导入urllib库
# 由于我们爬虫并不需要用到整个urllib,所以下面仅导入部分需要的
import urllib.request # 用于发起请求
import urllib.parse # 用于解析url
import urllib.error # 导入可能抛出的异常以便捕获
# 目前版本针对https需要安全证书,所以需要导入ssl并执行下面语句
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
2、get方式访问
# 使用urlopen()默认使用get请求,返回一个HTML
response = urllib.request.urlopen("http://www.baidu.com")
# read()是读取整个HTML,此外还有readline()读取一行,readlines()读取所有并返回列表
# decode()将内容解码为utf-8
print(response.read().decode("utf-8"))
运行结果:就是百度首页HTML源码
3、post方式访问
# post请求可以携带表单数据
# 需要将数据data进行解析。先利用parse的urlencode将其编码,再利用bytes将其转为utf-8字节流。
data = bytes(urllib.parse.urlencode({"username": "小白", "password": "123456"}), encoding="utf-8")
# http://httpbin.org/post是一个HTTP测试网站
response = urllib.request.urlopen("http://httpbin.org/post", data=data)
print(response.read().decode("utf-8"))
运行结果:
说明一下:
这里使用的网址是http://httpbin.org/post
,它是由httpbin提供的测试网址。
我们可以利用里面提供的方法对我们的请求进行测试,例如这里使用了它提供的post请求。
当我们点击Try it out
,然后点击Excute
后,实际上就是浏览器对链接http://httpbin.org/post
进行了POST请求,而下面Response body
就是服务器给我们浏览器的响应。
4、超时处理
现实中的爬虫可能由于网络波动或是被网站阻止等意外情况,导致速度很慢之类的,所以对请求时间进行限制,当超过某个时间就先跳过当前爬取。这只需要添加一个参数即可。
# 超时处理(使用get测试):利用timeout参数设置为0.01秒超时,超时会抛出URLError异常。
try:
response = urllib.request.urlopen("http://httpbin.org/get", timeout=0.01)
print(response.read().decode("utf-8"))
except urllib.error.URLError as e:
print("超时")
5、网页相关信息
针对每个请求,服务器都会有响应的状态码、响应头部等,我们可以从返回值中直接读取。
# 获取网页信息
response = urllib.request.urlopen("http://baidu.com")
print(response.status) # 状态码 200 表示成功,404 表示找不到网页,418 表示拒绝爬虫
print(response.getheaders()) # 获取响应头
print(response.getheader("Server")) # 获取响应头某个参数
6、模拟浏览器
# 模拟浏览器
url = "https://www.douban.com"
# 这是添加请求头部用以模拟浏览器
headers = {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36"
}
# 豆瓣是Get方式
# 用POST是这样:urllib.request.Request(url=url, data=data, headers=headers, method="POST")
req = urllib.request.Request(url=url, headers=headers) # 默认是Get
response = urllib.request.urlopen(req)
print(response.read().decode("utf-8"))
注意:https的请求需要导入ssl
模块,并执行ssl._create_default_https_context = ssl._create_unverified_context
说明一下:
请求头部里包含的是我们对目标URL发起请求所提供的信息,其中User-Agent
表示用户代理,即我们是用什么来访问的,我们如果不添加headers的User-Agent
就会暴露我们是python-urllib 3.9
爬虫。