爬虫串讲
Posted doner
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了爬虫串讲相关的知识,希望对你有一定的参考价值。
爬虫串讲
requests
一定要掌握
爬取数据流程:
- 指定url
- 发起请求
- 获取响应数据
- 数据解析
- 持久化存储
get,post参数:
- url
- data/params
- headers
- proxies
处理ajax动态加载的数据:
- 动态加载的数据: 通过另一个请求请求到的数据
- 通过抓包工具捕获请求对应的数据包,数据包之间实现局部或者全局搜索
模拟登陆:
- 对点击登录按钮对应的post请求进行请求发送
- 动态变化的请求参数:
- 一般会隐藏在前台页面
打码平台使用:
- 超级鹰,云打码
cookie的处理:
手动处理
- 将cookie从抓包工具对应数据包的头信息中进行捕获,粘贴在headers中
requests.Session()自动处理
- session . requests.Session()
aaa=123; time=1506660011
代理ip:
- 类型: http, https
线程池:
- dummy import Pool
- map(func,list)
图片懒加载: 伪属性所对应的
单线程+多任务异步协程
- 协程: 特殊的对象. 一个被aynic关键字修饰的函数定义,该函数被调用后会马上返回一个协程对象
- 任务对象: 就是对协程对象的进一步封装
- 绑定回调:def callback(task) : return task.result()
- task.add_done_callback(callback)
- 任务列表: 多个任务对象
- 事件循环对象:任务列表是需要注册到事件循环对象中,然后事件循环开启后,则会将任务列表中的每一个任务对象进行异步调用
- aiohttp:是一个基于异步的网络请求模块
数据解析: 1 定位标签 2 数据提取
- 正则表达式:
- bs4:
- xpath:
selenium
- 关联:
- 1.便捷的捕获到动态加载的数据(可见即可得)
- 2.实现模拟登陆
- 作用:
- 实现浏览器自动化的相关操作
- 使用流程:
- 环境安装
- 下载浏览器的驱动程序
- 实例化浏览器对象
- 制定相关的行为动作
- 关闭浏览器
- find系列函数:
- 定位标签
- switch_to.frame(iframe的id)函数
- 切换iframe
- 无头浏览器(随用随粘)
- 规避监测
- phantomJs:(无头浏览器)
- 谷歌无头浏览器:
- 动作连:from selenium.webdriver import ActionChains
scrapy
项目创建流程:
- scrapy startprojecct proName
- cd ProName
- scrapy genspider spiderName www.xxx.com
- scrapy crawl spiderName
数据解析:
- response.xpath(‘xpath表达式‘)
- xpath返回的列表中存储的是Selector对象,解析的字符串类型的数据是被存储在了该对象中.获取字符串类型的数据必须extract()或者extract_first()
持久化存储:
- 基于终端指令的持久化存储
- scrapy crawl spiderName -o filePath
- 管道:
- 数据解析
- 存储封装到item类型的对象中
- 将item提交给管道
- 在管道类的process_item(item,spider)方法中接收item,对item进行任意形式的持久化存储
- 在settings中开启管道
- 注意事项:
- 开启管道的时候,管道的优先级,数值越小优先级越高
- 一个管道类表示将数据存储到某一个具体的平台中
- process_item的return item表示的是将item传递给下一个即将被执行的管道类
- 爬虫类提交的item只会提交给优先级最高的管道
- 基于终端指令的持久化存储
处理分页数据:
- 全站数据爬取
- 手动请求发送: yield scrapy.Request/FormRequest(url,callback,formdata)
- 全站数据爬取
post请求
cookie处理:
日志等级:
- LOG_LEVEL = "ERROR"
请求传参:
使用场景:
- 实现数据的深度爬取(爬取的数据没有存在同一张页面中)
如何实现请求传参
yield scrapy.Request/FormRequest(url,callback,formdata)
:meta就会将自己传递给callback,在callback中使用reponse.meta进行字典的接收
五大核心组件原理:
下载中间件:
- process_request : 拦截正常的请求
- UA伪装
- request.headers[‘User-Agent‘] = ‘xxx‘
- 代理设定
- request.meta[‘proxy‘] = ‘http://ip:port‘
- UA伪装
- process_response : 篡改响应内容或者替换响应对象
- process_exception
- 对异常的请求进行拦截
- 对异常的请求进行修正
- return request的操作将修正后的请求对象进行重新的请求发送
- process_request : 拦截正常的请求
UA池和代理池:
selenium在scrapy中的应用:
- 1.在爬虫类添加一个属性,将属性作为浏览器对象.
- 2.在爬虫类的closed(self,spider)方法中关闭浏览器对象
- 3.在中间件的process_reponse中获取浏览器对象,实现自动化相关的操作 (比如滚轮向哪拖动)
crawlSpider:
- 全站数据爬取
- LinkExtractor(allow=‘正则‘)
- 根据指定的规则(正则)进行连接(url)的提取
- Rule(link,callback,follow=True)
- 接收连接提取器提取到的连接,对其进行请求发送,然后将请求到的数据进行指定规则的解析
分布式
scrapy 为何不能实现分布式:
- 调度器和管道不可以被共享
scarpy_redis的作用:
- 提供了可以被共享的
反爬机制总结
robots.txt
UA检测
验证码
数据加密
cookie
禁IP
动态token
数据动态加载
js加密
js混淆
图片懒加载
数据清洗
空值检测 删除空值所在的行数据:df.dropna(axis=0)
空值检测填充空值: df.fillna(method='ffill',axis=0)
异常值检测和过滤:
判定异常值的条件
重复行检测和删除:
df.drop_duplicated(keep='first')
面试题
- 写出在网络爬取过程中, 遇到防爬问题的解决办法。
- 如何提高爬虫的效率?
- requests+线程池
- asyncio+aiohttp
- scrapy
- 分布式(终极)
- 你的爬虫 爬取的数据量有多少?
- 列举您使用过的 python 网络爬虫所用到的模块。
- 网络请求:urllib,requests,aiohttp
- 数据解析:re,bs4,lxml
- selenium
- dummy,asyncio,pyExcl
- 简述 requests 模块的作用及基本使用?
- 简述 beautifulsoup 模块的作用及基本使用?
- 简述 seleninu 模块的作用及基本使用?
- 简述 scrapy 框架中各组件的工作流程?
- 在 scrapy 框架中如何设置代理(两种方法)?
- scrapy 框架中如何实现大文件的下载?
- scrapy 中如何实现限速?
- scrapy 中如何实现暂定爬虫?
- scrapy 中如何进行自定制命令?
- scrapy 中如何实现的记录爬虫的深度?
- scrapy 中的 pipelines 工作原理?
- scrapy 的 pipelines 如何丢弃一个 item 对象?
- 简述 scrapy 中爬虫中间件和下载中间件的作用?
- scrapy-redis 组件的作用?
- scrapy-redis 组件中如何实现的任务的去重?
- scrapy-redis 的调度器如何实现任务的深度优先和广度优先?
移动端数据的抓取:
- fiddler,青花瓷,miteproxy
抓取过哪些类型的数据,量级是多少?
电商,医疗器械,新闻资讯,股票,金融,招聘,工程招标
100万 剩下的100一下, 20w...
爬虫框架
- scrapy,pyspider(了解)
谈谈对scrapy的了解
- scrapy的功能模块
- 五大核心组件的工作流程
如何解析出携带标签的局部页面数据 :
- 用bs4
中间件的了解
- 下载中间件
- 作用:批量拦截请求和响应
- 拦截请求
- UA伪装,代理
- 拦截响应
- 篡改响应内容
- 拦截请求
- 作用:批量拦截请求和响应
如何检测网站数据更新?
增量式
定时去爬取, shell脚本定时
深度优先 scrapy默认的 不全部保留节点 占用空间大;运行速度快
广度优先 保留全部节点 占用空间小;运行速度慢
了解过机器学习
sklearn #入门级别,但是封装了很多,可以用
线性回归
KNN (手写数字识别,验证码识别)
预测房价
以上是关于爬虫串讲的主要内容,如果未能解决你的问题,请参考以下文章