西山小菜鸟之Scrapy学习笔记---在Scrapy中使用代理

前言

本文中如有错误,请各位指正。

背景

    在爬取各大网页信息时,通过会遇到各种各样的反爬措施:很多网站会检测某一段时间某个IP的访问次数,如果访问频率太快以至于看起来不像正常的访客,那么它就可能就会禁止此IP的访问(有兴趣的小伙伴可以试试天眼查这个网站)。所以我们需要设置一些代理服务器,每隔一段时间换一个代理,就算IP被禁止,依然可以换个IP继续爬取,同时也不会暴露自己。
    虽然网上有各在代理IP地址,但是是实际工作中这些IP并不能用。因此我们需要购买并使用一些付费的代理。比如本文中要使用的阿布云。我们可以去阿布云网站去购买相应的服务。(ps:此处并无做广告的意思,只是因为我自己在使用。)

Scrapy中阿布云代理的接入

    在本文中,我仅作为一名勤劳的搬运工,将阿布云在Scrapy中的接入代码列出,其它接入指南可以参考网站:https://www.abuyun.com/http-proxy/pro-manual.html (以下程序转自此网站)

#! -*- encoding:utf-8 -*-

    import base64

    # 代理服务器
    proxyServer = "http://http-pro.abuyun.com:9010"

    # 代理隧道验证信息
    proxyUser = "H01234567890123P"
    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   

    可将此程序写入middlewares.py文件中,然后在settings.py下载器中间件中配置即可。如果想检测自己的代理是否使用,可将密码或帐号故意写错进行测试(暂时只能想到这种方法)。

知识点

下载器中间件

    有时某些代码在蜘蛛执行之前要先执行,或者要对request进行重新调整,此时就可以使用下载器中间件这种插件系统 在不修改代码的前提下直接将新的功能模块接入Scrapy框架中。
    编写下载器中间件十分简单。每个中间件组定义了一个或多个方法的Python类,以下是自定义下载器中间件的救命模板:

class MyDownloadMiddleWare(object):
	def process_request(self,request,spider):
		"'当每个request通过下载中间件时,该方法被调用"
		pass
	def process_response(self,request,response,spider):
		"当完成对request的下载并产生response对象时在调用spider上的parse方法之前被 调用"
		pass
	def process_exception(self,request,exception,spider):
		"当下载处理器(download handler)或process_request()抛出异常时被调用"

    关于这三个函数的具体内容可以自行百度学习,此处不再给出。
    Scrapy提供了一个下载器中间件scrapy.downloadermiddlers.HttpProxyMiddleware,用于设置爬网的代理,只要在settings.py文件中设置以下几个配置项就可启用该代理中间件:

DOWNLOADER_MIDDLERS={
'scrapy.downloadermiddlers.HttpProxyMiddleware':900
}
HTTPPROXY_ENABLED=True

    HttpProxyMiddleware中间件并不可以在设置文件中直接指定代理地址,它设置代理地址的方法有两种,一种是从系统代理中读取,一种就是在生成请求实例request后在request.meta['proxy']中设置代理。也就是说要么在蜘蛛的start_requests方法中进行设置,要么编写一个下载器中间件并将其实现优先级设置得比HttpProxyMiddleware更高,在自定义中先设定好request.meta['proxy']的值。
    上面给出的阿布云的使用方法即是编写一个下载器中间件。

声明

    此理论部分转自书《虫术–python绝技》。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值