Web爬虫:多线程、异步与动态署理开始

访客5年前黑客文章584

在收集数据的时分,经常会碰到有反收集战略规矩的WAF,使得原本很简略工作变得复杂起来。黑名单、约束拜访频率、检测HTTP头号这些都是常见的战略,不按常理出牌的也有检测到爬虫行为,就往里注入假数据回来,以假乱真,但为了杰出的用户体会,一般都不会这么做。在遇有反收集、IP地址不行的时分,一般咱们想到的是运用很多署理处理这个问题,因署理具有时效、不稳定、拜访受限等不确定要素,使得有时分运用起来总会碰到一些问题。
进入正题,运用Python3简略完成一个单机版多线程/异步+多署理的爬虫,没有分布式、不谈高功率,先跑起来再说,脑补开端。。。
0×01 基础知识
1.1 署理类型
运用署理转发数据的一起,署理服务器也会改动REMOTE_ADDR、HTTP_VIA、HTTP_X_FORWARDED_FOR这三个变量发送给方针服务器,一般做爬虫的挑选优先级为高匿 > 混杂 > 匿名 > 通明 > 高透
高透署理(High Transparent Proxy):单纯地转发数据
REMOTE_ADDR = Your IP
HTTP_VIA = Your IP
HTTP_X_FORWARDED_FOR = Your IP
通明署理(Transparent Proxy):知道你在用署理,知道你IP
REMOTE_ADDR = Proxy IP
HTTP_VIA = Proxy IP
HTTP_X_FORWARDED_FOR = Your IP
匿名署理(Anonymous Proxy):知道你用署理,不知道你IP
REMOTE_ADDR = Proxy IP
HTTP_VIA = Proxy IP
HTTP_X_FORWARDED_FOR = Your Proxy
高匿署理(High Anonymity Proxy):不知道你在用署理
REMOTE_ADDR = Proxy IP
HTTP_VIA = N/A
HTTP_X_FORWARDED_FOR = N/A
混杂署理(Distorting Proxies):知道你在用署理,但你的IP是假的
REMOTE_ADDR = Proxy IP
HTTP_VIA = Proxy IP
HTTP_X_FORWARDED_FOR = Random IP
1.2 署理协议
一般有HTTP/HTTPS/Socks类型,Web爬虫一般只用到前面两者。
1.3 动态署理
完成动态署理一般是树立署理池,运用的时分一般有以下几种 ***
本地存储调用,将署理保存到数据库中,需求时载入,爬虫能够作为验证署理的一部分,但署理欠安的情况下功率并不高

署理会集转发,经过树立本地署理主动切换转发,调用便利,但需求做额定的署理验证程序

经过接口获取,一般经过购买服务获取,署理质量较佳,能够结合以上两种 *** 运用
1.4 多线程
多线程是完成使命并发的 *** 之一。在Python中完成多线程的计划比较多,最常见的是行列和线程类
que = queue.Queue()
def worker():
    while not que.empty():
        do(que.get())
threads = []
nloops = 256
# start threads
for i in range(nloops):
    t = threading.Thread(target=worker)
    t.start()
    threads.append(t)
# wait for all
for i in range(nloops):
    threads[i].join()
别的也能够运用map完成,map能够经过序列来完成两个函数之间的映射,并结合multiprocessing.dummy完成并发使命
from multiprocessing.dummy import Pool as ThreadPool
urls = ['http://www.freebuf.com/1',
        'http://www.freebuf.com/2']
pool = ThreadPool(256) # pool size
res  = map(urllib.request.urlopen, urls)
pool.close()
pool.join()
好像更简练,多线程完成还有其他 *** ,详细哪一种更好,不能混为一谈,但多线程操作数据库可能会发生很多的数据库TCP/socket衔接,这个需求调整数据库的更大衔接数或选用线程池之类的处理。
1.5 异步IO
asyncio是在Python3.4中新增的模块,它供给能够运用协程、IO复用在单线程中完成并发模型的机制。async/await这对关键字是在Python3.5中引进的新语法,用于协成方面的支撑,这无疑给写爬虫多了一种挑选,asyncio包含一下首要组件:
事情循环(Event loop)
I/O机制
Futures
Tasks
一个简略比如:
que = asyncio.Queue()
urls = ['http://www.freebuf.com/1',
        'http://www.freebuf.com/2']
async def woker():
    while True:
        q = await que.get()
        try:
            await do(q)
        finally:
            que.task_done()
async def main():
    await asyncio.wait([que.put(i) for i in urls])
    tasks = [asyncio.ensure_future(self.woker())]
    await que.join()
    for task in tasks:
        task.cancel()
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
loop.close()
运用行列是因为后边还要往里面回填数据,注:asyncio中的行列Queue不是线程安全的
0×02 获取与存储数据
2.1 加署理的GET恳求
多线程
署理类型支撑http、https,其他类型没有去测验
pxy = {'http': '8.8.8.8:80'}
proxy_handler = urllib.request.ProxyHandler(pxy)
opener = urllib.request.build_opener(proxy_handler)

[1] [2] [3]  黑客接单网

相关文章

腐朽的苹果:对一大波iCloud垂钓网站的监测与剖析

国外的FireEye实验室有一套主动化体系,这套体系可以主动侦测最新注册的歹意域名。所谓的歹意域名,绝大部分都是假装成很多人知道的常用域名,以此来到达“歹意”的目的。比方说假装成苹果公司的域名——Fi...

HTML5:<a>的ping特点之逝世ping与隐私追寻

在HTML5中 标签参加了一个新的特点ping。规划者参加它的理由是, Ping能够使浏览器对外发送一个异步恳求,一般用来广告的追寻、点击率计算或完结一次HTTP重定向。 可是听到监督、追寻这个词,...

新手攻略:DVWA-1.9全等级教程之Insecure CAPTCHA

现在,最新的DVWA现已更新到1.9版别(http://www.dvwa.co.uk/),而网上的教程大多停留在旧版别,且没有针对DVWA high等级的教程,因而萌发了一个编撰新手教程的主意,过错的...

小学生都会挖掘的JSON Hijacking实战利用

JSON Hijacking缝隙的具体使用,有点相似与CSRF,不过原理使用方法不同,在这边文章我侧重解说json跨域绑架的使用环境建立与方法。 0×01缝隙的发掘 一般发掘的过程中,burpsuit...

针对HTTP的躲藏攻击面剖析(中)

为了增强用户体会度,现代Web网站架构中都包含了各式各样的“躲藏体系”,这些体系不只能够给用户供给各种额定的服务,并且还能够协助管理员提取网站各方面的剖析数据。可是,这些躲藏体系相同也是近些年里常常被...

Java安全编码之用户输入

1、传统Web使用与新式移动使用 (1)传统Web使用:浏览器 HTTP 服务器(2)新式移动使用:APP HTTP 服务器 从安全视点看,传统Web使用与新式移动使用没有本质区别 2、Web使用安全...