爬虫知识点总结
知识点总结
-
requests模块
- 爬取数据流程: -
- get,post作用:
- get,post参数:
- url
- headers
- data/params
- proxies
- 处理ajax动态加载的数据: -
- 模拟登陆:
- 获取点击登录按钮发起的post请求(请求参数)
- 打码平台使用:
- 开发者用户:
- 创建一个软件(id,秘钥)
- 下载示例代码(PythonHTTP)
- 超时时间:20s
- 开发者用户:
- cookie的处理:
- 自动处理:requests.getSession()
- 手动处理:headers
-
代理ip:
- 购买代理(价位):快代理 西祠代理
- HTTPConnectionPool:
- 1.使用代理ip
- 2.sleep
- 3.Connection:'close'
- requests模块单线程爬取300w数据耗时90min左右
-
线程池:
- dummy.Pool.map()
- 图片懒加载:伪属性
- 数据解析
- 正则表达式:
- bs4:
- find('tagName',attrName='value')
- select('选择器') > 空格
- soup.tagName
- 取文本:string text get_text()
- xpath:
- 解析原理:
- 1.实例化对象且将页面源码数据加载到该对象中
- 2.相关的机制实现标签的定位
- 3.取文本或者取属性
- xpath函数中必须作用一个xpath表达式(xpath插件)
- xpath函数的返回值:列表
- 局部数据解析:li.xpath('./')
- 解析原理:
- selenium
- 作用:模块中提供了可以让浏览器实现自动化的操作的接口
- 使用流程:
- 1.实例化某一款浏览器对象(浏览器驱动程序)
- 2.调用get函数打开某一个页面
- 3.执行其他自动化的操作
- find系列的函数:find_element_by_id
- send_keys,click,excute_script(js)
- 4.page_source
- find系列函数:
- switch_to.frame(iframe的id属性值)函数
- phantomJs:
- 谷歌无头浏览器:
-
scrapy
- 项目创建流程:
- name
- start_urls
- parse(self,response)
- 持久化存储:
- 1.基于终端指令:
- 只可以将parse方法的返回值表示的数据进行持久化存储
- 基于管道
- 1.解析数据
- 2.封装到item类型的对象
- 3.提交item(yield)
- 4.在process_item方法中接收item且进行数据的持久化存储
- 5.开启管道(settings)
- 注意:process_item open_spider close_spider
- process_item函数的返回值作用:就可以将item给下一个管道类
- 1.基于终端指令:
- 处理分页数据爬取:
- 手动请求的发送:yiled scrapy.Request(url,callback)
- post请求:
- start_request()
- yiled scrapy.FormRequest(url,formdata,callback)
- cookie处理:
- 自动处理
- 日志等级:
- INFO,ERROR,DEBUG
- LOG_LEVEL = 'ERROR'
- LOG_FILE = './log.txt'
- 请求传参:
- 场景:爬取的数据不在同一张页面中
- yiled scrapy.Request(url,callback,meta={'item':item})
- 接收:item = response.meta['item']
- 五大核心组件原理:
- spider:产生url 进行数据解析
- 管道:持久化存储
- 下载器:进行网络数据的下载
- 调度器:
- 去重
- 调度url
- 引擎:
- 对数据流的处理
- 触发事务
-
下载中间件:
- 下载中间件:拦截请求和响应
-
拦截请求:
-
UA伪装:
- process_request(self,request,spider): request.headers['User-Agent'] = 'xxx'
-
代理ip的设置:
- process_exception(self,request,spider): if request.url.split(:)[0] == 'http'
else:request.meta['proxy'] = 'http://ip:port'
request.meta['proxy'] = 'https://ip:port'
- process_exception(self,request,spider): if request.url.split(:)[0] == 'http'
-
- UA池和代理池:
- selenium在scrapy中的应用:
- 1.在爬虫文件的构造方法中实例化一个浏览器对象
- 2.在爬虫文件的closed(self,spider)关闭浏览器对象
- 3.在下载中间件的process_response(self,request,response,spider)编写浏览器自动化的操作代码
- 4.return HtmlResponse(body=bro.page_source)
- crawlSpider:
- 作用:全栈数据的爬取
- 基于crawlSpider的爬虫文件的创建:scrapy genspider -t crawl xxx www.xxx.com
- 链接提取器:根据指定规则(allow='正则')进行连接的提取
- 规则解析器:将链接提取器提取到的连接进行请求的发送并且根据指定规则对页面数据进行解析.
- follow:True
- 项目创建流程:
-
分布式
- scrapy为何不能实现分布式:
- scrapy-redis的作用:
- 实现分布式的方式:
- 流程:
- 增量式爬虫:
- 去重
- 数据指纹
案例总结
- 爬取肯德基餐厅位置信息:http://www.kfc.com.cn/kfccda/index.aspx
- 爬取药监总局:http://125.35.6.84:81/xk/
- 爬取糗事百科图片:https://www.qiushibaike.com/pic/
- 下载免费简历模板:http://sc.chinaz.com/jianli/free.html
- 煎蛋网图片爬取:http://jandan.net/ooxx
- 解析城市名称:https://www.aqistudy.cn/historydata/
- 古诗文网:https://so.gushiwen.org/user/login.aspx?from=http://so.gushiwen.org/user/collect.aspx
- 网易新闻:https://news.163.com/
反爬机制总结
- robots.txt
- UA检测
- 验证码
- 数据加密
- cookie
- 禁IP
- 动态token
- 数据动态加载
数据清洗
- 空值检测删除空值所在的行数据:
- dropna(axis=0)
- 空值检测填充空值:
- fillna(method='ffill/bfill',axis=0)
- 异常值检测和过滤:
- 判定异常值的条件:
- replace(to_replace,value)
- 重复行检测和删除:
- drop_duplicated(keep)
面试题
- 如何提升爬虫的效率
- 线程池
- scrapy配置文件相关配置(禁用cookie,禁止重试,减小下载超时,增加并发,日志等级)
- scrapy核心组件工作流程
- scrapy中如何设置代理(两种方法)
- 中间件
- 环境变量(os.environ['HTTPS_PROXY'] = 'https:ip:port')
- scrapy如何实现限速
- DOWNLOAD_DELAY = 1
- scrapy如何实现暂停爬虫
- JOBDIR='sharejs.com'
- control-C
- pipeline如何丢弃一个item对象
- scrapy-redis组件作用
- 实现深度和广度优先:默认为深度优先。
- DEPTH_PRIORITY = 1
- SCHEDULER_DISK_QUEUE = 'scrapy.squeues.PickleFifoDiskQueue'
- SCHEDULER_MEMORY_QUEUE = 'scrapy.squeues.FifoMemoryQueue'
- 广度优先:不全部保留结点,占用空间少;运行速度慢
- 深度优先:保留全部结点,占用空间大;运行速度快