Day1
爬虫:通过编写程序,模拟浏览器上网,然后让其去互联网上抓取数据的过程
爬虫带来的风险体现在如下两方面:
1、干扰被访网站的正常运营
2、抓取了受法律保护的特定类型数据或信息
所以:
- 时常优化自己的程序,避免干扰被访问网站的正常运行
- 在使用、传播爬取到的数据时,审查抓取到的内容,如果发现涉及到用户、商业机密等敏感内容时需要及时停止爬取或传播
http协议:服务器和客户端进行数据交互的一种形式
常用请求头信息:
- User-Agent:请求载体的身份标识
- Connection:请求完毕后,是断开还是保持连接
常用响应头信息:
Content-Type:服务器响应回客户端的数据类型
https协议:安全的http(超文本传输)协议,涉及到数据加密
加密方式:
1、对称密钥加密(钥匙和锁一块发给服务器,但不妨拦截)
2、非对称密钥加密(只有密文而没有密钥被传输,私钥一直没动,但不妨公钥被篡改)
3、整数密钥加密(数字签名防伪,已做数字签名的公钥由客户端发给服务器)
Day2
requests模块:
- urlib模块
- requests模块:python中原生的一款基于网络请求的模块,功能非常强大,简单便捷,效率极高【作用:模拟浏览器发请求】
如何使用:
- 指定url
- 发起请求
- 获取响应数据
- 持久化存储
环境安装:
pip install requests
实战编码:
简易网页采集器
UA检测(User-Agent请求载体的身份标识):门户网站的服务器会检测对应请求的载体身份标识,如果检测请求载体身份标识为某一款浏览器,说明该请求正常。但是,如果检测到请求载体身份标识不是基于某一款浏览器的,则表示该请求为不正常请求(爬虫),服务器端很有可能拒绝该次请求。
UA伪装:让爬虫对应的请求载体身份标识伪装成某一款浏览器。
破解百度翻译
F12-Network-XHR(Ajax请求,局部刷新)
细节:先打开检查,再输入dog!!
需求:破解百度翻译
- post请求(携带了参数)
- 响应数据(content-type):是一组 json 数据↓
获取响应数据方法:dic_obj = response.json()
注意:中文不能使用asc码进行编码
实测代码时会出现结果返空的情况
豆瓣电影
页面地址:https://movie.douban.com/typerank?type_name=%E5%96%9C%E5%89%A7&type=24&interval_id=100:90&action=
滚轮拖到底,页面局部更新
发送Get请求,拿到json型响应数据
代码:
检验后,start从0开始(修正)
用json格式化工具更好显示
作业
http://www.kfc.com.cn/kfccda/index.aspx
注:点击查询按钮后,地址栏没有改变,说明确实为Ajax请求(局部刷新)
综合练习之药监总局
http://scxk.nmpa.gov.cn:81/xk/
https://www.bejson.com/json/format/(在线JSON校验格式化工具,将response复制进去)
在首页中对应的企业信息数据是通过ajax动态请求到的(详情页↓)
http://scxk.nmpa.gov.cn:81/xk/itownet/portal/dzpz.jsp?id=da107d9a2a33484ba40dbd4d4fce7353只有id的值在变动
http://scxk.nmpa.gov.cn:81/xk/itownet/portal/dzpz.jsp?id=9f000a93669640018452b54350c36a0f
通过对详情页url观察:
- url的域名都是一样的,只有携带的参数(id)不一样
- id值可以从首页对应的ajax请求到的json串中获取;
- 域名和id值拼接出一个完整企业对应的详情页url
Ctrl+F搜索(0条结果),可知详情页企业的数据也是动态加载的,即无法直接通过url发请求
ctrl+shift+L 可以将代码规范化
2022 url动态加密了,反反爬需自行考虑
分页操作(详情页不需要加入循环)
Day3
数据解析概述
聚焦爬虫:爬取页面中指定的内容
数据解析分类:
- 正则
- bs4
- xpath(***)
数据解析原理概述:
- 解析的局部文本内容都会在标签之间或标签对应的属性中进行存储
- 进行指定标签的定位
- 标签或者标签对应的属性中存储的数据值进行提取(解析)
图片爬取
requests.get().content 返回二进制数据
正则解析
糗事百科网页版已经无了。。听听思路
逐个排查,找到图片对应标签
正则提取图片地址
.*? 就是正则表达式中用来匹配一切字符的
(.*? 表示匹配任意数量的重复,但是在能使整个匹配成功的前提下使用最少的重复)
re.M 单行匹配
re.S 多行匹配
注意导入os模块(import os),创建文件夹以保存所有图片
if not os.path.exists('./qiutuLibs'):
os.mkdir('./qiutuLibs)
处理分页:
page=1 url='com/%d/com' url_new=format(url%page)
print(url_new) ##可得:com/1/com
(即format 能够把pageNumber的值赋给URL里面的%d)
BS4解析
python独有的解析方式
bs4进行数据解析时,会应用到lxml解析器
将本地html文档中的数据加载到该对象中
将互联网获取的页面源码加载到对象中
提供用于数据解析的方法和属性:
层级选择器
‘>’ 表示一个层级;
‘ ’ 空格表多个层级;
测试:
小结:
实战:
网址:http://www.shicimingju.com/book/sanguoyanyi.html
(这个网站今天看已经是混乱的了,章节乱串,而且文本是直接放在div里面没有p标签 2021/8/4)
这里的page_text后面加上.text(改成content效果更好)
注:这个网站有问题,链接进去以后会跳到其他书籍,网页浏览也会跳。所以主要学思路(2022.9月 实测代码有效)
xpath解析
新版本不能直接调用 etree
需要这样 from lxml import html
etree=html.etree
解析错误的话,在meta的最后补斜杆,<meta charset="UTF-8"/>
运行结果里的那个值只是表示内存地址,跟这个地址里存储额数据无关
属性定位
xpath下标从1开始的(文本获取)
杜牧(从[‘杜牧’]列表里取出元素)
度蜜月(注意第二个并不在li的直系标签内)
取链接(属性要加@,标签不用加)
小结:
xpath和正则一样,相较于python独有的的bs4解析更具有通用性。
xpath不仅通用,理解和书写上也便捷高效
实战—58二手房
“./” 当前标签
这里如果结果为空,可去原网页刷新一下,会有“访问次数太多,要求验证”的提示,完成验证后,即可成功爬取。
4K图片解析下载
http://pic.netbian.com/4kmeinv/
全国城市名字爬取
https://www.aqistudy.cn/historydata/
原始版
改良版(‘或’运算)
作业:
爬取站长素材中免费简历模板
https://sc.chinaz.com/
Day 4
验证码识别
www.yundama/demo.html(2022用不了了,可以试试“超级鹰”)
实战:古诗文网验证码识别
https://so.gushiwen.cn/user/login.aspx?from=http://so.gushiwen.cn/user/collect.aspx
利用开发者工具能节省时间
超级鹰实测可用.2022
Day5
模拟登录实现流程梳理
https://www.renren.com
2022.人人网只有登录选项,无验证码,故继续使用古诗文网进行练习
#此处要用session请求验证码地址保存cookies后,输入验证码后才不会报错
模拟登录cookie操作
http/https协议特性:无状态
把cookie携带上(让服务器明白这是基于登录状态发起的请求)
- 手动处理:通过抓包工具获取cookie值,将该值封装到headers中(不推荐,麻烦而难以应对动态的cookie)
- 自动处理:session会话对象
作用:进行请求的发送
如果请求过程中产生了cookie,则该cookie会被自动存储/携带在该session对象中
cookie值来源:
模拟登录post请求后,由服务器端创建而成
1.创建一个session对象:
session = requests.Session( )
2.使用session对象进行模拟登录post请求的发送(cookie就会被存储在session中)
3.session对象对个人主页对应的get请求进行发送(携带cookie)
关于代理
应用:(未使用代理ip↓)
https://www.baidu.com/s?wd=ip
代理ip的类型:
http:应用到http协议对应的url中
https:应用到https协议对应的url中
代理ip的匿名度:
透明:服务器知道该次请求使用了代理,也知道请求对应的真实ip
匿名:知道使用了代理,但不知道真实ip
高匿:不知使用了代理,更不知道真实ip
requests.get中的proxies参数
Day6 异步爬虫
目的:在爬虫中使用异步实现高性能的数据爬取操作
单线程爬取的数据效率较低(等待阻塞操作完成后才进行下一步),故使用异步爬虫解决此类问题。
线程池的基本使用:
线程池案例应用:
原则:线程池处理的是阻塞且耗时的操作
注意:当前页面的所有数据,并不一定是通过链接请求得到的,有的数据可能是动态加载出来的
在response下搜索‘<video’,无返回结果,即当前页面的video数据一定是动态加载出的
2022 似乎又变回了ajax请求,videostatus中返回的json数据
弹幕:拿不到Jason数据的是因为有referer防盗链技术,同时最终得到的Jason里的是假url,要利用假url自己拼接一个真url
协程相关
弹幕:event_loop 就好比一个无限旋转的圆圈,协程对象就是连接event_loop和你要干的具体事情的中间人
注:记得先跟着把flask.py写了
Day7 selenium
简介
如何获取动态加载的数据↓
初试
下载浏览器驱动程序
http://chromedriver.storage.googleapis.com/index.html(驱动程序一定要与当前的浏览器版本一一匹配)
查看驱动和浏览器版本的映射关系
http://blog.csdn.net/huilan_same/article/details/51896672
对应即可(64位直接往下载网页的下面看就可以了,不需要找映射)
示例:http://scxk.nmpa.gov.cn:81/xk/
selenium其他自动化操作
现在用(弹幕提示)find_element(by=By.id,value="q").send_keys('避孕套')
window.scrollTo(0,document.body.scrollHeight) 注:向二维方向各自移动的像素距离
小结:
iframe处理+动作链
https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable
如果定位的标签是存在于iframe标签之中,则必须通过如下操作...↓(自嵌套内的定位)
小结:
模拟登录
https://qzone.qq.com
无头浏览器+规避检测
12306模拟登录
https://kyfw.12306.cn/otn/login/init
基于当前所显示页面的验证码图片进行,刷新后会导致验证图片发生变化。
1、使用selenium打开登录页面
2、对当前selenium打开的这张页面进行截图
3、对当前图片局部区域(验证码图片)进行裁剪(好处:将验证码图片和模拟登录一一对应)
4、使用超级鹰识别验证码图片(坐标)
利用save_screenshot将当前页面截图保存
通过验证码图片对应的↖和↘坐标确定裁剪区
12306那个很多同学截取验证码位置不对,原因是电脑的显示设置的问题,打开显示设置,将缩放与布局改成100%即可
需要先调整到全屏,然后点击账号登录,才能正常保存图片
将验证码提交给超级鹰识别即可
from selenium.webdriver import ActionChains 动作链模块
有一个“ | ” ,点两次(以此类推)
注意:点击对应的是当前打开的整张页面,而不仅仅只是验证码图片,因此需要修改参照物的作用域
录入用户名和密码
Day8
scrapy框架简介
集成多种功能、通用性强
关于环境安装:
在pycharm里面可以直接下Twisted、scrapy等(2022)
基本使用
scrapy数据解析操作
在scrapy中进行UA伪装,将之粘贴到settings文件对应位置
注意返回对象,和etree方法返回的略有不同
scrapy持久化存储
1、基于终端指令
2、基于管道
通用性更强,只是流程会略微繁琐
基于spider的全站数据爬取
将网站中某板块下的全部页码对应的页码数据进行爬取解析
案例:爬取校花网中的照片名称(该网站现在打不开)
五大核心组件
请求传参
使用场景:爬取的数据不在同一张页面
https://www.zhipin.com/web/geek/job?query=python&city=101010100
tips:
- 岗位描述返回的是列表,因此需要用join来整合拼接成字符串(这里是定义了一个parse_detail去详情页里面获取)
setting文件中加入USER_AGENT 和 改ROBOTSTXT_OBEY = False LOG_LEVEL = 'ERROR'
- 在boss.py中导入"from bosspro.items import BossproItem"。请求传参实际上传的是item类型的对象(meta)
将parse中的item传给parse_detail
开启管道:
Day9
scrapy图片爬取
https://sc.chinaz.com/tupian/
#一般设计图片的网站都会进行懒加载 所以这里的图片地址为src2
如果不能下载图片到指定目录,是因为没安装Pillow模块
关于中间件
下载中间件:批量拦截scrapy中发起的请求与响应;
中间件-处理请求
网易新闻
弹幕:获取五大板块的详情页面2022年通过xpath确实无论如何都获取不了,但是可以通过re正则去获取,这样就不需要你去修改中间件和自动化测试了。当然这样无助于你学习中间件,所以我把这条内容放在最后打出
CrawlSpider全站数据爬取
链接提取器被作用在规则解析器
现在的链接都是动态加载的(2022)
注意:xpath表达式中不可以出现tbody标签
分布式爬虫
感觉很适合团伙作战哈哈哈(调度器共享、管道共享)
settings中:
下载与操作系统匹配的redis
爬取到的数据存储在了redis的proName:items这个数据结构中
增量式爬虫