实践出真知-scrapy集成ip代理(以阿布云为例)
2018-03-27 15:09
579 查看
一、前言
有个项目需要爬取证券协会,对方有ip屏蔽。所以我需要在scrapy中实现ip自动切换,才能够完成爬取任务。在此之前,我用过第三方库scrapy-proxys加上芝麻ip的代理api接口,可能是之前代码没有调整好,导致的没有能够成功。(后面有机会再测试)。
二、阿布云范例
阿布云官方给出了python和scrapy的示例代码python3示例
from urllib import request # 要访问的目标页面 targetUrl = "http://test.abuyun.com/proxy.php" # 代理服务器 proxyHost = "http-dyn.abuyun.com" proxyPort = "9020" # 代理隧道验证信息 proxyUser = "H01234567890123D" proxyPass = "0123456789012345" proxyMeta = "http://%(user)s:%(pass)s@%(host)s:%(port)s" % { "host" : proxyHost, "port" : proxyPort, "user" : proxyUser, "pass" : proxyPass, } proxy_handler = request.ProxyHandler({ "http" : proxyMeta, "https" : proxyMeta, }) #auth = request.HTTPBasicAuthHandler() #opener = request.build_opener(proxy_handler, auth, request.HTTPHandler) opener = request.build_opener(proxy_handler) request.install_opener(opener) resp = request.urlopen(targetUrl).read() print (resp)
上面的是原生写法,下面提供scrapy的中间件写法
scrapy中间件
import base64 # 代理服务器 proxyServer = "http://http-dyn.abuyun.com:9020" # 代理隧道验证信息 proxyUser = "H01234567890123D" proxyPass = "0123456789012345" # for Python2 proxyAuth = "Basic " + base64.b64encode(proxyUser + ":" + proxyPass) # for Python3 #proxyAuth = "Basic " + base64.urlsafe_b64encode(bytes((proxyUser + ":" + proxyPass), "ascii")).decode("utf8") class ProxyMiddleware(object): def process_request(self, request, spider): request.meta["proxy"] = proxyServer request.headers["Proxy-Authorization"] = proxyAuth
这里在scrapy项目中的Middleware里面写即可。
三、正式集成
在项目的middlewares.py中新增类:import base64 """ 阿布云ip代理配置,包括账号密码 """ proxyServer = "http://http-dyn.abuyun.com:9020" proxyUser = "HWFHQ5YP14Lxxx" proxyPass = "CB8D0AD56EAxxx" # for Python3 proxyAuth = "Basic " + base64.urlsafe_b64encode(bytes((proxyUser + ":" + proxyPass), "ascii")).decode("utf8") class ABProxyMiddleware(object): """ 阿布云ip代理配置 """ def process_request(self, request, spider): request.meta["proxy"] = proxyServer request.headers["Proxy-Authorization"] = proxyAuth
然后再到settings.py中开启中间件:
DOWNLOADER_MIDDLEWARES = { #'Securities.middlewares.SecuritiesDownloaderMiddleware': None, 'Securities.middlewares.ABProxyMiddleware': 1, }
四、注意事项
阿布云动态ip默认是1秒钟请求5次,(可以加钱,购买多次)。所以,当他是默认5次的时候,我需要对爬虫进行限速,还是在settings.py中,空白处新增如下代码:""" 启用限速设置 """ AUTOTHROTTLE_ENABLED = True AUTOTHROTTLE_START_DELAY = 0.2 # 初始下载延迟 DOWNLOAD_DELAY = 0.2 # 每次请求间隔时间
当然了,如果加钱购买多次的话,可以不用考虑限速的问题。
即可完成阿布云动态代理ip在scrapy中的的集成,尽情的爬吧!
相关文章推荐
- scrapy爬虫代理——利用crawlera神器,无需再寻找代理IP
- Scrapy学习篇(十二)之设置随机IP代理(IPProxy)
- 用scrapy获取代理ip地址
- 小项目-数据爬取篇:scrapy框架,手机网页,工作信息存入MongoDB,代理ip中间件
- Scrapy爬虫:代理IP配置
- scrapy怎么设置带有密码的代理ip base64.encodestring不能用 python3.5,base64库里面的encodestring()被换成了什么?
- Scrapy爬取美女图片第三集 代理ip(下)
- Scrapy爬虫:代理IP配置
- Scrapy爬取美女图片第三集 代理ip(下)
- scrapy代理ip
- 第1.7章 scrapy之ip代理的使用
- Scrapy爬取西刺代理ip流程
- Python-Scrapy 个人兴趣教程(二):没错,从代理IP开始
- Python-Scrapy 个人兴趣教程(二):没错,从代理IP开始
- Scrapy的Ip代理的配置(未完成)
- scrapy抓取免费代理IP
- 第2.1章 scrapy之国内高匿代理IP爬取