爬虫必备技术
面向具有Python基础的Python爬虫爱好者,urllib和requests两个库在实际的项目中应用也非常广泛,不仅用于爬虫技术也可以应用在API接口调用方面。如果需要相关的案例可以加我QQ(610039018),另外我在B站上已发布了相关的爬虫视频(https://www.bilibili.com/video/av93731419)。
一、urllib总结
核心的网络请求库 -> urllib
- urllib.request 模块
-
urlopen(url | request: Request, data=None) data是bytes类型
-
urlretrieve(url, filename) 下载url的资源到指定的文件
-
build_opener(*handlder) 构造浏览器对象
- opener.open(url|request, data=None) 发起请求
-
Request 构造请求的类
url='https://www.baidu.com/s' data={ 'wd': '千锋' } urlencode(data) # 结果转成'wd=%f5%e6%e6%f5%e6%e6' request = Request(url, data=urlencode(data).encode())
-
HTTPHandler HTTP协议请求处理器
-
ProxyHandler(proxies={‘http’: ‘http://proxy_ip:port’}) 代理处理
-
HTTPCookieProcessor(CookieJar())
- http.cookiejar.CookieJar 类
-
- urllib.parse模块
- quote(txt) 将中文字符串转成url编码
- urlencode(query: dict) 将参数的字典转成url编码,结果是key=value&key=value形式,即以 application/x-www-form-urlencoded作为url编码类型。
二、requests库【重点】
requests库也是一个网络请求库, 基于urllib和urllib3封装的便捷使用的网络请求库。
2.1 安装环境
pip install requests -i https://mirrors.aliyun.com/pypi/simple
2.2 核心的函数
- requests.request() 所有请求方法的基本方法
以下是request()方法的参数说明- method: str 指定请求方法, GET, POST, PUT, DELETE
- url: str 请求的资源接口(API),在RESTful规范中即是URI(统一资源标签识符)
- params: dict , 用于GET请求的查询参数(Query String params);
- data: dict , 用于POST/PUT/DELETE 请求的表单参数(Form Data)
- json: dict 用于上传json数据的参数, 封装到body(请求体)中。请求头的Content-Type默认设置为application/json
- files: dict, 结构 {‘name’: file-like-object | tuple}, 如果是tuple, 则有三种情况:
- (‘filename’, file-like-object)
- (‘filename’, file-like-object, content_type)
- (‘filename’, file-like-object, content_type, custom-headers)
指定files用于上传文件, 一般使用post请求,默认请求头的Content-Type为multipart/form-data类型。
- headers/cookies : dict
- proxies: dict , 设置代理
- auth: tuple , 用于授权的用户名和口令, 形式(‘username’, ‘pwd’)
- requests.get() 发起GET请求, 查询数据
可用参数:- url
- params
- json
- headers/cookies/auth
- requests.post() 发起POST请求, 上传/添加数据
可用参数:- url
- data/files
- json
- headers/cookies/auth
- requests.put() 发起PUT请求, 修改或更新数据
- requests.patch() HTTP幂等性的问题,可能会出现重复处理, 不建议使用。用于更新数据
- requests.delete() 发起DELETE请求,删除数据
2.3 requests.Respose
以上的请求方法返回的对象类型是Response, 对象常用的属性如下:
- status_code 响应状态码
- url 请求的url
- headers : dict 响应的头, 相对于urllib的响应对象的getheaders(),但不包含cookie。
- cookies: 可迭代的对象,元素是Cookie类对象(name, value, path)
- text : 响应的文本信息
- content: 响应的字节数据
- encoding: 响应数据的编码字符集, 如utf-8, gbk, gb2312
- json(): 如果响应数据类型为application/json,则将响应的数据进行反序化成python的list或dict对象。
- 扩展-javascript的序列化和反序列化
- JSON.stringify(obj) 序列化
- JSON.parse(text) 反序列化
- 扩展-javascript的序列化和反序列化
三、数据解析方式之xpath
xpath属于xml/html解析数据的一种方式, 基于元素(Element)的树形结构(Node > Element)。选择某一元素时,根据元素的路径选择,如 /html/head/title获取
3.1 绝对路径
从根标签开始,按tree结构依次向下查询。
如 /html/body/table/tbody/tr
。
3.2 相对路径
相对路径即是从当前某一个元素下开始查找,写法如下
- 相对于整个文档
//img
查找出文档中所有的<img>
标签元素 - 相对于当前节点
//table
- 假如当前节点是, 查找它的的路径的写法
.//img
3.3 数据提取
- 提取文本
//title/text()
- 提取属性
//img/@href
3.4 位置条件
- 获取网页中的数据类型与字符集, 获取第一个
<meta>
标签
//meta[1]//@content
- 获取最后一个
<meta>
标签
//meta[last()]//@content
- 获取倒数第二个
<meta>
标签
//meta[position()-2]//@content
- 获取前三个
<meta>
标签
//meta[position()<3]//@content
3.5 属性条件
- 查找 class为
circle-img
的<img>
标签
//img[@class="circle-img"]
3.6 在Python中应用
首先要安装包pip install lxml
,下面展示部分的代码片断:
from lxml import etree
root = etree.HTML('网页的内容')
element = root.xpath('xpath查找路径')
# element可能是两种类型,一是List=>[<Element>, <Element>...]
# 另一个是Element对象,下面是Element对象的方法或属性
value = element.get('属性名')
text = element.text # 获取标签中文本,如<span>千锋教育</span>中的文本信息
children = element.xpath('相对xpath路径') # 获取它的子元素标签
四、考一考
- 写出urllib库的请求处理器有哪些类(尽量写全路径)
- 写出json.loads()和pickle.loads()返回的数据类型
- 写出pymysql的cursor.execute()方法中的参数及作用
把你们的答案可以写到评伦区,我会在后继统一回复。