目录
(2)发送请求:
前言
python爬虫(进阶):https://blog.csdn.net/qwerdftgu/article/details/120136508
提示:以下是本篇文章正文内容,下面案例可供参考
一、爬虫基础
1.爬虫流程:
- url -----> 发起请求 ------->获取响应 ------->解析响应 -------->保存数据(文件、数据库)
2.htttp/https协议复习:
- 区别:https比http更安全,但是性能更低!
- HTTP:超文本传输协议,默认端口号80
-
HTTPS:HTTP + SSL(安全套接字层),默认端口号443,SSL对传输的内容(也就是请求体或响应体)进行加密!!
3.爬虫特别关注的请求头和响应头:
(1)请求头:后3个最重要
- host : 域名
- Connection : keep-alive(长连接)--->每次TCP连接/释放都需要三次/四次握手,我们让它一直处于连接状态,就只需要一次连接和释放!!!
- Upgrade-Insecure-Requests: 升级为 https请求
- User-Agent : 用户代理,表明自己的身份(通常通过这个模仿浏览器访问服务器,羊皮)
- Referer: 页面跳转处(从那个页面跳转过来的),有些网站可能用这个来检测是不是爬虫;防盗链(图片/视频)----->你直接复制这个图片的链接到其他地方时,图片将显示不了!
- Cookie: 状态保持,通常用于判断用户和其权限!像有些推送就是通过识别Cookie来进行的。
(2)响应头:
- 只关注Set-Cookie : 对方服务器设置cookie到用户浏览器的缓存!!!
(3)常见的响应码:
- 200:成功 302:跳转 403:资源不可用 404:找不到该页面
- 503:服务器由于维护或者负载过重未能响应,有可能是因为爬虫频繁访问url,使服务器忽视爬虫请求,最终返回503响应码。
(4)浏览器请求过程与爬虫的区别:
-
浏览器:发送所有请求,进行渲染! 因为返回的HTML静态文件中会引用其他数据,这些数据又是一个个url!
-
爬虫:只发送指定请求,不会渲染!
-
三部分:骨骼(HTML静态文件) ------> 肌肉(js/ajax请求) -------> 皮肤(css/font/图片等)
4.requests模块
(1)基础:
- response.text 和 response.content的区别:
requests.text: 类型:str 解码类型:requests模块------>推测!
requests.content: 类型:bytes 解码类型:没有指定
2.response.content进行decode,来解决中文乱码:
response.content.decode() 默认utf-8
response.content.decode(‘GBK’)
3.response响应对象的其它常用属性或方法:
response.url # 响应的url,有时候响应的url和请求的url不相同
response.staus_code # 响应状态码
response.requests.header # 响应对应的请求头
response.header # 响应头
response.request._cookies # 响应对应请求的cookies;返回cookiesJar类型
response.cookies # 响应的cookies;经过了set-cookies动作;
response.json() # 自动将json字符串类型的响应内容转换为python对象(dict or list)
(2)发送请求:
- 发送带header的请求: 当我们以爬虫的身份去请求和加上header模拟浏览器去请求,获得的数据可能是不相同的!!!!
requests.get(url, header={})
- 通过params携带参数字典
requests.get(url, header=header, params=kw)
- 在header中携带cookie:cookies的目的是状态保持和用户鉴别!
- cookies参数的使用:
# 将cookies字符串转换为cookies参数所需的字典:
cookies_dict = { cookies.split('=')[0] : cookies.split('=')[-1] for cookie in cookies_str.split(';')}
requests.get(url, header=header, cookies=cookies_dict)
# cookieJar对象转换为cookies字典:
dict_cookies = requests.utils.dict_from_cookiejar(response.cookies)
- 注意:cookie一般是有过期时间的,一旦过期需要重新获取!!
(3)超时参数timeout的使用:
在爬虫中,一个请求很久没有结果,就会让整个项目的效率变得非常低,这个时候我们就需要对请求进行强制要求,让他必须在特定的时间内返回结果,否则就报错。、
# 超时参数timeout的使用
response = requests.get(url , timeout=3) # 单位是秒,发送请求后,3秒内返回响应,否则就抛出异常!
(4)代理proxies的使用:
- 含义:
代理ip是一个ip,指向的是一个代理服务器,代理服务器能够帮我们向目标服务器发送请求,起中转作用;
分为:正向代理和反向代理 - 分类:
透明
匿名
高匿 ---->让别根本无法发现你是代理ip,是我们使用爬虫最好的选择!!!
(5)使用verify参数忽略CA证书
因为一些网站上的CA证书是未认证的,而我们在发送请求时,requests会默认对其CA证书进行对比认证,此时可能会报错,请求不成功!只需要忽略其CA证书即可!
response = requests.get(url, verify=False) # 一般默认是True!
(6)发送POST请求:
- 实现方法:
requests.post(url, data)
# data是一个字典
- post数据来源!!!
1.固定值 抓包比较不变值
2.输入值 抓包比较根据自身变化的值
3.预设值 {
* 静态文件 需要提前从HTML中获取
* 发请求 需要提前对指定地址发送请求获取
}
4.在客户端生成的------> 最难!!!!
-
实例:实现爬虫模拟金山翻译:(未做完)
import requests class King(object): def __init__(self, word): self.url = 'https://ifanyi.iciba.com/index.php?' self.headers = { 'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Mobile Safari/537.36 Edg/92.0.902.55' } self.word = word self.data = { 'from': 'en', 'to': 'zh', 'q': self.word } def get_data(self): response = requests.post(self.url, headers=self.headers, data=self.data) return response.content def run(self): response = self.get_data() print(response) if __name__ == '__main__': king = King('Chain') king.run()
(7)利用requests.session进行状态保持
requests模块中的Session类能够自动处理发送请求获取响应过程中产生的cookie,进而达到状态保持的目的。
- requests.session的作用:
自动处理cookie,即下一次会带上前一次的cookkie - 应用场景:
自动处理连续多次请求过程中产生的cookie
requests.session使用方法:
session = requests.session() # 实例化session对象
response = session.get(url, header, ..)
response = session.post(url, data, ...)
5.数据提取:
(1)概要:
- 结构化:信息能够用数据或统一的结构加以表示!
json数据(高频出现):
json模块
re模块 //处理
jsonpath模块(json模块的一些补充)
xml数据(低频出现):
re模块 --->正则表达式
lxml模块 --->xpath语法
- 非结构化:无法用数字或统一的结构表示,如文本、图像、声音、网页等信息
html:
re模块 **重点**
lxml模块 **重点**
beautifulsoup{
-正则表达式
-xpath
-css选择器
pyquery ---->css选择器
- xml与html
xml:一种可扩展标记语言,样子和html很像,功能更专注于对传输和存储数据,它与html一点不同是:xml的标签可以自己定义
区别:
数据格式 描述 设计目的 XML 可扩展标记语言 被设计为传输和存储数据,其焦点是数据内容 HTML 超文本标记语言 显示数据以及然后更好显示数据
(2)jsonpath模块:
1.场景:
多层次嵌套的复杂字典直接提取数据
2.安装:
pip install jsonpath
3.使用:
from jsonpath import jsonpath
ret = jsonpath(a, 'jsonpath语法规则字符串')
jsonpath和json一般一起使用!!!
4.语法:
$ 根节点(最外层的大括号)
. 子节点
.. 内部任意位置,子孙节点
其它语法及示例:链接from jsonpath import jsonpath data = {'key1':{'key2':{'key3':{'key4':'python'}}}} # 注意:jsonpath的结果为列表,获取数据需要索引!! print(jsonpath(data, '$..key4')[0]) # 与上面的无关:获取根节点下所有key为name的值: list = jsonpath(data, '$..name')
(3) lxml模块:
-
处理html/xml格式内容时需要用到lxml模块和xpath语法:
-
xpath helper的安装与使用:
-
1.安装:
是Google浏览器的插件,需要到Google应用商店下载,或者去网上找方法下载
2.作用:
对当前页面测试xpath语法规则,可以直接在网页上运行xpath语句,更直观快捷。
-
-
xpath语法:
下面所说的元素,标签和节点都是指同样的东西!!!
1.基础节点选择语法:
表达式 描述 nodename 选中该元素 / 从根节点选取、或者是元素和元素间的过滤,相对于整个文本 // 从匹配选择的当前节点选择文档中的节点,而不考虑他们的位置 . 选择当前节点 .. 选取当前节点的父节点 @ 选取属性 text() 选取文本 eg:
//title/text() 从开闭标签中选取文本内容
//link/@href 从选中的节点标签中获取指定属性的值2.节点修饰语法:选取特定节点
- 通过索引修饰节点&#x