More Related Content Similar to 20151021联动技术大讲堂35(刘胜)网络爬虫技术实战 Similar to 20151021联动技术大讲堂35(刘胜)网络爬虫技术实战 (20) 20151021联动技术大讲堂35(刘胜)网络爬虫技术实战2. 2
1 大纲
概念
爬虫、反爬虫、反反爬虫
动态网页
访问代理:静态代理,动态代理
URL处理:去重复、相似性
架构
Scrapy架构
分布式爬虫架构
实战
爬虫语言
网站死链接
贷联盟
安全漏洞预警
3. 3
爬虫
概念
网络爬虫 WebCrawler
网页蜘蛛 Spider
网络机器人 Robot
网络蚂蚁/蠕虫
自动索引/模拟程序
功能
按照一定策略,自动地抓取万维网信息的程序或者脚本。
4. 4
反爬虫
技术
手工识别和拒绝爬虫的访问
通过识别爬虫的User-Agent和Referer等信息来拒绝爬虫
通过网站流量统计系统和日志分析来识别爬虫
网站的实时反爬虫防火墙实现
通过JS算法,文字经过一定转换后才显示出来,容易被破解。
通过JS不让用户复制,这对非专业人员有效,对技术人员/工程师来说
,没有任何效果。
通过CSS隐藏技术,可见的页面样式和HTML里DIV结构不同,增加了
爬虫的难度,同时增加自己的维护难度。
通过flash等插件技术(会被破解,对用户/移动终端不友好)。
图片化
A:将文字图片化,增加了维护成本,和移动端的可读性
B:将标点符号图片化,再适当增加CSS混淆,这是一种较好的办法,不影响
搜索引擎收录,不影响用户使用。但影响爬虫,是一种较好的反爬虫方式,
某著名的文学网站采用了这种方法
6. 6
动态网页
静态网页(Web 1.0 时代)
对象:基本HTML。
实现:在python中可用urllib2或requests模块实现功能。
动态网页(Web 2.0 时代)
对象:分析经过js处理和ajax获取内容后的页面。
实现——基于WebKit模块
PYQT4,Splinter,Selenium
实现——基于Headless Browser
HtmlUnit,Phantomjs
实战:
以动静两种方式分析 www.sina.com.cn 主页的链接数。
7. 7
访问代理
实现改进——
class MyHttp:
class MyHttpProxy(MyHttp):
# 随机多个代理 ,两种策略(random | polling)
def setProxies(self, proxies=[]):
class MyHttpProxy4File(MyHttpProxy):
# 自动加载更新代理配置文件
def setConfig(self, fname='proxies.ini'):
class MyHttpProxy4Conf(MyHttpProxy4File):
# 根据MyEnv更新配置
def reConfig(self):
其他——自动选择代理
查找代理、验证代理、代理测速、…
8. 8
优先策略
IP地址搜索策略
起始IP地址 遍历IP地址段
深度优先搜索策略
广度优先搜索策略
最好优先搜索策略
每次选择“最有价值”的链接进行访问
预测候选URL与目标网页的相似度,或与主题的相关性,并选取评价
最好的一个或几个URL进行抓取。
它只访问经过网页分析算法预测为“有用”的网页。
问题:仅是一种局部最优搜索算法,在爬虫抓取路径上的很多
相关网页可能被忽略。
9. 9
URL去重复
方法
Hash表
URL压缩
BloomFilter算法
补充:
Python中hashlib,自带多种hash函数,有MD5,sha1,
sha224,sha256,sha384,sha512。
Python中,可以使用jaybaird提供的BloomFilter接口,或
者自己造轮子
10. 10
URL相似性
合成URL
绝对地址 http://x.x.x/...
相对地址 /path/index.html
相对地址 login.html
相对地址 <base href="http://x.x.x/umpay_cms/" />
工具方法 from urlparse import urljoin
检测URL
检查host域名
检查目录深度(以’/’分割)
检查特征字符串:前缀,后缀
11. 11
并发性
多线程模型
import threading
from threading import Thread,Lock,stack_size
from Queue import Queue
多进程模型
from multiprocessing import Pool
from multiprocessing.dummy import Pool as Poo2
协程模型(eventlet,gevent,Stackless)
from eventlet import GreenPool
12. 12
日志
%(asctime)s 当前时间,默认格式是“2003-07-08 16:49:45,896”
%(created)f 当前时间,用UNIX标准的表示时间的浮点数表示
%(relativeCreated)d 输出日志信息时,自Logger创建以来的毫秒数
%(name)s Logger的名字(注意其准确性)
%(message)s 用户输出的消息
%(filename)s 调用日志输出函数的模块的文件名
%(module)s 调用日志输出函数的模块名 【与filename类似】
%(pathname)s 调用日志输出函数的模块的完整路径名,可能没有
%(funcName)s 调用日志输出函数的函数名 【无需在message中重复】
%(lineno)d 调用日志输出函数的语句所在的代码行
%(levelno)s 数字形式的日志级别
%(levelname)s 文本形式的日志级别
%(thread)d 线程ID。可能没有
%(threadName)s 线程名。可能没有
%(process)d 进程ID。可能没
class MyLog: …
FMT= '%(asctime)s %(process)5d:%(threadName)-12s %(module)12s %(lineno)4d
%(name)14s.%(funcName)-16s %(levelname)-7s - %(message)s‘
——MyLog要点——
设置basicConfig记文件
在Logger中记stdout
注意name的准确性
13. 13
异常
常见异常
1. HTTPError:HTTP Error 400: Bad Request
2. HTTPError:HTTP Error 404: Not Found
3. getaddrinfo [Errno 10054] 远程主机强迫关闭现有连接
4. URLError:<urlopen error [Errno 11004]
5. URLError: <urlopen error timed out>
6. timeout: timed out
异常处理:
不再重试 400,404
延迟重试 10054,11004,urlopen time out
重试多次 receive timeout
14. 14
2 架构
概念
爬虫、反爬虫、反反爬虫
动态网页
动态代理
URL处理:去重复、相似性
架构
Scrapy架构
分布式爬虫架构
实战
爬虫语言
网站死链接
贷联盟
安全漏洞预警
17. 17
概念
爬虫、反爬虫、反反爬虫
动态网页
动态代理
URL处理:去重复、相似性
架构
Scrapy架构
分布式爬虫架构
实战
爬虫语言
网站死链接
贷联盟
安全漏洞预警
3 实战
18. 18
编程语言(Python)
编程语言
依赖管理(Python)
Easy_install pip BitVector
Pip install pyquery eventlet web.py flask scrapy
C# Java Python PHP
设计思路 面向对象 面向对象 面向对象 结构化
语言特点 强类型
+编译型
强类型
+编译型
+即时编译
弱类型/脚本语言
+编译型 pyc/pyo
+解释型 py
+即时编译 pypy
弱类型
+解释型
开放性 CLR JVM Cpython,Jython,PyPy
依赖管理 jar pip,eztools
类库 少 较多 丰富
典型用户 微软 。。。 Google
19. 19
实战一:网站死链接
功能:
将开始URL加入队列;
从队列获取URL;访问URL地址;分析响应中所有链接;加入队列;
相关组件:
页面解析器 from sgmllib import SGMLParser
过滤器组件 from _bs4pylib import BloomFilter
队列组件 from Queue import Queue
线程组件 from threading import Thread,Lock
class Track4WebLinks: (略)
class UrlParser(SGMLParser):
def __init__(self, accepts, ignores):
def reset(self):
def feed(self, data):
def do_a(self,attrs):
def do_link(self,attrs):
def do_base(self,attrs):
def getUrls(self, urlbase, data):
class Track4WebLinks: (略)
class UrlParser4PQ():
def __init__(self, accepts, ignores):
def feed(self, data):
def getUrls(self, urlbase, data):
21. 21
贷联盟1:公开信息
任务1:获取公开的P2P黑名单
输出: 爬取171页,总共2556条黑名单信息
问题:
1,未抓取来源页面信息 —— 预期天数?
网站:拍拍贷, e速贷,都能贷,开开贷,大家贷,…
2,未抓取未展现的信息 —— 存在75万?
方法:1)注册;2)搜索;3)遍历(62^6=56800235584)
http://www.dailianmeng.com/p2pblacklist/index.html?P2pBlacklist_page=171
{"d_date": "2013-03-19", "w_addr": "", "d_num": "1年", "h_tel": "", "c_addr": "",
"h_addr": "", "id_old": "39岁", "w_tel": "", "id_birth": "1975-10-21", "debts":
"4800.00", "id": "321088197510217315", "id_addr": "江苏省扬州市江都市", "qqno": "",
"email": "394634614@qq.com", "i_url":
"http://www.ppdai.com/blacklistdetail/jdjuliang11", "d_amt2": "739.25", "d_amt1":
"2782.54", "w_name": "", "id_sex": "男", "name": "蒋余成", "url":
"http://www.dailianmeng.com/p2pblacklist/view/22Qfui.html", "i_src": "拍拍贷",
"mobile": "18952514868"}
22. 22
贷联盟2:搜索20万
任务2:搜索P2P黑名单
输入:10万身份证号,找到1条记录(重复)
输入: 10万姓名,找到600多条。
找到了很多民间借贷失信人(老赖),法院失信人
部分姓名重复,部分姓名不正常
问题:大批量数据如何处理——?
多并发:多线程、多进程、多协程
多出口:动态代理,动态配置
可中断:断点恢复
{"err": "HTTP Error 404: Not Found", "key": "?㈢?"}
{"err": "HTTP Error 404: Not Found", "key": "??亮"}
{"err": "HTTP Error 404: Not Found", "key": "?信行"}
{"url": "http://www.dailianmeng.com/p2pblacklist/view/baeyUv.html", "key":
"533522198710011010", "name": "陈安云", "mobile": "18988310000"}
http://www.dailianmeng.com/xinyong/q/370825196303140767.html
http://www.dailianmeng.com/xinyong/q/%E5%88%98%E6%96%8C.html
23. 23
贷联盟3:搜索318万
任务3:根据318万姓名搜索
功能1:查找 P2P、老赖、法院黑名单网址并保存;
功能2:解析P2P、老赖黑名单详情;
功能3:中断恢复机制
其他数据来源:
12306数据131万
开房数据2000万
{"url": "http://www.dailianmeng.com/p2pblacklist/view/ZVJ7Z3.html", "name": "刘斌",
"i_src": "拍拍贷", "mobile": "13315703369", "d_date": "2012-11-07", "h_addr": "河北省
黄骅市建设大街工行家属楼", "debts": "4800.00", "id": "132930198001020076", "id_old":
"35岁", "id_addr": "河北“, "email": "zjwuwk@sohu.com"}
{"url": "http://www.dailianmeng.com/xinyong/view/MvEvyi.html", "id":
"410703197902084019", "name": "*斌"}
{“url”: “http://www.dailianmeng.com/court_blacklist/view/zeqABr.html”, “id”:
“3522021981****3013”, “name”: “刘斌“}
24. 24
贷联盟4:遍历方式
任务4:分析网址规律,遍历所有网址
分析1:
三类黑名单:不同前缀
字符:包含62字符
组合:62^6=56800235584
网址:568亿(*3)
天数:*/24/3600/10=65741天
等等。。。
http://www.dailianmeng.com/p2pblacklist/view/EBzqEv.html
http://www.dailianmeng.com/xinyong/view/MvEvyi.html
http://www.dailianmeng.com/court_blacklist/view/zeqABr.html
22Qfui 22a63u 22yiq2 263YFb 263iMb
26VJvy 26ZrEj 2A7Jzu 2ABB3u 2ANF7r
2AVniq 2EBbmy 2EVjay 2Ezqam 2I3Mju
2INfE3 2IZzy2 2IbQby 2Ibmyy 2MVjQf
2MbEna 2MjYny 2MzYJ3 2Q7jqq 2QFrIf
2QNjUn 2QZJbu 2QbMVn 2Qbyea 2QfUNv
2QnERz 2UBruu 2UNVVn 2UNbEz 2UjeYj
2UjiIz 2Uneya 2Uzm2m 2Y77Bb 2YFNj2
2YFVFb 2YVnAr 2YjMNz 2aIbyu 2aQ7Jr
2aUfiy 2aYvmy 2aeq6f 2auiim 2ayyum
…
分析2:
包含[2367,abefijmnqruvyz,ABEFIJMNQRUVYZ]…4+14+14
排除[014589,cdghklopstwx,CDGHKLOPSTWX]
组合:32^6=10亿,32^3=3.3万
实验:22a,2Uj,…
26. 26
实战三:安全漏洞预警
任务:采用爬虫技术进行安全漏洞预警
http://www.wooyun.org/ 乌云网
http://loudong.360.cn/ 360补天
http://www.cnvd.org.cn/ 国家信息安全漏洞共享平台
https://www.vulbox.com/board 漏洞盒子
…
网址 http://www.wooyun.org/bugs/new_submit/page/5 最新提交
http://www.wooyun.org/bugs/new_public/page/5 最近公开
http://www.wooyun.org/bugs/new_alarm/page/5 最新预警
http://www.wooyun.org/bugs/new_confirm/page/5 最新确认
http://www.wooyun.org/bugs/new_unclaimed/page/5 最新
http://www.wooyun.org/bugs/page/3706 (全部)
http://loudong.360.cn/vul/list/page/2938 最新
http://loudong.360.cn/vul/list-more/state/5/page/2386 安全事件
http://loudong.360.cn/vul/list-more/state/0/page/629 通用漏洞
http://loudong.360.cn/vul/list-more/state/4/page/533 厂商确认
http://loudong.360.cn/vul/list-more/state/7/page/1461 付款漏洞
http://loudong.360.cn/vul/list-more/state/8/page/6103 (全部)
27. 27
结果展示输出
需求1:漏洞预警系统
发送电子邮件
提供Web访问:
功能:1)触发Checker检测;1)搜索结果
Pip install web.py flask
http://localhost:8888/
需求2:漏洞检索平台
提供全文搜索(ElasticSearch)
http://10.10.67.45:9200/
http://10.10.67.45:9200/_plugin/HQ/
http://10.10.67.45:9200/_plugin/bigdesk/
http://10.10.67.45:9200/_plugin/head/
28. 28
4 小节
爬虫技术评估
爬虫效率 单节点;中断恢复;
分布式规模 多节点;海量URL防重;
反反爬虫技术 可变地址;固定/动态代理;动态网页
与人斗,其乐无穷…