- 博客(103)
- 资源 (1)
- 收藏
- 关注
原创 网络爬虫反反爬小技巧(六)奇淫技巧
前面讲到了无头浏览器、JS逆向、模拟登录、验证码,除这些之外,爬虫过程中我们可能还会遇到:请求头验证、封禁 IP、封账号等等,这里就不展开说了。不过在这里分享几个之前看到的爬虫技巧:1、有时候我们爬取某个 Web 网站,被各种反爬搞得头发掉一地,这个时候我们可以换个角度,去看看人家有没有移动端或者插件,说不定可以发现新世界;2、有时候我们可以看看目标网站的 robots.txt,看看其声明什么东西是可以爬取,什么东西是不允许被爬的,并且给什么搜索引擎爬;例如:https://www.alie
2020-12-15 22:35:22
688
1
原创 网络爬虫反反爬小技巧(五)验证码
本次就来总结总结验证码反爬的一些解决思路。验证码,也叫 CAPTCHA,取的是其英文全称 Completely Automated Public Turing test to tell Computers and Humans Apart 的首字母。一般在以下情况会出现验证码:『情况1』:比如登录和注册,这些验证码几乎是必现的,它的目的就是为了限制恶意注册、恶意爆破等行为,这也算反爬的一种手段。『情况2』:一些网站遇到访问频率过高的行为的时候,可能会直接弹出一个登录窗口,要求我们登录才能继续
2020-12-12 19:10:59
2134
原创 网络爬虫反反爬小技巧(四)模拟登录
在很多情况下,一些网站的页面需要登录才能看到,这个时候我们往往就需要模拟登录了。登录一般需要两个内容:用户名和密码,有的网站可能是手机号和验证码,有的是微信扫码,有的是 OAuth 验证等等,但根本上来说,都是把一些可供认证的信息提交给了服务器,然后服务器返回一个“凭证”。这个“凭证“”的生成和验证目前比较流行的实现方式有两种:第一种:Session 和 Cookies实现方式:方式一:Cookies 里面只存了 Session ID ,服务器能根据 Cookies 找到对应的 Session;
2020-12-11 21:46:33
960
原创 网络爬虫反反爬小技巧(三)JS 逆向
上一节说到的神器 Pyppeteer 也是有不足的地方的,最大的劣势就是相比面向接口爬虫效率很低,就算是无头的 Chromium,那也会占用相当一部分内存。另外额外维护一个浏览器的启动、关闭也是一种负担。所以对于Ajax 接口包含加密参数的问题,我们可以尝试去深挖其中的 JS 构造逻辑。这个过程中我们可能会遇到很多坑。第一个坑:接口加密一般来说会使用到各种加密和编码算法,如 Base64、Hex 编码,MD5、AES、DES、RSA 等加密。如果网站没有对 JS 代码做任何保护的话,我们可以很容易.
2020-12-09 21:29:27
1260
原创 网络爬虫反反爬小技巧(二)Pyppeteer
上一节说到了Selenium,它的功能的确非常强大,但很多时候我们会发现 Selenium 还是有一些不太方便的地方,比如速度太慢、对版本配置要求严苛,最麻烦是经常要更新对应的驱动,还有些网页是可以检测到是否使用了Selenium。所以在这里我们就要请出爬虫神器 「Pyppeteer」 了,虽然支持的浏览器比较单一,但在安装配置的便利性和运行效率方面都要远胜 Selenium。Pyppeteer 依赖于 Chromium 这个浏览器来运行的。有了 Pyppeteer 之后,我们就可以免去那些烦琐的环境.
2020-12-07 22:10:19
4875
4
原创 网络爬虫反反爬小技巧(一)动态页面
今天就说说常见的一种反爬手段:「动态页面」。大多数的网站页面都是经过 JS 处理后生成的结果。这些数据的来源有多种,可能是通过 Ajax 加载的,可能是包含在 HTML 文档中的,也可能是经过 JS 和特定算法计算后生成的。所以如果我们遇到这样的页面,直接利用 requests 等库来抓取原始页面,是无法获取到有效数据的。这时我们需要分析网页后台向服务端发送的 Ajax 请求,只要我们能找到 Ajax 接口的规律,就可以构造出对应的的请求,数据自然就能被轻松爬取到。但是,在很多情况下,Ajax 请求的接
2020-12-06 23:15:41
1318
1
原创 变形与动画相关属性
CSS 3提供的变形支持transform属性用于设置变形,包括移动、缩放、倾斜、位移。变形的顺序不同,得到的效果也不同。移动translate(tx,ty) 沿x轴移动tx距离,沿y轴移动ty距离,其中ty可以省略为0.translateX(tx) 沿x轴移动tx距离translateY(ty) 沿y轴移动ty距离translateZ(tz) 沿z轴移动tz距离缩放...
2019-10-22 17:02:58
214
原创 表格、列表相关属性及media query
表格相关属性border-collapse 合并两个单元格的边框border-spacing 设置两个单元格边框之间的间距caption-side 设置表格标题位置,top位于顶端,bottom位于底端empty-cells 单位格为空时是否显示,show为显示,hide为隐藏table-layout 表格宽度布局,auto是根据表格内容来确定宽度,fixed是根据单元格宽...
2019-10-22 17:02:47
165
原创 事务
文章目录什么是事务并发事务带来的问题事务隔离级别什么是事务事务是逻辑上的一组操作,要么都执行,要么都不执行。事务特性原子性: 事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么完全不起作用;一致性: 执行事务前后,数据保持一致,多个事务对同一个数据读取的结果是相同的;隔离性: 并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的;持...
2019-08-12 15:36:20
390
原创 消息中间件(消息队列)
文章目录介绍常用消息队列介绍消息中间件,也可以叫做中央消息队列或者是消息队列(区别于本地消息队列,本地消息队列指的是JVM内的队列实现),是一种独立的队列系统,消息中间件经常用来解决内部服务之间的 异步调用问题 。请求服务方把请求队列放到队列中即可返回,然后等待服务提供方去队列中获取请求进行处理,之后通过回调等机制把结果返回给请求服务方。异步调用只是消息中间件一个非常常见的应用场景。此外,常...
2019-08-12 14:16:56
725
原创 RPC(远程过程调用)
文章目录介绍常用框架RMIDubboHessianThrift如何选择介绍RPC(Remote Procedure Call)—远程过程调用 ,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发分布式程序就像开发本地程序一样...
2019-08-12 14:06:06
775
原创 AQS
文章目录介绍原理AQS 原理概览AQS 对资源的共享方式AQS底层使用了模板方法模式AQS 组件总结介绍AQS的全称为(AbstractQueuedSynchronizer),这个类在java.util.concurrent.locks包下面。AQS是一个用来构建锁和同步器的框架,使用AQS能简单且高效地构造出应用广泛的大量的同步器,比如我们提到的ReentrantLock,Semapho...
2019-08-12 11:06:50
1105
原创 Atomic 原子类
文章目录介绍JUC 包中的原子类是哪4类?基本类型数组类型引用类型对象的属性修改类型AtomicInteger 的使用AtomicInteger 类的原理介绍Atomic 是指一个操作是不可中断的。即使是在多个线程一起执行的时候,一个操作一旦开始,就不会被其他线程干扰。原子类说简单点就是具有原子/原子操作特征的类。并发包 java.util.concurrent 的原子类都存放在java....
2019-08-12 10:29:16
709
原创 线程池
文章目录为什么要用线程池?实现Runnable接口和Callable接口的区别执行execute()方法和submit()方法的区别是什么呢?如何创建线程池通过构造方法实现通过Executor 框架的工具类Executors来实现为什么要用线程池?线程池提供了一种限制和管理资源(包括执行一个任务)。 每个线程池还维护一些基本统计信息,例如已完成任务的数量。这里借用《Java并发编程的艺术》提...
2019-08-12 10:19:51
387
原创 ThreadLocal
文章目录简介示例原理内存泄漏问题简介通常情况下,我们创建的变量是可以被任何一个线程访问并修改的。如果想实现每一个线程都有自己的专属本地变量该如何解决呢? JDK中提供的ThreadLocal类正是为了解决这样的问题。ThreadLocal类主要解决的就是让每个线程绑定自己的值,可以将ThreadLocal类形象的比喻成存放数据的盒子,盒子中可以存储每个线程的私有数据。如果你创建了一个Thr...
2019-08-12 10:01:43
432
原创 volatile关键字
文章目录Java内存模型synchronized 关键字和 volatile 关键字的区别Java内存模型在 JDK1.2 之前,Java的内存模型实现总是从主存(即共享内存)读取变量,是不需要进行特别的注意的。而在当前的 Java 内存模型下,线程可以把变量保存本地内存比如机器的寄存器)中,而不是直接在主存中进行读写。这就可能造成一个线程在主存中修改了一个变量的值,而另外一个线程还继续使用...
2019-08-10 22:44:13
340
原创 synchronized 关键字
文章目录介绍使用底层原理synchronized 同步语句块的情况synchronized 修饰方法的的情况JDK1.6之后synchronized关键字底层优化synchronized和ReentrantLock 的区别两者都是可重入锁synchronized 依赖于 JVM 而 ReentrantLock 依赖于 APIReentrantLock 比 synchronized 增加了一些高级功...
2019-08-10 22:36:29
692
原创 JDK 监控和故障处理工具总结
文章目录JDK命令行工具jps:查看所有 Java 进程jstat: 监视虚拟机各种运行状态信息jinfo: 实时地查看和调整虚拟机各项参数jmap:生成堆转储快照jhat: 分析 heapdump 文件jstack :生成虚拟机当前时刻的线程快照JDK 可视化分析工具JConsole:Java 监视与管理控制台连接 Jconsole查看 Java 程序概况内存监控线程监控Visual VM:多合...
2019-08-10 21:56:59
494
原创 类加载器
文章目录概述双亲委派模型介绍实现源码分析好处自定义类加载器概述JVM 中内置了三个重要的 ClassLoader,除了 BootstrapClassLoader, 其他类加载器均由 Java 实现且全部继承自java.lang.ClassLoader:BootstrapClassLoader(启动类加载器) :最顶层的加载类,由C++实现,负责加载 %JAVA_HOME%/lib目录下的j...
2019-08-10 20:47:28
409
原创 类加载过程
文章目录概述加载连接验证准备解析初始化概述Class 文件需要加载到虚拟机中之后才能运行和使用,那么虚拟机是如何加载这些 Class 文件呢?系统加载 Class 类型的文件主要三步:加载->连接->初始化。连接过程又可分为三步:验证->准备->解析。加载类加载过程的第一步,主要完成下面3件事情:通过全类名获取定义此类的二进制字节流将字节流所代表的静态存储...
2019-08-10 20:34:37
389
原创 类文件结构
文章目录概述Class文件结构魔数Class文件版本常量池访问标志当前类索引,父类索引与接口索引集合字段表集合方法表集合属性表集合概述在 Java 中,JVM 可以理解的代码就叫做字节码(即扩展名为 .class 的文件),它不面向任何特定的处理器,只面向虚拟机。Java 语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。所以 Java...
2019-08-10 20:18:59
394
原创 JVM垃圾回收
文章目录本文主线JVM内存分配和回收对象优先在 eden 区分配大对象直接进入老年代长期存活的对象将进入老年代动态对象年龄判定对象已经死亡吗?如何判断一个对象已经无效引用计数法可达性分析算法再谈引用强引用软引用弱引用虚引用不可达的对象并非“非死不可”如何判断一个常量是废弃常量如何判断一个类是无用的类垃圾收集算法标记-清除算法复制算法标记-整理算法分代收集算法垃圾收集器Serial 收集器ParNe...
2019-08-10 19:55:34
406
原创 乐观锁和悲观锁
文章目录基本概念实现方式CAS(Compare And Swap)版本号控制优缺点和适用场景功能限制竞争激烈程度补充乐观锁加锁吗?CAS有哪些缺点?基本概念乐观锁和悲观锁是两种思想,用于解决并发场景下的数据竞争问题。乐观锁:乐观锁在操作数据时非常乐观,认为别人不会同时修改数据。因此乐观锁不会上锁,只是在执行更新的时候判断一下在此期间别人是否修改了数据:如果别人修改了数据则放弃操作,否则执...
2019-08-10 15:13:52
330
原创 Java内存区域
文章目录概述运行时数据区域程序计数器Java虚拟机栈本地方法栈堆方法区方法区和永久代的关系常用参数为什么将永久代 (PermGen) 替换为元空间 (MetaSpace) 呢?运行时常量池直接内存HotSpot虚拟机对象对象的创建类加载检查分配内存初始化零值设置对象头执行init方法对象的内存布局对象的访问定位补充String类和常量池8 种基本类型的包装类和常量池概述对于 Java 程序员来...
2019-08-10 14:27:48
470
原创 ZooKeeper
文章目录什么是ZooKeeper由来概览重要概念会话(Session)Znode版本WatcherACL特点设计目标简单的数据模型可构建集群顺序访问高性能ZooKeeper集群角色介绍ZAB 协议&Paxos算法ZAB协议介绍ZAB 协议两种基本的模式:崩溃恢复和消息广播什么是ZooKeeper由来Zookeeper最早起源于雅虎研究院的一个研究小组。在当时,研究人员发现,在雅虎内部...
2019-08-09 20:33:36
445
原创 MySQL 规范
文章目录数据库命令规范数据库基本设计规范数据库字段设计规范索引设计规范常见索引列建议如何选择索引列的顺序避免建立冗余索引和重复索引优先考虑覆盖索引索引SET规范数据库SQL开发规范数据库操作行为规范数据库命令规范所有数据库对象名称必须使用小写字母并用下划线分割所有数据库对象名称禁止使用mysql保留关键字(如果表名中包含关键字查询时,需要将其用单引号括起来)数据库对象的命名要能...
2019-08-09 19:46:33
1618
原创 分布式锁
文章目录什么是锁什么是分布式什么是分布式锁需要怎样的分布式锁实现方式基于数据库做分布式锁基于表主键唯一做分布式锁基于表字段版本号做分布式锁基于数据库排他锁做分布式锁优缺点基于 Redis 做分布式锁基于 Redis 的 SETNX()、EXPIRE() 方法做分布式锁基于 Redis 的 SETNX()、GET()、GETSET()方法做分布式锁基于 REDLOCK 做分布式锁基于 REDISSO...
2019-08-09 18:00:54
1517
1
原创 Docker
文章目录认识容器什么是容器容器VS虚拟机Docker容器什么是DockerDocker思想特点为什么要用Docker基本概念镜像(Image)一个特殊的文件系统容器(Container)镜像运行时的实体仓库(Repository)集中存放镜像文件的地方Build、Ship、Run认识容器什么是容器官方解释一句话概括容器:容器就是将软件打包成标准化单元,以用于开发、交付和部署。容器镜像是...
2019-08-09 15:00:52
369
原创 设计模式——备忘录模式
文章目录定义结构优缺点使用场景定义在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样就可以将该对象恢复到原先保存的状态。类型:行为类模式类图:我们在编程的时候,经常需要保存对象的中间状态,当需要的时候,可以恢复到这个状态。比如,我们使用Eclipse进行编程时,假如编写失误(例如不小心误删除了几行代码),我们希望返回删除前的状态,便可以使用Ctrl+Z来进...
2019-08-09 13:44:31
151
原创 设计模式——解释器模式
文章目录定义结构优缺点适用场景注意事项定义给定一种语言,定义他的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中句子。类型:行为类模式类图:解释器模式是一个比较少用的模式。结构抽象解释器:声明一个所有具体表达式都要实现的抽象接口(或者抽象类),接口中主要是一个interpret()方法,称为解释操作。具体解释任务由它的各个实现类来完成,具体的解释器分别由终结符解释...
2019-08-09 13:28:49
118
原创 设计模式——迭代器模式
文章目录定义结构优缺点适用场景定义提供一种方法访问一个容器对象中各个元素,而又不暴露该对象的内部细节。类型:行为类模式类图:如果要问java中使用最多的一种模式,答案不是单例模式,也不是工厂模式,更不是策略模式,而是迭代器模式,先来看一段代码吧: public static void print(Collection coll){ Iterator it = col...
2019-08-09 13:20:00
112
原创 设计模式——策略模式
文章目录定义定义定义一组算法,将每个算法都封装起来,并且使他们之间可以互换。类型:行为类模式类图:策略模式是对算法的封装,把一系列的算法分别封装到对应的类中,并且这些类实现相同的接口,相互之间可以替换。在前面说过的行为类模式中,有一种模式也是关注对算法的封装——模版方法模式,对照类图可以看到,策略模式与模版方法模式的区别仅仅是多了一个单独的封装类Context,它与模版方法模式的区别在...
2019-08-09 11:48:20
112
原创 分布式事务
文章目录什么是分布式事务分布式事务的产生的原因数据库分库分表应用SOA化事务的ACID特性原子性(A)一致性(C)隔离性(I)持久性(D)分布式事务的应用场景支付在线下单常见的分布式事务解决方案基于XA协议的两阶段提交消息事务+最终一致性TCC编程模式总结什么是分布式事务分布式事务就是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上。以上是...
2019-08-09 10:33:54
121
原创 设计模式——责任链模式
文章目录定义结构优缺点适用场景总结定义使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。类型:行为类模式类图:首先来看一段代码: public void test(int i, Request request){ if(i==1){ Handler1...
2019-08-09 09:40:19
229
原创 设计模式——命令模式
文章目录定义结构优点适用场景总结定义将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。类型:行为类模式类图:结构顾名思义,命令模式就是对命令的封装,首先来看一下命令模式类图中的基本结构:Command类:是一个抽象类,类中对需要执行的命令进行声明,一般来说要对外公布一个execute方法用来执行命令。Con...
2019-08-09 09:24:43
128
原创 java的动态绑定与双分派
文章目录java的动态绑定java的静态绑定instanceof操作符与转型用双分派实现动态绑定java的动态绑定动态绑定就是指程序执行期间(而不是在编译期间)判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。java继承体系中的覆盖就是动态绑定的,看一下如下的代码: class Father { public void method(){ ...
2019-08-09 09:03:37
239
原创 设计模式——访问者模式
文章目录定义优点适用场景总结定义封装某些作用于某种数据结构中各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。类型:行为类模式类图:访问者模式可能是行为类模式中最复杂的一种模式了。我们首先来看一个简单的例子,代码如下: class A { public void method1(){ System.out.println...
2019-08-09 08:13:55
150
原创 设计模式——观察者模式
文章目录定义结构优点总结定义对象间一种一对多的依赖关系,使得当每一个对象改变状态,则所有依赖于它的对象都会得到通知并自动更新。类型:行为类模式类图:在软件系统中经常会有这样的需求:如果一个对象的状态发生改变,某些与它相关的对象也要随之做出相应的变化。比如,我们要设计一个右键菜单的功能,只要在软件的有效区域内点击鼠标右键,就会弹出一个菜单;再比如,我们要设计一个自动部署的功能,就像ecl...
2019-08-09 08:00:26
127
原创 设计模式——中介者模式
文章目录定义结构为什么要使用中介者模式优点使用场景定义用一个中介者对象封装一系列的对象交互,中介者使各对象不需要显示地相互作用,从而使耦合松散,而且可以独立地改变它们之间的交互。类型:行为类模式类图:结构中介者模式又称为调停者模式,从类图中看,共分为3部分:抽象中介者:定义好同事类对象到中介者对象的接口,用于各个同事类之间的通信。一般包括一个或几个抽象的事件方法,并由子类去实现...
2019-08-09 07:48:24
145
原创 设计模式——模板方法模式
文章目录定义结构优点使用场景定义定义一个操作中算法的框架,而将一些步骤延迟到子类中,使得子类可以不改变算法的结构即可重定义该算法中的某些特定步骤。类型:行为类模式类图:事实上,模版方法是编程中一个经常用到的模式。先来看一个例子,某日,程序员A拿到一个任务:给定一个整数数组,把数组中的数由小到大排序,然后把排序之后的结果打印出来。经过分析之后,这个任务大体上可分为两部分,排序和打印,打...
2019-08-09 07:33:24
280
一个简单的个人博客平台
2019-06-11
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人