Python 学习 01 —— Python基础
Python 库学习 —— urllib 学习
Python 库学习 —— BeautifulSoup4学习
Python 库学习 —— Re 正则表达式
Python 库学习 —— Excel存储(xlwt、xlrd)
Python 学习 02 —— Python爬虫
Python 库学习 —— Flask 基础学习
Python 学习03 —— 爬虫网站项目
urllib库主要用于操作网页URL并对网页内容进行抓取,通常我们用Python进行爬虫会用到。这里对部分功能进行简单说明以便后面进行爬虫。
# 由于我们爬虫并不需要用到整个urllib,所以下面仅导入部分需要的
import urllib.request # 用于发起请求
import urllib.parse # 用于解析url
import urllib.error # 导入可能抛出的异常以便捕获
# 目前版本针对https需要安全证书,所以需要导入ssl并执行下面语句
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
# 使用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源码
# 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
就是服务器给我们浏览器的响应。
现实中的爬虫可能由于网络波动或是被网站阻止等意外情况,导致速度很慢之类的,所以对请求时间进行限制,当超过某个时间就先跳过当前爬取。这只需要添加一个参数即可。
# 超时处理(使用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("超时")
针对每个请求,服务器都会有响应的状态码、响应头部等,我们可以从返回值中直接读取。
# 获取网页信息
response = urllib.request.urlopen("http://baidu.com")
print(response.status) # 状态码 200 表示成功,404 表示找不到网页,418 表示拒绝爬虫
print(response.getheaders()) # 获取响应头
print(response.getheader("Server")) # 获取响应头某个参数
# 模拟浏览器
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
爬虫。