目录
爬虫请求模块介绍
urllib.request模块
版本
python2 :urllib2、urllib
python3 :把urllib和urllib2合并
常用的方法
- urllib.request.urlopen("网址") 作用 :向网站发起一个请求并获取响应
- 字节流 = response.read()
- 字符串 = response.read().decode("utf-8")
- urllib.request.Request("网址",headers="字典") urlopen()不支持重构User-Agent
响应对象
- read() 读取服务器响应的内容
- getcode() 返回HTTP的响应码
- geturl() 返回实际数据的URL(防止重定向问题)
urllib.parse模块
常用方法
- urlencode(字典)
- quote(字符串) (这个里面的参数是个字符串)
请求方式
- GET 特点 :查询参数在URL地址中显示
- POST
-
- 在Request方法中添加data参数 urllib.request.Request(url,data=data,headers=headers)
- data :表单数据以bytes类型提交,不能是str
requests模块
安装
- pip install requests
- 在开发工具中安装
request常用方法
- requests.get(网址)
响应对象response的方法
- response.text 返回unicode格式的数据(str)
- response.content 返回字节流数据(二进制)
- response.content.decode('utf-8') 手动进行解码
- response.url 返回url
- response.encode() = ‘编码’
requests模块发送 POST请求
cookie
cookie :通过在客户端记录的信息确定用户身份
HTTP是一种无连接协议,客户端和服务器交互仅仅限于 请求/响应过程,结束后断开,下一次请求时,服务器会认为是一个新的客户端,为了维护他们之间的连接,让服务器知道这是前一个用户发起的请求,必须在一个地方保存客户端信息。
session
session :通过在服务端记录的信息确定用户身份 这里这个session就是一个指的是会话
处理不信任的SSL证书
什么是SSL证书?
- SSL证书是数字证书的一种,类似于驾驶证、护照和营业执照的电子副本。因为配置在服务器上,也称为SSL服务器证书。SSL 证书就是遵守 SSL协议,由受信任的数字证书颁发机构CA,在验证服务器身份后颁发,具有服务器身份验证和数据传输加密功能
测试网站 国家税务总局全国增值税发票查验平台
requests 模块源码分析
1、首次获取百度贴吧主页内容
import urllib.request
import urllib.parse
name = input("请输入爬取内容:")
name1 = urllib.parse.quote(name) # 利用parse进行编码
url = f'https://tieba.baidu.com/f?ie=utf-8&kw={name1}&fr=search'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.74 Safari/537.36'
}
# 1、构建请求对象
req = urllib.request.Request(url,headers = headers)
# 2、获取对象
res = urllib.request.urlopen(req)
print(res.read().decode())
2、获取多页贴吧的内容
import urllib .request
import urllib.parse
name = input("请输入百度贴吧名称:") # 1-5,2-3
begin = int(input("请输入开始页:"))
end = int(input("请输入结束页:"))
#编码
name1 = urllib.parse.quote(name) # kw已经完成
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.74 Safari/537.36'
}
for page in range(begin,end+1): # 左闭右开
pn = (page-1)*50
# print(pn)
# 拼接URL
url = f'https://tieba.baidu.com/f?kw={name1}&pn={pn}'
print(url)
# 发请求,获取相应
req = urllib.request.Request(url,headers=headers)
# 获取相应,相应结果给response
response = urllib.request.urlopen(req)
# 获取的相应结果给了html
html = response.read().decode('utf-8')
print(html)
# 写入文件 第{page}页.html
filename = f'第{page}页.html'
with open(filename,'w',encoding='utf-8') as f:
f.write(html)
3、def函数的改写
为了增强可读性,采用def函数的改写
'''
考虑实现功能:读取页面,写入文件,主函数
'''
import urllib.request
import urllib.parse
def readPage(url): # 发请求,作相应,只是负责读取页面
# 那么就需要给页面发送请求,获得响应
# 获得响应以后就需要将响应结果拿给response接收
# 接收以后把结果给到html网页
# 最后再将获取的网页放到write下进行写入到文件里面
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.74 Safari/537.36'
}
# 发请求,获取响应
req = urllib.request.Request(url, headers=headers)
# 获取相应,响应结果给response
response = urllib.request.urlopen(req)
# 获取的响应结果给了html
html = response.read().decode('utf-8')
return html # 返回函数的调用处(def main())
def writePage(filename,html): # 将内容写入到文件里面
with open(filename, 'w', encoding='utf-8') as f:
f.write(html)
def main(): # 主要调用处
name = input("请输入百度贴吧名称:") # 1-5,2-3
begin = int(input("请输入开始页:"))
end = int(input("请输入结束页:"))
# 编码
name1 = urllib.parse.quote(name) # kw已经完成,进行编码,因为浏览器不认识中文,因此需要编码进行转换为计算机读得懂的
for page in range(begin, end + 1): # 左闭右开
pn = (page - 1) * 50
# print(pn)
# 拼接URL
url = f'https://tieba.baidu.com/f?kw={name1}&pn={pn}' # 对URL进行拼接
# 获取URL,发请求,获取相应的页面
html = readPage(url) # 函数名加()来进行调用
# 目的:获取页面的内容。将def readPage中的html得到,等价于调用里面的函数来进行使用\
# 接下来应该如何拿到html页面的内容呢?,通过(def readPage)进行return返回得到html
# 此时拿到页面以后,然后保存在def write(),然后再进行调用
filename = f'第{page}页.html'
writePage(filename, html) # 调用writePage中的文件\
main() # 最后通过调用main函数调用,完成
4、面向对象改写
利用面向对象进行改写
import urllib.request
import urllib.parse
class BaiduSpider(object):
def __init__(self):
self.headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.74 Safari/537.36'
}
# 发请求,获取响应
def readPang(self, url):
# 发请求,获取响应
req = urllib.request.Request(url, headers=self.headers)
# 获取相应,响应结果给response
response = urllib.request.urlopen(req)
# 获取的响应结果给了html
html = response.read().decode('utf-8')
return html # 返回函数的调用处(def main())
def writePang(self, filename, html):
with open(filename, 'w', encoding='utf-8') as f:
f.write(html)
def main(self):
name = input("请输入百度贴吧名称:") # 1-5,2-3
begin = int(input("请输入开始页:"))
end = int(input("请输入结束页:"))
# 编码
name1 = urllib.parse.quote(name) # kw已经完成,进行编码,因为浏览器不认识中文,因此需要编码进行转换为计算机读得懂的
for page in range(begin, end + 1): # 左闭右开
pn = (page - 1) * 50
# print(pn)
# 拼接URL
url = f'https://tieba.baidu.com/f?kw={name1}&pn={pn}' # 对URL进行拼接
# 获取URL,发请求,获取相应的页面
html = self.readPage(url) # 函数名加()来进行调用
# 目的:获取页面的内容。将def readPage中的html得到,等价于调用里面的函数来进行使用\
# 接下来应该如何拿到html页面的内容呢?,通过(def readPage)进行return返回得到html
# 此时拿到页面以后,然后保存在def write(),然后再进行调用
filename = f'第{page}页.html'
self.writePage(filename, html) # 调用writePage中的文
spider = BaiduSpider() # 调用
# 调用类里面的方法--对象,方法名
spider.main()
喜欢记得点赞喔!!!