0 爬虫概览
- 爬虫的分类 - 通用爬虫: - 聚焦爬虫: - 增量式: - 爬取图片的两种方式 - 使用requests - urllib模块request中urlretrieve - 数据解析的基本原理 - 标签的定位 - 取文本或取属性 - xpath解析原理 - 实例化etree对象,且将源码加载到该对象中 - 使用xpath方法结合着xpath表达式进行标签定位和数据提取 - 属性定位[@attrName="value"] - 索引定位:[1] - / // - 取文本: /text() //text() - 取属性:/@attrName - etree对象实例化的方式 - 本地加载:parse - 网络加载:HTML - bs4解析原理 - .tagName 单数 - find(属性定位) 单数 find('tagName',attrName="value") - find_all 复数 - Beautiful对象实例化方式 本地/网络 soup.div soup() - 面试题:如何爬取携带标签的指定页面内容 bs4 text()/get_text()/string()
--------------------------------------------------------------
1 连接池报警 请求头改 Connection: keep-alive 为close
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.81 Safari/537.36
2 代理IP 在IP被封禁后
3 每次请求之间sleep进行间隔等待
---------------------------------------------------------------
验证码识别:云打码平台 http://www.yundama.com/ 打码兔 超级鹰
使用流程:
注册
登陆:
普通用户:
查询剩余提分(充值) http://www.yundama.com/price.html
开发者用户:
创建软件:我的软件-》添加新软件(ID,秘钥)
下载示例代码:开发文档-》点此下载:云打码接口DLL-》PythonHTTP示例下载
--------------------------------------------------------------------
代理:代理服务器
- 快代理
- 西祠代理
- goubanjia
匿名度:
透明:对方服务器知道你使用了代理ip也知道你的真实ip
匿名:知道你使用了代理ip但是不知道你的真实ip
高匿:什么都不知道
类型:
http:只可以发起http请求
https:只可以发起https的请求
-------------------------------------------------------------
import requests import asyncio requests.get requests.post 1 掌握哪些基于爬虫的模块 urllb requests 重点 - 发起请求的参数 url headers data/params proxies 代理IP = {'http://':'ip:port'} - get请求 post请求 ajax的get ajax的post - 获取响应数据: - text - content 流 - json() - encoding = 'xxx' - requests处理cookie - 手动 - 自动 : session = requests.Session() 雪球网/58二手房 - 如何提升requests爬取效率 - 多线程 - 线程池 - 单线程+异步协程 aio aiohttp 异步的网络请求模块 - asyncio - 事件循环loop 无限循环 遇到阻塞就轮询下面的 - 协程对象: async 修饰的函数的定义,函数调用后会返回一个协程对象 一个特殊函数的返回值 - 任务对象: 就是对协程对象的进一步封装 - await 需要手动挂起 async 2 常见的数据解析方法 - re - xpath 用熟练 - bs4 美丽汤 - pyquery 解析步骤: 标签定位 数据解析
selenuim: 浏览器自动化的模块 作用 : 便捷的获取动态加载的数据 模拟登陆 弊端 : 效率低下 使用流程: 实例化浏览器对象 find系列函数 标签定位 click() send_keys()数据交互 page_source(),excute_script(Jscode) switch_to.frame('iframe标签的id值)函数:切换作用域, 如果使用find系列 动作链 : 滑动 触发一系列的连续动作 ActionChains
phantomJs : 无视界浏览器
谷歌无头
规避被检测的风险 https://www.cnblogs.com/zhangchen-sx/p/10817722.html
- pyppeteer chromium asyncio
3 列举爬虫中与遇到的比较难得反爬机制 robots UA 检测 验证码 cookie 代理 token(请求的动态参数) 古诗文网 post动态参数 动态数据加载 *** 图片懒加载 数据加密 base64 解密 4 如何抓取动态加载数据 - ajax 动态请求的 - js 动态生成的 selenuim 5 移动端数据抓取 - fiddler - 青花瓷 - mitproxy 先手机装证书 6 抓取过哪些类型的数据,量级多少? 新闻资讯 财经数据(金融产品 ) 设备参数 7 了解哪些爬虫框架? pyspider(封装了一个可视化) 8 谈谈对scrapy的了解
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
项目创建流程 持久化存储 基于终端指令 基于管道 管道持久化存储编码流程 数据解析 对item的类进行相关的属性定义 将解析到的数据封装到item类型的对象中 将item提交给管道 在管道中进行持久化存储的操作 在配置文件中开启管道 注意事项 一个管道类对应一个存储的载体 process_item方法中的返回值是item. 这个返回值会给下一个即将被执行的管道类 处理分页数据爬取: 手动 yeild scrapy.Request(url,callback) post请求: yeild scrapy.FormRequest(url,callback,formdata) #模拟登陆用 cookie处理: 默认自动处理 日志等级: LOG_LEVEL = 'EEROR' 请求传参: 使用场景: 当爬取得数据没有在同一张页面的时候 请求传参传递的是item对象 yeild scrapy.Request(url,callback,meta={'item':item}) callback : item = response.meta['item'] 五大核心组件 -- 引擎作用 - 处理所有数据流 触发事务 下载中间件 - 作用: 批量拦截scrapy中所有的请求和响应 中间件类常用的方法: process_request : 拦截所有正常的请求 process_response : 拦截所有的响应 process_exception : 拦截所有的异常请求. 拦截请求: UA 伪装 IP 代理设定 拦截响应: 修改响应数据,篡改响应对象 selenium 在scrapy 中的应用: crawlSpider: 子类 用作全站数据爬取的 链接提取器 LinkExtracter(allow='正则'): 可以根据指定的规则(allow='正则') 进行链接的提取 规则解析器Rule(LinkExtracter,callback,follow=True) 分布式 原生的不能实现的原因? 管道 调度器 都不能共享 scrapy-redis实现 增量式 : 去重 监测
- 高效的网络请求 下载 - 高性能的持久化存储 数据解析 中间件 - twisted 基于异步的模块 9 如何解析出携带标签的局部页面数据 使用bs4 10 scrapy 核心组件 11 中间件的使用 UA池 IP池 下载中间件 12 如何实现全站数据爬取 - Spider 手动请求 递归调用 - CrawSpider 链接提取器 规则 13 如何检测网站数据更新? - 增量式 14 分布式实现原理 - scrapy-redis 组件 15 如何提升爬取数据的效率 (异步爬虫) - 增加并发 - 禁止cookie - 禁止重试 - 减少下载超时 - 降低日志等级 16 列举你接触的反爬机制 17 scrapy如何实现持久化存储 - 管道 18 谈谈对crawlspider的理解,如何使用其进行深度爬取 - link - rule 19 如何实现数据清洗? - 清洗空值 - dropna - fillna - 清洗重复值 - drop_duplications(keep) - 清洗异常值 - 指定一个判定异常值的条件 20 了解过机器学习吗? - sklearn 先阶段只停留在应用层面