爬虫网络请求模块
步骤
- 发出请求
获取响应
解析响应
一、urllib
python内置的网络请求模块
版本
- python2 :urllib2、urllib
python3 :把urllib和urllib2合并
学习意义
- 1.有些比较老的爬虫项目就是这个技术
- 2.有的时候我们去怕一些数据需要reque+urlib模块进行配合
- 3.内置的
导包注意
- 直接import urllib不行的话,就一个一个像这样导urllib.request
(一)请求并获取urllib.request
request.Request(url,headers)
创建请求对象
- get请求: req=urllib.request.Request(url,headers)
- post请求: req=urllib.request.Request(url,data,headers)
- data必须是字节流bytes, 是由字典通过parse.urlencode()转化为str,再通过bytes()转化为bytes字节流
request.urlopen(req)
想网站发起请求,并获取响应对象
- urllib.request.urlopen(‘网址’),可以直接填网址,但不能添加headers,不好反反爬
- urllib.request.urlopen(req),请求对象自带headers就行
request.urlretrive(url,'文件名')
将请求链接直接下载保存为文件
- 一般用于图片下载
- 不能添加headers
(二)处理编码urlib.parse
parse.urlencode(wd)
编码url的中文字段
- wd 参数是字典 ,key是链接中“=”的左边关键字,value是链接中“=”的右边中文字
作用
- url 汉字要进行编码,网址到编辑器就会变成十六进制+%(三个%之间表示一个汉字),因为机器无法识别汉字,需要进行编码
- 如果你把网址的十六进制改为中文,就会报错
parse.quote(wd)
编码url的中文字段
- wd是字符串,不带关键字,直接将中文字符串转成编码
parse.unquote(wd)
解码十六进制+%
- wd是字符串,不带关键字,直接将中文字符串转成编码
作用
- 有的时候爬下来的链接http后面全都是十六进制+%,这个时候就需要把它转化为正常的链接
(三)对响应对象操作
定义
- response = request.urlopen(req) 获取的响应对象
- 没有text、content方法
区分
- get响应对象:<class ‘http.client.HTTPResponse’>
- post响应对象:<class ‘urllib.request.Request’>
response.read()
读取html信息
- 返回的是bytes
- response.read().decode(‘utf-8’) 将返回的内容转化为字符串,并显现出中文字
- 数据获取的是少量bytes,非图片链接
- 说明被反爬了,并进一步观察是否要添加修改headers信息