爬虫必备技术
面向具有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) 反序列化
三、数据解析方式之xpath
xpath属于xml/html解析数据的一种方式, 基于元素(Element)的树形结构(Node > Element)。选择某一元素时,根据元素的路径选择,如 /html/head/title获取标签。
3.1 绝对路径
从根标签开始,按tree结构依次向下查询。
如 /html/body/table/tbody/tr。
3.2 相对路径
相对路径即是从当前某一个元素下开始查找,写法如下
相对于整个文档
//img
查找出文档中所有的标签元素
相对于当前节点
//table
假如当前节点是, 查找它的
的路径的写法
.//img
3.3 数据提取
提取文本
//title/text()
提取属性
//img/@href
3.4 位置条件
获取网页中的数据类型与字符集, 获取第一个标签
//meta[1]//@content
获取最后一个标签
//meta[last()]//@content
获取倒数第二个标签
//meta[position()-2]//@content
获取前三个标签
//meta[position()<3]//@content
3.5 属性条件
查找 class为circle-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对象的方法或属性
value = element.get('属性名')
text = element.text # 获取标签中文本,如千锋教育中的文本信息
children = element.xpath('相对xpath路径') # 获取它的子元素标签
四、考一考
写出urllib库的请求处理器有哪些类(尽量写全路径)
写出json.loads()和pickle.loads()返回的数据类型
写出pymysql的cursor.execute()方法中的参数及作用
把你们的答案可以写到评伦区,我会在后继统一回复。