文章目录

  • 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源码

python 调用当前文件夹下的文件夹 python调用lib文件_Python

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"))

运行结果:

python 调用当前文件夹下的文件夹 python调用lib文件_HTML_02

说明一下

这里使用的网址是http://httpbin.org/post,它是由httpbin提供的测试网址。

python 调用当前文件夹下的文件夹 python调用lib文件_python_03

我们可以利用里面提供的方法对我们的请求进行测试,例如这里使用了它提供的post请求。

python 调用当前文件夹下的文件夹 python调用lib文件_python_04

当我们点击Try it out,然后点击Excute后,实际上就是浏览器对链接http://httpbin.org/post进行了POST请求,而下面Response body就是服务器给我们浏览器的响应。

python 调用当前文件夹下的文件夹 python调用lib文件_HTML_05

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爬虫。

python 调用当前文件夹下的文件夹 python调用lib文件_urllib_06