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

访客5年前黑客文章587

在收集数据的时分,经常会碰到有反收集战略规矩的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]  黑客接单网

相关文章

OWASP TOP 10之怎么防护CSRF进犯

0x00 什么是CSRF CSRF(Cross-site request forgery跨站恳求假造,也被称为“One Click Attack”或许Session Riding,一般缩写为CSR...

文件包括&奇技淫巧

前语 最近遇到一些文件包括的标题,在本篇文章记载两个trick。 环境布景 复现环境仍是很简略建立的: 例题1(php7) index.php dir.php 例题2(php5) index.php...

一次射中可疑要挟情报的剖析探究

由于最近一段时刻里”驱动人生”这个病毒还挺抢手,最近发现经过一些安全厂商的设备发现内网里边有许多的主机都中了这个病毒瞬间吓哭了。后续经过对主机进行查看,竟然没有发现什么问题,后续发现是安全设备命中了一...

第六届全国网络安全大赛代码审计全解

 XDCTF是一项面向全国在校大学生的信息安全类竞赛,由西电信息安全协会与网络攻防实训基地联合举行。旨在增强学生对网络常识的爱好,进步学生学习网络技术的积极性,培育学生的立异 认识、协作精力和理论联系...

运用Python CGIHTTPServer绕过注入时的CSRF Token防护

CSRF tokens是服务器生成的一串随机值,其主要作用是防止表单重复提交以及恳求假造进犯。由于该生成值具有随机性,一次性,而且是根据服务器端的前一个恳求生成的,因而黑客简直不可能假造它。 Burp...

Node.js使用的反向shell

布景介绍 一个小型Web开发者团队曾托付咱们对他们的移动使用进行安全评价,该使用的后端是一个REST API。该使用的架构很简单,只由3台linux服务器组成: Node.js MongoDB Red...