python利用proxybroker构建爬虫免费IP代理池的实现
前言
写爬虫的小伙伴可能遇到过这种情况:
正当悠闲地喝着咖啡,满意地看着屏幕上的那一行行如流水般被爬下来的数据时,突然一个Error弹出,提示抓不到数据了...
然后你反复检查,确信自己代码莫得问题之后,发现居然连浏览器也无法正常访问网页了...
难道是网站被我爬瘫痪了?
然后你用手机浏览所爬网站,惊奇地发现居然能访问!
才原来我的IP被网站给封了,拒绝了我的访问
这时只能用IP代理来应对禁IP反爬策略了,但是网上高速稳定的代理IP大多都收费,看了看皱皱的钱包后,一个大胆的想法冒出
我要白嫖!
啥是IP代理?假如你现在17岁未成年,理想一点的情况会是,你去商店买烟,老板告诉你未成年不能买烟,并拒绝了你的购买,这叫被服务器拒绝访问;
但是你不服气啊,于是你找来你20岁的哥哥,叫他去商店老板那帮你买包烟,然后再给你,这就叫IP代理。
ProxyBroker简介
ProxyBroker是一个开源软件,它从各种不同的IP代理网站中抓来公开的代理IP,并实时地检查代理IP的可用性,以供使用。
所以可以说ProxyBroker是一个集成了爬虫技术的开源软件。
ProxyBroker安装
你可以通过pip来安装ProxyBroker
pipinstallproxybroker
也可以直接从Github下载最新版本的ProxyBroker
pipinstall-Ugit+https://github.com/constverum/ProxyBroker.git
在终端使用ProxyBroker
安装成功后,你可以在终端中使用命令proxybroker
proxybroker主要有三个子命令
find子命令
find子命令用于查找并检查公开的代理IP,换言之它会列出所有经测试可用的代理IP
下列是find子命令的常用选项:
| 选项 | 作用 | 可选值 | 示例 |
|---|---|---|---|
| --types | 指定代理的类型 | HTTP,HTTPS,SOCKS4,SOCKS5,CONNECT:80,CONNECT:25 | --typesHTTPHTTPS |
| --lvl | 指定代理的匿名级别 | Transparent,Anonymous,High | --lvlHigh |
| --strict,-s | 严格保证代理的类型与匿名级别等于指定的值 | 只要加上就表示启用严格模式 | --strict |
| --countriesCOUNTRIES,-cCOUNTRIES | 指定代理IP的所属国家 | US,CN... | -cCN |
| --limitLIMIT,-lLIMIT | 指定获取的条数 | 正整数即可 | -l5 |
| --outfileOUTFILE,-oOUTFILE | 将找到的代理保存到文件中 | 文件路径 | --outfile./proxies.txt |
| --formatFORMAT,-fFORMAT | 指定输出的格式,默认值为default | default,json | -fjson |
| --post | 用post请求检查IP的可用性,默认是用get方式 | 只要加上就表示启用post请求检查 | --post |
| --show-stats | 是否打印详细统计信息 | 只要加上就表示启用打印统计信息 | --show-stats |
比如查找10条HTTP代理
proxybrokerfind--typesHTTP-l10
你可以将选项的示例值加上,自己尝试一下
grab子命令
grab子命令有点像find的简易版,它只进行查找,并不检查抓来IP的可用性
下列是grab子命令的所有选项:
| 选项 | 作用 | 可选值 | 示例 |
|---|---|---|---|
| --countriesCOUNTRIES,-cCOUNTRIES | 指定代理IP的所属国家 | US,CN... | -cCN |
| --limitLIMIT,-lLIMIT | 指定获取的条数 | 正整数即可 | -l5 |
| --outfileOUTFILE,-oOUTFILE | 将找到的代理保存到文件中 | 文件路径 | --outfile./proxies.txt |
| --formatFORMAT,-fFORMAT | 指定输出的格式,默认值为default | default,json | -fjson |
| --show-stats | 是否打印详细统计信息 | 只要加上就表示启用打印统计信息 | --show-stats |
可以看到它有的选项,find子命令都有,所以它是find的阉割版
比如查找5条来自中国的代理,并将它保存至文件中
proxybrokergrab-cCN-o./proxies.txt-l5
serve子命令
serve子命令用于搭建一个本地代理服务器,它可以分发你的请求至不同的IP代理中
下列是serve子命令的常用选项:
| 选项 | 作用 | 可选值 | 示例 |
|---|---|---|---|
| --hostHOST | 指定服务器的地址,默认是127.0.0.1 | 你本机的IP | --hostlocalhost |
| --portPORT | 指定服务器的端口,默认是8888 | 你本机可用的端口 | --port5000 |
| --max-triesSRV_MAX_TRIES | 设置处理请求的最大重试次数 | 正整数 | --max-tries3 |
| --min-req-proxyMIN_REQ_PROXY | 设置每个IP处理请求的最小次数 | 正整数 | --min-req-proxy3 |
| --http-allowed-codesHTTP_ALLOWED_CODES | 设置允许代理返回的响应码 | 响应的状态码 | --http-allowed-codes302 |
| --max-error-rateMAX_ERROR_RATE | 设置最大允许请求的异常率,例如0.5是50% | 0~1 | --max-error-rate0.3 |
| --max-resp-timeSECONDS | 设置响应的最大允许秒数,默认是8秒 | 秒数 | --max-resp-time20 |
| --prefer-connect | 如果可以的话,是否使用CONNECT方法 | 只要加上就表示使用 | --prefer-connect |
| --backlogBACKLOG | 设置连接队列的最大值 | 正整数即可 | --backlog10 |
| - | - | - | - |
| --types | 指定代理的类型 | HTTP,HTTPS,SOCKS4,SOCKS5,CONNECT:80,CONNECT:25 | --typesHTTPHTTPS |
| --lvl | 指定代理的匿名级别 | Transparent,Anonymous,High | --lvlHigh |
| --strict,-s | 严格保证代理的类型与匿名级别等于指定的值 | 只要加上就表示启用严格模式 | --strict |
| --countriesCOUNTRIES,-cCOUNTRIES | 指定代理IP的所属国家 | US,CN... | -cCN |
| --limitLIMIT,-lLIMIT | 指定代理池的工作IP条数 | 正整数即可 | -l5 |
serve子命令搭建代理服务器,相当于把我们本机变成中间商再中间商
比如在地址为localhost,端口为5000,搭起高匿名代理服务器
proxybrokerserve--hostlocalhost--port5000--typesHTTP--lvlHigh
然后先通过curl命令不使用代理访问一下http://httpbin.org/get这个地址,查看一下该网站显示我们的IP是多少
curlhttp://httpbin.org/get
再使用curl命令通过我们刚搭起的代理服务器访问一下,看看网站显示的IP是否有变化
curl--proxyhttp://localhost:5000http://httpbin.org/get
在代码中使用ProxyBroker
你可以通过proxybrokerserve子命令搭起代理服务器,然后在发起请求时使用该代理,这种方法适用于几乎所有的编程语言
requests库使用代理
先serve搭起代理服务器
proxybrokerserve--hostlocalhost--port5000--typesHTTP--lvlHigh
然后通过requests库设置代理
importrequests
proxies={
"http":"http://localhost:5000",
"https":"http://localhost:5000"
}
res=requests.get('http://httpbin.org/get',proxies=proxies)
print(res.json())
效果如下
scrapy库使用代理
还是先serve搭起代理服务器,代码还是和上面一样
在终端中,通过scrapystartproject新建一个爬虫项目,然后进入该项目目录里
scrapystartprojectproxy_demo cdproxy_demo
通过scrapygenspider新建一个爬虫,名为proxy_spider_demo,域名为httpbin.org
scrapygenspiderproxy_spider_demohttpbin.org
然后将下列代码粘贴至刚刚新建的爬虫中
importjson
importscrapy
#fromscrapy.downloadermiddlewares.httpproxyimportHttpProxyMiddleware
classProxySpiderDemoSpider(scrapy.Spider):
name='proxy_spider_demo'
allowed_domains=['httpbin.org']
#start_urls=['http://httpbin.org/']
defstart_requests(self):
meta=dict(proxy='http://localhost:5000')
#请求三次该网址,查看IP是否不同
for_inrange(3):
#得加上dont_filter=True,否则第2、3个请求将被dupefilter过滤
#请求可以通过meta携带代理服务器地址,与HttpProxyMiddleware下载器中间件配合达到代理请求的目的
yieldscrapy.Request('http://httpbin.org/get',dont_filter=True,meta=meta,callback=self.parse)
defparse(self,response):
json_body=json.loads(response.text)
print('当前请求的IP为:',json_body['origin'])
在项目根目录处进入终端,通过scrapycrawl命令运行爬虫,这里加上了--nolog选项是为了专注于print的输出
scrapycrawl--nologproxy_spider_demo
效果如下
python异步获取代理IP
如果不希望通过serve子命令,直接在python代码中使用代理IP,可以通过asyncio来异步获取代理IP
直接上代码
importasyncio
fromproxybrokerimportBroker
asyncdefview_proxy(proxies_queue):
whileTrue:
proxy=awaitproxies_queue.get()
ifproxyisNone:
print('done...')
break
print(proxy)
#异步队列
proxies_queue=asyncio.Queue()
broker=Broker(proxies_queue)
tasks=asyncio.gather(
#使用grab子命令获取3条IP
broker.grab(limit=3),
view_proxy(proxies_queue))
loop=asyncio.get_event_loop()
_=loop.run_until_complete(tasks)
获取到代理IP后,你可以通过aiohttp异步HTTP库或requests库来使用它们
总结
你可以利用ProxyBroker库来白嫖免费的IP代理,但是白嫖来的始终是有缺点的,不然也不会有人专门去卖IP代理了
白嫖来的IP有稳定性差、速度慢的缺点,所以土豪可以忽视本文...
到此这篇关于python利用proxybroker构建爬虫免费IP代理池的实现的文章就介绍到这了,更多相关pythonIP代理池内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。