Qi's Blog

不打无准备之仗


  • 首页

  • 分类

  • 关于

  • 归档

  • 标签

elasticsearch

发表于 2016-10-09   |   分类于 big-data   |  

ElasticSearch

官网地址:https://www.elastic.co/learn

1.安装

安装elasticsearch,可视化管理工具marvel,kibana。

在本机,都安装在cellar中,目前插件只安装了marvel和kibana,ik,head。

Elasticsearch初步使用(安装、Head配置、分词器配置)

安装head:

bin/plugin install mobz/elasticsearch-head

进入head:http://localhost:9200/_plugin/head/

查看插件的url可以参照上面。推荐使用head,好用多了。

启动ElasticSearch很简单,执行安装目录下bin/elasticsearch即可;ElasticSearch 1.0.0的启动机制有一些变化,默认在前台运行,-d参数表示在后台运行;另外还提供-p参数,后接文件名,保存当前ElasticSearch进程的pid,方便关闭进程;使用ps aux|grep elasticsearch可以查看是否启动

1
2
$ bin/elasticsearch -d -p /tmp/es.pid
$ kill `cat /tmp/es.pid`

servicewrapper插件不支持2.x的版本,所以不使用其来控制es。

关闭es

前台运行:可以通过”CTRL+C”组合键来停止运行
后台运行,可以通过”kill -9 进程号”停止.也可以通过REST API接口:

1
curl -XPOST http://主机IP:9200/_cluster/nodes/_shutdown

来关闭整个集群,通过:

1
curl -XPOST http://主机IP:9200/_cluster/nodes/节点标示符(如es-node1)/_shutdown

来关闭单个节点。也可以通过head来关闭。

注:shutdown接口已经被弃用。

ElasticSearch关闭重启命令

配置

可以参见http://blog.csdn.net/sinat_28224453/article/details/51134978。

http://www.qixing318.com/article/elasticsearch-distributed-search-engine-used-in-the-installation-of-the-linux-platform.html

elasticsearch配置小记

2.分词

ik git地址

如果版本对不上,可以改ik的pom文件的es版本号。

分词教程:

elasticsearch的实现全文检索

为Elasticsearch添加中文分词,对比分词器效果

Elasticsearch——分词器对String的作用

field must be set when search_analyzer is set

  • 请求参数:
    curl -XPUT http://es1.es.com:9200/cloudx_web_v3/T_EVENT_LOG/_mapping?pretty-d ‘{“T_EVENT_LOG”:{“properties”:{“name”:{“type”:”string”,”indexAnalyzer”:”ik”,”searchAnalyzer”:”ik”}}}}’
  • 问题日志:
    {“error”:{“root_cause”:[{“type”:”mapper_parsing_exception”,”reason”:”analyzer on field [name] must be set when search_analyzer is set”}],”type”:”mapper_parsing_exception”,”reason”:”analyzer on field [name] must be set when search_analyzer is set”},”status”:400}
  • 问题解决:参考旧版本教程的坑,V2.3.4的参数改了,应为
    curl -XPUT http://es1.es.com:9200/cloudx_web_v3/T_EVENT_LOG/_mapping?pretty-d ‘{“T_EVENT_LOG”:{“properties”:{“name”:{“type”:”string”,”analyzer”:”ik”,”search_analyzer”:”ik”}}}}’

Mapping语法:

curl -XPUT localhost:9200/索引名称/类型名称/_mapping?pretty -d ‘{“类型名称”:{“properties”:{“字段名称”:{“type”:”字段类型”,”store”:”是否存储”,”index”:”索引方式、是否分析”}}}}’

分词的配置,推荐在创建mapping的时候,对index analyzer进行ik_max_word,对查询则ik_smart。参见Elasticsearch中使用ik分词器 java api

1
2
3
4
5
6
7
8
9
10
11
12
13
index:
analysis:
analyzer:
ik:
alias: [ik_analyzer]
type: ik
ik_max_word:
type: ik
use_smart: false
ik_smart:
type: ik
use_smart: true
index.analysis.analyzer.default.type: ik

第三方库

elasticsearch-mapper-attachments

https://github.com/elastic/elasticsearch-mapper-attachments

通过elasticsearch-mapper attachment插件实现文件建立索引

elasticsearch索引文档-attachment

tika

Tika文本提取工具的使用(word、pdf、excel等)

Apache Tika:通用的内容分析工具

【NLP】Tika 文本预处理:抽取各种格式文件内容

Tika教程

基于内容的推荐

more like this 关键字段

使用

1)在java中使用elasticSearch

https://www.elastic.co/blog/found-java-clients-for-elasticsearch

官方java api的翻译版

https://endymecy.gitbooks.io/elasticsearch-guide-chinese/content/java-api/README.html

源码 api : http://javadoc.kyubu.de/elasticsearch/v1.7.3/

1.native client

elasticsearch 2种客户端的区别

ElasticSearch 之 Client

2.jest

elasticsearch RESTful搜索引擎-(java jest 使用[入门])

3.spring-data-elasticsearch

spring-data-elasticsearch git地址

spring-data-elasticsearch gitBook

实例

调用restful api

ElasticSearch实战-编码实践

java api实例

用elasticsearch为你的项目提供垂直搜索服务

应用

1)es小结 : Elasticsearch学习,请先看这一篇

2)Elasticsearch 现在主要的应用场景有三块。

1.站内搜索,主要和 Solr 竞争,属于后起之秀。

2.NoSQL json文档数据库,主要抢占 Mongo 的市场,它在读写性能上优于 Mongo(见文末比较链接),同时也支持地理位置查询,还方便地理位置和文本混合查询,属于歪打正着。

3.监控,统计以及日志类时间序的数据的存储和分析以及可视化,这方面是引领者。

开源搜索引擎评估:lucene sphinx elasticsearch

源码分析

建议阅读源码

搜索引擎框架-elasticsearch

系列教程

elasticsearch口水篇

分布式搜索Elasticsearch——项目过程(二)

restful系列教程

(ElasticSearch权威教程)ElasticSearch 2

java api系列教程

ElasticSearch的Java API

elasticsearch

教程

elasticsearch教程

使用java访问elasticsearch创建索引

Elasticsearch,为了搜索

Elasticsearch学习笔记

搜索引擎solr和elasticsearch

使用 Elasticsearch 实现博客站内搜索

问题:

elasticsearch出现TranslogCorruptedException导致shard不能启动的问题修复

配置远程访问:

在服务器的es的config文件里面把network.host改为0.0.0.0

ES集群遇到的问题

es启动出现问题

一定不要用ctrl+z,要ctrl+c去停止,前者只是暂停,不是终止。

CTRL-Z和CTRL-C都是中断命令,但是他们的作用却不一样.
CTRL-C是强制中断程序的执行,
而CTRL-Z的是将任务中断,但是此任务并没有结束,他仍然在进程中他只是维持挂起的状态,用户可以使用fg/bg操作继续前台或后台的任务,fg命令重新启动前台被中断的任务,bg命令把被中断的任务放在后台执行.
例如:
当你vi一个文件是,如果需要用shell执行别的操作,但是你又不打算关闭vi,因为你得
存盘推出,你可以简单的按下CTRL-Z,shell会将vi进程挂起~,当你结束了那个shell操作之后,你可以用fg命令继续vi你的文件.

ctrl-d: ( Terminate input, or exit shell ) 一个特殊的二进制值,表示 EOF,作用相当于在终端中输入exit后回车;

Elasticsearch与mysql的实时增量更新

想要增量同步,有一些先决条件。首先数据库中要维护一个update_time的时间戳,这个字段表示了该记录的最后更新时间。然后定时执行一个任务,这个任务中执行的sql就是根据时间戳判断该记录是否应该被更新。

出自系列教程深入理解elasticsearch

将mysql导入到es中

常用的插件是elasticsearch-jdbc, elasticsearch-river-MySQL , Go-mysql-elasticsearch, logstash-input-jdbc这四种。之间的比较参见这篇mysql 与elasticsearch实时同步常用插件及优缺点对比

logstash-input-jdbc

使用logstash将数据库的数据导入elasticsearch

参数说明参见:logstash input jdbc连接数据库

logstash-input-jdbc实现mysql 与elasticsearch实时同步深入详解

官方说明:

https://www.elastic.co/guide/en/logstash/current/plugins-inputs-jdbc.html#plugins-inputs-jdbc-type

https://github.com/logstash-plugins/logstash-input-jdbc

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
input {
jdbc {
jdbc_driver_library => "/path/to/mysql-connector-java-5.1.33-bin.jar"
jdbc_driver_class => "com.mysql.jdbc.Driver"
jdbc_connection_string => "jdbc:mysql://host:port/database"
jdbc_user => "user"
jdbc_password => "password"
# or jdbc_password_filepath => "/path/to/my/password_file"
clean_run => false
use_column_value => true
tracking_column => BUG_ID
record_last_run => true
last_run_metadata_path => "/etc/logstash/run_metadata.d/my_info"
lowercase_column_names => false
statement_filepath => "/etc/logstash/statement_file.d/my_info.sql"
schedule => "* * * * *"
jdbc_paging_enabled => "true"
jdbc_page_size => "50000"
type => "es_type"
}
}
filter {
[some filters here]
}
output {
stdout {
codec => rubydebug
}
elasticsearch_http {
host => "host"
index => "es_index"
}
}
将不同类型的数据导入到elasticsearch中

如何将不同类型数据导入Elaticsearch中

linux

发表于 2016-10-08   |   分类于 linux   |  

Linux

首次安装ubuntu遇到的几个问题

如何设置停止更新支持的ubuntu更新源

Ubuntu 更新Source.list源

VIM

javaWeb

发表于 2016-09-26   |   分类于 web   |  

JAVA EE

1.目录结构

1.1 maven目录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
${basedir}
src
main
java 源文件
resources 资源文件
filters 资源过滤文件
config 配置文件
scripts 脚本文件
webapp web应用文件,/WEB-INF
test
java 测试源文件
resources 测试资源文件
filters 测试资源过滤文件
it 集成测试
assembly 组件(Assembly)描述符所在的目录
site 站点文件
target
generated-sources
classes /resources目录下的也在此
generated-test-sources
test-classes
xxx.jar
+ project-1.0
| + META-INF
| + WEB-INF
| | + classes
| | * web.xml
| * index.jsp
+ maven-archiver
* pom.properties
+ war
+ work
| | * webapp-cache.xml
* project.war
pom.xml
LICENSE.txt
NOTICE.txt 该项目依赖的库的注意事项
README.txt

构建Maven项目的时候,如果没有进行特殊的配置,Maven会按照标准的目录结构查找和处理各种类型文件。

src/main/java和src/test/java

这两个目录中的所有*.java文件会分别在comile和test-comiple阶段被编译,编译结果分别放到了target/classes和targe/test-classes目录中,但是这两个目录中的其他文件都会被忽略掉。

src/main/resouces和src/test/resources

这两个目录中的文件也会分别被复制到target/classes和target/test-classes目录中。

target/classes

打包插件默认会把这个目录中的所有内容打入到jar包或者war包中。

以上参见maven资源文件的相关配置

1.2 tomcat的目录

1
2
3
4
5
6
7
bin:存放各种不同平台开启与关闭Tomcat的脚本文件。
lib:存tomcat与web应用的Jar包
conf:存放tomcat的配置文件
webapps:web应用的发布目录
work:tomcat把由各种jsp生成的servlet文件存放的地方
logs:tomcat存放日志文件的地方
temp:tomcat存放临时文件的地方

1.3 web的目录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
—war/
+ META-INF/
+ WEB-INF/
| + classes/
| | + ServletA.class
| | + config.properties
| | + ...
| + lib/
| | + XXX.jar
| + web.xml
+ img/
+ css/
+ js/
+ index.html
+ sample.jsp

在Eclipse中开发j2ee项目,所有的jsp文件都是放在WebRoot目录下面,用户需要把所有用到的jar包放到WEB-INF(WebRoot的子目录)目录下的lib目录下(这就是没有用maven管理的缺点,所有jar都要自己去找);Eclipse编译时,会把Java源代码产生的class文件放到WEB-INF目录的classes目录下。所以大家在应用服务器中指定虚拟目录时,直接指定到这个WebRoot目录就行了,这样在调试过程中,如果只修改了jsp文件,则不需要重启服务器,刷新页面,就可以看到修改后的效果。

参见更改maven打包文件的默认输出

2.部署问题

在Eclipse中,默认会把Web项目放到Eclipse的工作空间下的.metadata.plugins\org.eclipse.wst.server.core\tmp0(或者是tmp1)\wtpwebapps\下。可以在项目的部署那修改server Location,则会部署到tomcat的webapps目录下,这样就不需要启动eclipse,直接去访问tomcat目录的web项目了。当然如果是maven项目,则直接把war包拷贝到tomcat的发布目录下就可。

2.1 Tomcat部署Web应用方法总结

在Tomcat中部署Java Web应用程序有两种方式:静态部署和动态部署。

2.1.1 静态部署

1.利用Tomcat自动部署

将PetWeb目录拷贝到$CATALINA_HOME/webapps下,然后启动服务器就可以了,Tomcat启动时将自动加载应用。

2.修改Server.xml文件部署

3.增加自定义web部署文件

4.Web应用以.war文件的形式部署

2.1.2 动态部署

动态部署是指可以在服务器启动之后部署web应用程序,而不用重新启动服务器。动态部署要用到服务器提供的manager.war文件。

详细参见 Tomcat部署Web应用方法总结

创建SSM项目

编写高质量代码-改善java程序的151个建议

发表于 2016-09-22   |   分类于 java   |  

编写高质量代码-改善java程序的151个建议

vps

发表于 2016-09-21   |   分类于 other   |  

vps

vps新手入门全攻略:基础知识,选购,配置环境,日常管理及精品vps主机商推荐

VPS新手指南/教程(很详细地列出了各个方面需要的知识)

如何在 VPS 上搭建 VPN 来翻墙

从零开始VPS (一): 挑个好的服务器

xpath

发表于 2016-09-20   |   分类于 web   |  

xpath

在标准的xpath里面,text()可以获取当前节点下所有的文本,但是xsoup只能获取当前节点下的文本,如果文本嵌套在子孙节点,就无法获取,必须调用allText(),tidyText()等方法。另外,轴,如child::node()在标准里面是可以的,但是在框架里面是不行的。
参考:

JsoupXpath
抽取工具简介

java 核心技术I卷

发表于 2016-09-19   |   分类于 java   |  

JAVA核心技术I卷

第五章

5.1 类、超类和子类

5.1.4 阻止继承:final类和方法

final类里面,所有的方法默认都是final类型的,但是成员变量不是这样。

5.1.5 强制类型转换

在Java中由于继承和向上转型,子类可以非常自然地转换成父类,但是父类转换成子类则需要强制转换。因为子类拥有比父类更多的属性、更强的功能,所以父类转换为子类需要强制。那么,是不是只要是父类转换为子类就会成功呢?其实不然,他们之间的强制类型转换是有条件的。

当我们用一个类型的构造器构造出一个对象时,这个对象的类型就已经确定的,也就说它的本质是不会再发生变化了。在Java中我们可以通过继承、向上转型的关系使用父类类型来引用它,这个时候我们是使用功能较弱的类型引用功能较强的对象,这是可行的。但是将功能较弱的类型强制转功能较强的对象时,就不一定可以行了。

举个例子来说明。比如系统中存在Father、Son两个对象。首先我们先构造一个Son对象,然后用一个Father类型变量引用它:

Father father = new Son();

在这里Son 对象实例被向上转型为father了,但是请注意这个Son对象实例在内存中的本质还是Son类型的,只不过它的能力临时被消弱了而已,如果我们想变强怎么办?将其对象类型还原!

Son son = (Son)father;

这条语句是可行的,其实father引用仍然是Father类型的,只不过是将它的能力加强了,将其加强后转交给son引用了,Son对象实例在son的变量的引用下,恢复真身,可以使用全部功能了。

前面提到父类强制转换成子类并不是总是成功,那么在什么情况下它会失效呢?  

当引用类型的真实身份是父类本身的类型时,强制类型转换就会产生错误。例如:

Father father = new  Father();

Son son = (Son) father;

这个系统会抛出`ClassCastException异常信息。`

所以编译器在编译时只会检查类型之间是否存在继承关系,有则通过;而在运行时就会检查它的真实类型,是则通过,否则抛出ClassCastException异常。

所以在继承中,子类可以自动转型为父类,但是父类强制转换为子类时只有当引用类型真正的身份为子类时才会强制转换成功,否则失败。

以上参见java提高篇(十一)—–强制类型转换

所以在将超类转换为子类之前,应该使用instanceof进行检查.

5.1.6抽象类

抽象类里面不全是抽象方法,也可以有非抽象方法。

5.2 Object:所有类的超类

5.2.1 equals方法

1.equals():

超类Object中有这个equals()方法,该方法主要用于比较两个对象是否相等。使用Object的equals()方法是比较两个对象的内存地址是否相等,即若object1.equals(object2)为true,则表示equals1和equals2实际上是引用同一个对象。但是我们必须要清楚我们很大部分时间都是进行两个对象的比较,这个时候Object的equals()方法就不可以了,实际上JDK中,String、Math等封装类都对equals()方法进行了重写。如String的equals()方法是进行内容比较,而不是引用比较。

2.在equals()中使用getClass进行类型判断:

我们在覆写equals()方法时,一般都是推荐使用getClass来进行类型判断,不是使用instanceof。

参见java提高篇(十三)—–equals()方法总结

3.equals()与==

  1. 使用==比较原生类型如:boolean、int、char等等,使用equals()比较对象。
  2. ==返回true如果两个引用指向相同的对象,equals()的返回结果依赖于具体业务实现。
  3. 字符串的对比使用equals()。

参见equals与”==”的区别

5.2.2 相等测试与继承

如何判断两个object相等,参见文中这章节。

5.5参数数量可变的方法

…表示可以接收任意数量的参数,如printf(String fmt,Object… args),这里的Object…相当于Object[]。

5.7 反射

第六章 接口和内部类

6.1 接口

接口中的方法默认都是public的,可以包含常量,被自动设为public static final。

Arrays类中的sort方法可以对对象数组进行排序,但对象所属的类必须实现了Comparable接口。

6.2 对象克隆

当拷贝一个变量时,原始变量和拷贝变量引用同一个对象。

默认的拷贝是浅拷贝,如果是基本类型则拷贝没有问题,但它并没有克隆包含在对象中的内部对象。如果在对象中包含了子对象的引用,拷贝的结果会使得两个域引用同一个子对象。要实现深拷贝,则要实现cloneable接口。

6.3 接口和回调

6.4 内部类

为什么使用内部类?

1.内部类可以访问该类所在作用域的数据,包括私有的数据;

2.可以对同一个包中的其他类隐藏起来;

3.匿名内部类实现回调。

6.4.5 由外部方法访问final变量

当某个变量为final,但又不得不进行修改时,可以使用一个数组。参见本节例子。

6.5 代理

第12章 泛型程序设计。。。

第13章 集合

13.2 具体的集合

LinkedList使用ListIterator来遍历。虽然可以通过get(index)来随机获取元素,但是效率非常低,每次都要从头开始遍历到指定位置。所有如果需要随机访问,建议数组或arrayList。

第14章 多线程

14.3 线程状态

14.3.4 被终止的线程

join():等待指定线程的中止。参见浅析 Java Thread.join()

14.4 线程属性

14.4.2 守护线程

参见Java中守护线程的总结

在Java中有两类线程:User Thread(用户线程)、Daemon Thread(守护线程) 。用个比较通俗的比如,任何一个守护线程都是整个JVM中所有非守护线程的保姆:只要当前JVM实例中尚存在任何一个非守护线程没有结束,守护线程就全部工作;只有当最后一个非守护线程结束时,守护线程随着JVM一同结束工作。

Daemon的作用是为其他线程的运行提供便利服务,守护线程最典型的应用就是 GC (垃圾回收器),它就是一个很称职的守护者。

User和Daemon两者几乎没有区别,唯一的不同之处就在于虚拟机的离开:如果 User Thread已经全部退出运行了,只剩下Daemon Thread存在了,虚拟机也就退出了。 因为没有了被守护者,Daemon也就没有工作可做了,也就没有继续运行程序的必要了。

定义:守护线程–也称“服务线程”,在没有用户线程可服务时会自动离开。
优先级:守护线程的优先级比较低,用于为系统中的其它对象和线程提供服务。
设置:通过setDaemon(true)来设置线程为“守护线程”;将一个用户线程设置为
守护线程的方式是在 线程对象创建之前用线程对象的setDaemon方法。
example: 垃圾回收线程就是一个经典的守护线程,当我们的程序中不再有任何运行的Thread,程序就不会再产生垃圾,垃圾回收器也就无事可做,所以当垃圾回收线程是JVM上仅剩的线程时,垃圾回收线程会自动离开。它始终在低级别的状态中运行,用于实时监控和管理系统中的可回收资源。
生命周期:守护进程是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。也就是说守护线程不依赖于终端,但是依赖于系统,与系统“同生共死”。那Java的守护线程是什么样子的呢。当JVM中所有的线程都是守护线程的时候,JVM就可以退出了;如果还有一个或以上的非守护线程则JVM不会退出。

14.4.3 未捕获异常处理器

面试准备

发表于 2016-09-18   |   分类于 other   |  

面试准备

java高级特性

1.Java的数据结构相关的类实现原理,比如LinkedList,ArrayList,HashMap,TreeMap这一类的

2.Java并发包当中的类,它们都有哪些作用,以及它们的实现原理,这些类就是java.concurrent包下面的。

3.IO包和NIO包中的内容。这部分里面NIO会是重点。

4.Java的虚拟机的内容。这部分主要包括三部分,GC、类加载机制,以及内存。

额外加分项
  1. 计算机系统原理。
  2. 网络通信协议(TCP/IP,HTTP等)。
  3. 数据结构与算法。
  4. 著名开源项目的源码。
  5. 你自己有很棒的开源项目。
  6. 你的个人博客。

参见如何准备阿里社招面试,顺谈 Java 程序员学习中各阶段的建议

题库

最近5年133个Java面试问题列表

一些有用的网站

ImportNew

Quartz

发表于 2016-09-18   |   分类于 web   |  

Quartz

简介

Quartz 是 OpenSymphony 开源组织在任务调度领域的一个开源项目,完全基于 Java 实现。

Quartz应用与集群原理分析

基于 Quartz 开发企业级任务调度应用

web crawler

发表于 2016-09-08   |   分类于 web   |  

web crawler

1.增量抓取

不简单的URL去重

“知了”优化 - WebMagic 调优

爬虫:5.增量爬取和去重

垂直型爬虫

垂直爬虫不同于通用爬虫,其目的在于解决如何快速高效定制,精确抽取网页内容,并保存为结构化数据。

登录

cookie的处理

Python爬虫入门六之Cookie的使用

1.opener

1
2
3
4
5
6
7
8
9
10
11
12
import cookielib
#声明一个CookieJar对象实例来保存cookie
cookie = cookielib.CookieJar()
#利用urllib2库的HTTPCookieProcessor对象来创建cookie处理器
handler=urllib2.HTTPCookieProcessor(cookie)
#通过handler来构建opener
opener = urllib2.build_opener(handler)
#此处的open方法同urllib2的urlopen方法,也可以传入request
response = opener.open('http://www.baidu.com')
for item in cookie:
print 'Name = '+item.name
print 'Value = '+item.value

2.cookielib

cookielib模块的主要作用是提供可存储cookie的对象,以便于与urllib2模块配合使用来访问Internet资源。Cookielib模块非常强大,我们可以利用本模块的CookieJar类的对象来捕获cookie并在后续连接请求时重新发送,比如可以实现模拟登录功能。该模块主要的对象有CookieJar、FileCookieJar、MozillaCookieJar、LWPCookieJar。它们的关系:CookieJar —-派生—->FileCookieJar —-派生—–>MozillaCookieJar和LWPCookieJar

Python 爬虫Cookie的处理

1.使用python自带的模块cookielib

2.requests通过session来保持cookies,自动存入文件和从文件中导入.

Python中Cookie的处理:自动处理Cookie,保存为Cookie文件,从文件载入Cookie

Python中自动处理Cookie,将Cookie保存到文件,从文件中读取Cookie。

模拟浏览器实现登录

爬虫之登陆验证

​ 关于模拟浏览器的介绍写得很详细。

实例

模拟登录一些知名的网站,为了方便爬取需要登录的网站

代理

https://proxy.peuland.com的代理脚本:

https://github.com/mapleray/proxy_pool/blob/master/proxy.py

request库

Python Requests库:HTTP for Humans

工具列表

Python 爬虫的工具列表 附Github代码下载链接

项目实例

使用 Python 轻松抓取网页

知乎专栏里面有很多。如:

手把手教你写电商爬虫-第一课 找个软柿子捏捏

要点总结

Python爬虫的一些总结

常用库:

  • 抓取网页: 常用的有requests, urllib.
  • 解析: BeautifulSoup, lxml, re.
  • 框架: scrapy, pyspier.
  • url去重: bloomfilter
  • 图片处理: Pillow
  • OCR: Google 的 OCR 开源库 tesseract,对应的Python包是pytesser.
  • 代理: 代理Tor, PySocks
  • 消息队列: rabbitmq

要点:

异步爬取:

​ 可以使用grequests库,或者对于简单的爬虫,tornado文档有个demo,稍微改下自己用。

模拟浏览器:

​ 给请求加上header信息

提交表单:

​ 一般是查找html源代码找到form,然后看form提交的地址,就可以直接使用requests的post方法提交数据。

模拟登录:

​ requests有个Session模块,使用起来很方便。有些网站如果是需要登录的,我们可以直接把登录后自己的cookies复制下来,直接作为requests的cookies参数传进去。

验证码:

​ ocr

动态加载:

​ 1)追踪发出的请求,直接模拟 2)selenuim + phantomJS

Python 爬虫进阶必须的几步

  1. requests 模块, beautifulsoup模块, css选择器语法, re 正则模块, http 头编写, cookies, json解析等一定要掌握至熟练及以上程度.
  2. 爬取重 ajax 页面, 推荐谷歌优先搜索 phantomjs, 其次selenium.
  3. 破解图片验证码, 推荐谷歌开源库 pytesser, 进一步深入可以学习<高等数学-线性代数>, 谷歌搜索 pandas, numpy, k近邻算法.
  4. 过滤器, 推荐布隆过滤器 .
  5. 分布式爬虫(消息队列). 推荐 rabbitmq.
  6. 任务调度. 推荐谷歌搜索 schedule.

进阶的第一门课一定得是学会自己抓包,分析请求和返回数据。这当中会有一些字段恶心到你,比如通过base64或者md5加密,在模拟登陆验证中通常还会遇到RSA算法。如果你说你懒得学,那么上大杀器Selenium,但是你要忍受它对系统资源的占用(往往要启动浏览器和多个标签页)和不那么快速的爬取速度。

针对一些网站的爬取就像是在玩攻防,网站设置了种种反抓取的坑等着你掉进去。这时候你要学会维护好自己的User-Agent,维护好自己的Cookie池,维护好自己的代理IP池,添加恰当的Host和Referer,以让对方服务器觉得这一切看起来都跟真的一模一样,那么你的爬虫开发能力,已经入门了。

到此为止,这些知识还和 Python 没有半毛关系,但你知道了要干什么之后,再去搜 Python 相关的工具库,你就会发现原来 Requests 可以轻松构造一个包含自定义 payload 和 headers 的 post 请求;你就会发现原来 Scrapy 中可以使用TCP包注入来伪造IP,还能玩SYN FLOOD拒绝服务攻击(误)……

Python爬虫:一些常用的爬虫技巧总结

1.cookies处理

cookies是某些网站为了辨别用户身份、进行session跟踪而储存在用户本地终端上的数据(通常经过加密),python提供了 cookielib模块用于处理cookies,cookielib模块的主要作用是提供可存储cookie的对象,以便于与urllib2模块配合使用 来访问Internet资源。

关键在于CookieJar(),它用于管理HTTP cookie值、存储HTTP请求生成的cookie、向传出的HTTP请求添加cookie的对象。整个cookie都存储在内存中,对 CookieJar实例进行垃圾回收后cookie也将丢失,所有过程都不需要单独去操作。

综合教程

Python爬虫学习系列教程

爬虫

python爬虫开发

Python入门网络爬虫之精华版

爬虫入门讲解:基础理论篇

1…4567
Qi Liu

Qi Liu

Less is More

69 日志
11 分类
63 标签
© 2018 Qi Liu
由 Hexo 强力驱动
主题 - NexT.Pisces