参考‘逆風的薔薇’的教程,《Python3爬虫》-伪装浏览器
关于fiddler等抓包工具的使用,这里不再赘述。
代码
'''
以自定义网页请求报头的形式伪装成浏览器向服务器发出请求
'''
import urllib.request
# import ssl
# ssl._create_default_https_context = ssl._create_unverified_context
def saveFile(data):
path = r'E:\Python\VSCode_Python\CSDN\project\02_douban.out'
f = open(path, 'wb')
f.write(data)
''' 向磁盘写入数据,需要为bytes-like object,也即是utf-8编码的数据,经过encode处理即可得到
如果是unicode编码的数据,则是str对象,无法写入 '''
f.close()
url = 'https://www.douban.com/'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3141.7 Safari/537.36'}
# 浏览器一般用User-Agent来表明自己的身份
req = urllib.request.Request(url, headers = headers) # 由于要自定义请求报头,因此必须实例化一个Request对象
# class urllib.request.Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None)
# 可以看出url是一个必选参数,headers是一个默认参数,默认值是空{},因此在传递headers时必须制定其参数名称,否则会传递给data
res = urllib.request.urlopen(req) # 打开一个具有headers的请求
data = res.read()
# data = data.decode()
# data = data.encode('utf-16')
# 以utf-16编码来存储,可以看到文件大了几乎一倍
saveFile(data) # 保存的数据需要是utf-8编码,以节省内存
data = data.decode('utf-8') # 将utf-8编码的数据转换为unicode编码
'''
decode 解码,子编码(utf-8, utf-16, gbk)转换成父编码(unicode)
encode 编码,unicode转换成子编码
'''
print(data)
print(type(res))
print(res.geturl())
print(res.info())
print(res.getcode())
运行结果
程序运行结果如下:
生成的02_douban.out如下:
笔记
- 伪装浏览器请求的关键是headers,其中浏览器以User-Agent来表明自身身份,可以通过fiddler抓包工具来获取。
- 在实例化一个Request对象时需要注意相关参数的声明,headers是一个默认参数。可以参考官方文档urllib.request
- 保存数据时需要注意编码,一般都以utf-8编码格式来存储,而打印时则一般解码为unicode,可以通过encode和decode来实现。
- 关于编码部分的知识可以参考廖雪峰老师的教程字符串和编码
- 在某次调试中,控制台报出了SSL未确认的问题,加入下面两行代码解决。可是在第二天再次调试的时候又没有此问题了,具体原因暂时不太清楚。【SSL和TLS协议不太清楚,,,以后慢慢学习】
import ssl
ssl._create_default_https_context = ssl._create_unverified_context