这是我参与2022首次更文挑战的第9天,活动详情查看:2022首次更文挑战」
前几天都是react,做了一周,学了基本的语法,SharePoint webpart的开发流程,做的正开心呢,结果,今天一个会告诉我,都做了一周了,还做不出来,别做了.那只好,学点别的了,正好买了崔庆才老师的新书,跟着他学学爬虫.
urllib 的使用
文章的第一段,就说Python的强大之处,就是提供了功能齐全的类库,来帮助我们实现需求.最基本的http库有urllib,requests,httpx 等
文章我就不抄了,就是说,urllib利用它可以实现Http请求的发送. 分为四个模块
- request 基本请求
- error 负责异常处理
- parse 工具模块,提供了许多URL党的处理方法(拆分,解析,合并)
- robotparser 识别网站的rebots.txt 文件
发送请求
利用urllib的request模块,发送请求,在这里我就踩了第一个和第二个坑.
- 第一个问题import包导错了,明明书上写的,在Python2中 有urllib2和urllib两个库,Python3中,urllib2合并成了urllib,结果导入的时候提示我有个urllib3,我没动脑子导错了.
- 第二个问题,我把网址输成了,www.baidu.com 报错提示我地址有问题,注意加上https://
- 第三个问题,加上之后,提示我ssl有问题,我想这是我没证书呗,去掉s 解决代码如下
import urllib.request
response = urllib.request.urlopen("http://www.baidu.com")
print(response.read().decode("utf-8"))
关于第三个问题,有三种方式解决
- 去掉s 这玩意不建议,太笨了
- 全局关掉证书
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
- 将context传入url函数的context参数中,比如
import ssl
context = ssl._create_unverified_context()
urllib.urlopen('目标网址',context=context).read()
查看响应类型
print(type(response)) 可以看到<class 'http.client.HTTPResponse'>,
响应是一个HTTPResponse类型的对象
print(response.status)
print(response.getheaders())
print(response.getheader('Server'))
分别是响应状态吗,请求头信息,请求头信息的Server的值
data参数
添加参数,需要使用bytes方法,将参数化为字节流编码格式,即bytes类型,而有参数也说明这不在是get请求,是post请求了
import urllib.request
import urllib.parse
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
data = bytes(urllib.parse.urlencode({'name':'flynt'}),encoding="utf-8")
response = urllib.request.urlopen("https://www.httpbin.org/post",data=data)
print(response.read().decode("utf-8"))
给了参数,下面是响应
{
"args": {},
"data": "",
"files": {},
"form": {
"name": "flynt"
},
"headers": {
"Accept-Encoding": "identity",
"Content-Length": "10",
"Content-Type": "application/x-www-form-urlencoded",
"Host": "www.httpbin.org",
"User-Agent": "Python-urllib/3.10",
"X-Amzn-Trace-Id": "Root=1-61f13fbd-2ea27f1b27b659b423e162bd"
},
"json": null,
"origin": "103.144.149.196",
"url": "https://www.httpbin.org/post"
}
传递了一个参数,name,值是flynt,需要转成bytes类型,需要用到urllib.parse.urlencode方法将字典参数转变为字符串;第二个参数用于指定编码格式utf-8
今天就学到这里,不得不说一句,崔老师的书真厚啊,不知道什么时候可以看完 祝大家节日快乐还有四天放假了