3.22串讲

Posted 今天你学Java了吗

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了3.22串讲相关的知识,希望对你有一定的参考价值。

3.22串讲

分支

switch…case:支持的数据类型 byte、short、int、char、String、Enum

switch()

    case :
        break;
    case :
        break;
    default:
            

案例

  • 完成学生成绩分等级
  • 输入年月日判断此日期是本年第几天

循环

for

循环次数已知

for(表达式1;表达式2;表达式3)
    //循环体

while

循环次数未知

while(循环成立的条件)
    //循环体
    //循环体要有退出条件,避免死循环

do…while

循环次数未知,但至少执行一次

do
    //循环体
    //循环体要有退出条件,避免死循环
while(循环成立的条件);

数组

一维数组

  • 数组的声明方式

    int[] arr = new int[12];
    int[] arr = new int[]12,123,43,123,5431;
    int[] arr = 12,123,43,123,5431;
    //不推荐
    int arr[] = new int[12];
    
  • 数组的下标

    下标从0开始,最后一位下标是 数组的长度( array.length() ) - 1

  • 数组的复制

    //一个一个复制,通过循环来自己遍历复制
    
    System.arrayCopy(src,srcPos,dest,destPos,length);
    //src  源数组
    //srcPos 源数组的哪个元素开始复制
    //dest  目标数组
    //destPos  从目标数组的哪个元素开始放
    //length  从源数组复制的长度
    
    int[] array = Arrays.copyOf(ary,ary.length + 13);
    //src  要复制的数组(源数组)
    //newLength  新数组的长度
    //上面的方法可以用于扩容、缩容
    
  • 数组的存取

    int[] ary = new int[10];
    arr[0] = 1;
    arr[1] = 2;
    
    //也可以循环赋值,接收键盘输入的数或随机数
    
    //数组的遍历
    for(int i = 0;i < ary.length(); i++)
       System.out.println(ary[i]);
    
    
    
  • 数组的排序

    //系统提供的    
    //冒泡、插入、选择、希尔、归并、快排
    Arrays.sort();
    

多维数组

方法

在一个类中可有多个方法

修饰符 返回值类型  方法名(参数列表)
    //方法体


//修饰符:public static
//返回值类型:  无返回值写void,有返回值类型写返回值类型,8种基本数据类型或引用类型
//参数列表:  有参无参  可写可不写,也可写多个
//形参实参:  形参———— 形式上的参数,方法定义时写的参数,用来占位
//			实参———— 实际上的参数,方法调用时写的参数,具体值

爬虫串讲

爬虫串讲

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 (手写数字识别,验证码识别)

      预测房价

以上是关于3.22串讲的主要内容,如果未能解决你的问题,请参考以下文章

Java知识串讲

3.22操作系统内存管理(整理)Java并发

97班3.22

python重点串讲

3.31串讲

java与es8实战之三:Java API Client有关的知识点串讲