Day 1
http协议
- 概念:就是服务器和客户端进行数据交互的一种形式
常用的请求头信息
- User-Agent: 请求载体的身份标识
- Connection: 请求完毕后是断开连接还是保持连接
常有的响应头信息
-Content-Type: 服务器响应回客户端的数据类型
https协议
- 安全的超文本传输协议,(传输数据时有加密)
加密方式
- 对称密匙加密(弊端:传输时很有可能被第三方机构拦截密匙和数据)
- 非对称 (服务器发送公钥给客户端,服务器自己有私钥解密,缺点 1.效率低, 2.第三方拦截公钥再发送给客户端)
- 证书密匙加密 (https)(证书机构给公钥认证,再发给客户端)
模块
- urllib模块
- requests模块
requests模块:python原生模块,功能强大,效率极高
作用:模拟浏览器发送请求
如何使用:(requests模块编码流程)
- 指定url
- 发起请求
- 获取响应数据
- 持久化存储
局部刷新
- 数据解析(还未学)
- 阿贾克斯请求(ajax请求)(1.百度翻译破解,2.肯德基地址查询,3药监局数据爬取(已改,ajax请求参为随机参数))
注 - 携带参数的url用字典进行封装
- 进行UA伪装
- 正则表达式 批量加引号 ( (.*?): (.*) ) ( "$1": "$2", ) 或者ctrl+alt+shift选取多个光标加引号(第一步crtl+r,选定区域,加入正则表达式 (.*?):(.*),替换为'$1':'$2',,再勾选match case和regex以及in selec,就可以了)
- 字典参数中键值不能有空格否则得到的是一个空列表
- 如果相关数据爬取后是乱码,说明是动态数据,可能是ajax数据
Day 2
聚焦爬虫
-爬取页面中指定信息
- 正则(看是白月黑羽好吧,难怪我搜不到)(1.百度贴吧图片爬取)
- bs4(1. 诗词名句网章节内容爬取)
- xpath(重点)(1.彼岸网图片爬取, 2.全国城市名称爬取, 3.58二手房名称爬取,4,站长简历模板数据爬取)
- 解析的局部内容都会在标签之间或者标签对应的属性中
- 进行指定标签的定位
- 标签或标签对应的属性值进行提取(解析)
编写流程
- 指定url
- 发起请求
- 获取响应数据
--数据解析
- 持久化存储
正则(练习网站 www.regex101.com)(其他语言通用)
ex = ''
https://file.izuiyou.com/img/view/id/1991059917
bs4
- 实例化一个BeautifulSoup对象,并且将页面源码数据加载到该对象中
- 通过调用BeautifulSoup对象中相关属性或者方法进行标签定位和数据提取
- 对象实例化:
- 将本地的html文档中的数据加载到该对象中
fp = open('文件名', 'r', encoding='utf-8')
soup = BeautifulSoup(fp, lxml)
- 将互联网上获取的页面源码加载到该对象中
page_text = response.text
soup = BeautifulSoup(page_text, 'lxml')
# print(soup)
# print(soup.a)
# soup.tagName 返回的是html中第一次出现的tagName标签
# print(soup.div)
# print(soup.find('div')) # 相当于soup.div
# print(soup.find('div', class_='song'))
# print(soup.find_all('a')) # f返回的是所有标签 (列表)
# print(soup.select('.tang')) # select('id, class, 标签...选择器) '),返回的是一个列表
# print(soup.select('.tang > ul > li > a')[0]) # 层级选择器 > 表示的是一个层级
# print(soup.select('.tang > ul a')[0]) 空格 ‘ ’空格表示多个层级
# print(soup.select('.tang > ul > li > a')[0].text/string/get_text())
# text/get_text() : 可以获取某一个标签中的所有文本内容(可以不是直系标签文本内容)
# print(soup.find('div', class_='song').string)
# string : 只能获取标签下的直系文本内容
# print(soup.select('.tang > ul a')[0]['href']) 获取标签中的属性值
Day 3
乱码可以参考page_text = page_text.content.decode('utf-8')
出现乱码的,分别在12行和24行最后加上‘.encode('ISO-8859-1')’
我也用的笔趣阁,要注意获取相应数据前要编码,用gb18030,否则中文乱码
Xpath(返回的是一个列表)
- 实例化一个etree的对象,且需要被解析的页面源码数据加载到该对象中。
- 调用etree对象中的xpath方法结合着xpath表达式实现标签的定位和内容的捕获
- /:表示从根节点开始定位,表示的是一个层级
- //:表示多个层级, (在最左侧时表示从任意位置开始定位)
- 属性定位: //div[@attrName="attrValue"]
- 索引定位: //div[@class = "song"]/p[3] (索引从1开始)
- 取文本
- /text()获取的是标签中直系的文本内容
- //text()获取的是标签中非直系的文本内容(所有的文本内容)
- 取属性
-//div[@class="song"]/img/@src (img/@src)
tree.xpath('//section[@class="list"]//div[@class="property-content-title"]/h3/@title')(58同城二手房名字xpath路径)
推荐一个浏览器插件 XPath Helper ,可以直接获取元素xpath路径
copyxpath
注
- 乱码问题用 .encode('iso-8859-1').decode('gbk') 或 encoding = 'utf-8'
//*[@id="main"]/div[3]/ul/li[1]/a/img
//*[@id="container"]/div[1]/a
- 当编码格式一样是仍然无法解决时,requests请求返回用.content,可以解决中文乱码问题。
- 抓包工具中的代码可能和网页源码不一样,这时候需要打开网页源码来写xpath
Day 4
验证码识别(超级鹰,python自带库 : ddddorc , tesseract)
2022/6/13摸索出来了pytesseract登陆古诗文网的方法,详细请看我这一天发的评论
模拟登录编码流程 (1.古诗文网登录(带验证码,以及登录后的页面数据对应的二次页面数据爬取))
- 验证码的识别,获取验证码图片的文字数据
- 对post请求进行发送,(处理请求参数)
- 对响应数据进行持久化存储
注
- 使用抓包工具时要勾选 Preserve log ,找到 login
http/https协议特性: 无状态
没有请求到对应的页面数据原因:
发起的第二次请求基于个人主页页面请求的时候,服务器端并不知道该请求是基于登录状态下的qingq
cookie :用来让服务器端记录客户端的相关状态 (古诗文网是:collect.aspx)
- 手动处理:通过抓包工具将该值封装到headers中。(不建议)
- 自动处理: - cookie值是来自哪里?
- 模拟登录post请求后,由服务器创建。
session会话对象:
- 作用:
1 可以进行请求的发送
2 如果请求过程中产生了cookie,则该cookie会被自动村春/携带在该session对象中
- 使用session对象进行模拟登录post请求的发送(cookie就会被自动存储在session中)
- session对象对个人主页对应的get请求进行发送(携带了cookie)
代理 :破解封ip这种反爬机制
什么是代理 :
- 代理服务器 (客户端——代理服务器——服务器网站)
代理的作用 :
- 突破自身ip访问的限制。(访问一些自身ip不能访问的网站)
- 隐藏自身真实ip
代理ip的类型:
- http :应用到http协议中
- https :应用到https协议中
代理相关网站:
- 快代理
- 西祠代理(已挂)
- www.goubanjia.com
http://free-proxy.cz/zh/ 有梯子可以上这个网站,里面有很多的国外ip,不过大多数都很慢
芝麻HTTP还行,一开始有赠送20,使用最便宜的那个一次才0.04
代理ip的匿名度 :
- 透明:服务器知道该次请求使用了代理,也知道请求对应的真实的ip
- 匿名:知道使用了代理,不知道真实ip
- 高匿:不知道使用了代理, 更不知道真实的ip
注
- 3.7版本以后 代理IP的使用方法为:proxies={'http':'http://代理地址' https同理}
Day5
异步爬虫 (梨视频网站爬取 (CSDN搜索用户 [ 25 ' h],我已完成,有详细讲解21年7月)
(注;视频对应动态刷新为ajax请求,且可能存在反扒机制(偷换网页连接中的数值),需要从主页面中获取数值id,再发送一个ajax请求,
并且这个ajax请求需要主页面中获取的数值id (携带随机参数的可以用random.random(),来获取)并且,headers中需要加上(Referer : 本页面链接)
方式
- 多线程,多进程(不建议使用)
好处:可以为相关阻塞的操作单独开启线程或进程,阻塞操作就可以异步执行
弊端:无法无限制的开启多线程或多进程 (一个进程可以有多个线程)进程可以看作火车,线程可以看作一节节的车厢,线程不能脱离进程存在,后续还有协程等概念
- 进程池,线程池(适当使用)
好处:可以降低系统对进程或者线程创建和销毁的一个频率。
弊端:池中线程或者进程的数量是有上限的
二者的不同之处就是前者应用于线程后者主要应用于进程,而它们实现并行化操作的关键则是map函数。
弹幕:multprocessing 是进程库,thread才是线程库
https://video.pearvideo.com/mp4/third/20220715/cont-1767555-13186476-154718-hd.mp4
https://video.pearvideo.com/mp4/third/20220715/1657941718345-13186476-154718-hd.mp4
'mrd': str(random.random())
'Referer': 'https://www.pearvideo.com/video_' + id_
https://video.pearvideo.com/mp4/third/20220715/cont-1767518-12033417-100958-hd.mp4
https://video.pearvideo.com/mp4/third/20220715/con-1767518-12033417-100958-hd.mp4
携程 (反复横跳)
- greelet.早期模块
- yield关键字
- asyncio装饰器(>=3.4)
- async, await关键字(推荐)
事件循环
# 生成一个事件循环
loop = asyncio.get_event_loop() (死循环)
# 将任务放到任务列表
loop.run_until_complete(任务))