zoukankan      html  css  js  c++  java
  • 爬虫串讲

    爬虫串讲

    requests

    一定要掌握

    爬取数据流程:

    1. 指定url
    2. 发起请求
    3. 获取响应数据
    4. 数据解析
    5. 持久化存储

    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'
        • 代理设定
      • process_response : 篡改响应内容或者替换响应对象
      • process_exception
        • 对异常的请求进行拦截
        • 对异常的请求进行修正
        • return 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')
    

    面试题

    1. 写出在网络爬取过程中, 遇到防爬问题的解决办法。
    2. 如何提高爬虫的效率?
      1. requests+线程池
      2. asyncio+aiohttp
      3. scrapy
      4. 分布式(终极)
    3. 你的爬虫 爬取的数据量有多少?
    4. 列举您使用过的 python 网络爬虫所用到的模块。
      • 网络请求:urllib,requests,aiohttp
      • 数据解析:re,bs4,lxml
      • selenium
      • dummy,asyncio,pyExcl
    5. 简述 requests 模块的作用及基本使用?
    6. 简述 beautifulsoup 模块的作用及基本使用?
    7. 简述 seleninu 模块的作用及基本使用?
    8. 简述 scrapy 框架中各组件的工作流程?
    9. 在 scrapy 框架中如何设置代理(两种方法)?
    10. scrapy 框架中如何实现大文件的下载?
    11. scrapy 中如何实现限速?
    12. scrapy 中如何实现暂定爬虫?
    13. scrapy 中如何进行自定制命令?
    14. scrapy 中如何实现的记录爬虫的深度?
    15. scrapy 中的 pipelines 工作原理?
    16. scrapy 的 pipelines 如何丢弃一个 item 对象?
    17. 简述 scrapy 中爬虫中间件和下载中间件的作用?
    18. scrapy-redis 组件的作用?
    19. scrapy-redis 组件中如何实现的任务的去重?
    20. scrapy-redis 的调度器如何实现任务的深度优先和广度优先?

    移动端数据的抓取:

    • fiddler,青花瓷,miteproxy

    抓取过哪些类型的数据,量级是多少?

    • 电商,医疗器械,新闻资讯,股票,金融,招聘,工程招标

      100万 剩下的100一下, 20w...

    爬虫框架

    • scrapy,pyspider(了解)

    谈谈对scrapy的了解

    • scrapy的功能模块
    • 五大核心组件的工作流程

    如何解析出携带标签的局部页面数据 :

    • 用bs4

    中间件的了解

    • 下载中间件
      • 作用:批量拦截请求和响应
        • 拦截请求
          • UA伪装,代理
        • 拦截响应
          • 篡改响应内容

    如何检测网站数据更新?

    • 增量式

      定时去爬取, shell脚本定时

    深度优先 scrapy默认的 不全部保留节点 占用空间大;运行速度快

    广度优先 保留全部节点 占用空间小;运行速度慢

    了解过机器学习

    • sklearn #入门级别,但是封装了很多,可以用

      • 线性回归

      • KNN (手写数字识别,验证码识别)

        预测房价

  • 相关阅读:
    201521123036 《Java程序设计》第4周学习总结
    201521123036 《Java程序设计》第3周学习总结
    201521123075 《Java程序设计》第12周学习总结
    201521123075 《Java程序设计》第11周学习总结
    201521123075 《Java程序设计》第10周学习总结
    201521123075 《Java程序设计》第9周学习总结
    201521123075 《Java程序设计》第8周学习总结
    201521123075 《Java程序设计》第7周学习总结
    201521123075 《Java程序设计》第6周学习总结
    201521123075 《Java程序设计》第5周学习总结
  • 原文地址:https://www.cnblogs.com/Doner/p/11468658.html
Copyright © 2011-2022 走看看