下班了,学一点Python爬虫 第一天基本库的使用(urllib)

260 阅读2分钟

这是我参与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'))

截屏2022-01-26 下午8.23.14.png

分别是响应状态吗,请求头信息,请求头信息的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

今天就学到这里,不得不说一句,崔老师的书真厚啊,不知道什么时候可以看完 祝大家节日快乐还有四天放假了