- 爬虫的分类
- 通用爬虫:
- 聚焦爬虫:
- 增量式:
- 爬取图片的两种方式
- 使用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实现
增量式 : 去重 监测
scrapy 框架
- 高效的网络请求 下载
- 高性能的持久化存储 数据解析 中间件
- 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 先阶段只停留在应用层面