美文网首页程序员
Scrapy使用代理爬取网站

Scrapy使用代理爬取网站

作者: kakarotto | 来源:发表于2018-08-30 15:20 被阅读0次
    timg.jpg

    前言

    在我们平时使用爬虫程序采集数据时,往往会遇到,因采集速度过快导致的自己网络ip被目标网站封禁,这种封禁有时候是封几分钟,有时候是封一天,封的时间不等,但是这样会导致我们局域网内其他人也无法访问目标网站,最大的问题是我们无法进行数据采集。为了保证正常采集数据且本地ip不被封禁,引入代理ip。

    代理ip

    代理ip有很多种类型,这里我们爬虫程序一般使用的是http或https的代理ip。
    爬虫使用的话最好用高匿代理

    高匿名代理不改变客户机的请求,这样在服务器看来就像有个真正的客户浏览器在访问它,这时客户的真实IP是隐藏的,服务器端不会认为我们使用了代理。

    requests库使用代理ip

    # 准备好的代理ip
    proxy = "127.0.0.1:8000"    
    proxies = {
            "https": "https://{0}".format(proxy),
            "http": "http://{0}".format(proxy),
     }
    res = requests.get(url, proxies=proxies)
    

    以上代码片段是最简单的requests库实现代理ip执行get请求

    线上爬虫使用代理ip方案

    目前爬虫使用代理的方法很多,这里我简单说说我在线上环境使用代理的心得。
    首先,我自己维护了一个代理ip池,这个ip池是放在redis中的,也就是说我的所有可使用的代理ip是放在redis中,使用redis的set数据结构,


    image.png

    当然了,这里列出的ip都是可使用的,因为在放入redis之前我会使用特定的程序去检测代理ip的可用性。
    代理ip的来源这里我要说一下,最好是越多越好,分好类,付费的,免费的,拨号的,全部拿来用,使用的时候随机从redis中取一个出来用。代理ip的选择大家自行查找,或者需要也可给我留言。

    scrapy使用代理ip

    class RandomProxyMiddleware(object):
    
        def __init__(self):
            settings = get_project_settings()
            self.PROXY_REDIS_HOST = settings.get('PROXY_REDIS_HOST')
            self.PROXY_REDIS_PORT = settings.get('PROXY_REDIS_PORT')
            self.PROXY_REDIS_PARAMS = settings.get('PROXY_REDIS_PARAMS')
            self.PROXY_REDIS_KEY = settings.get('PROXY_REDIS_KEY')
            self.pool = redis.ConnectionPool(host=self.PROXY_REDIS_HOST,
                                             port=self.PROXY_REDIS_PORT,
                                             db=self.PROXY_REDIS_PARAMS['db'],
                                             password=self.PROXY_REDIS_PARAMS['password'])
            self.conn = redis.StrictRedis(connection_pool=self.pool)
    
        def process_request(self, request, spider):
            proxy = self.conn.srandmember(self.PROXY_REDIS_KEY)
            proxy = proxy.decode('utf-8')
            proxy = json.loads(proxy)
            ip = proxy['proxy']
            request.meta['proxy'] = "https://%s" % ip
    

    上图代码片段自定义一个代理中间件RandomProxyMiddleware,在scrapyprocess_request(self, request, spider)这个方法中使用redis的操作随机获取一个代理出来,加到request.meta['proxy']中,便完成了代理中间件的编写。随后把RandomProxyMiddleware加到setting文件中,

    DOWNLOADER_MIDDLEWARES = {
       'crawl_spider.middlewares.RandomProxyMiddleware': 400,
    }
    

    便可完成scrapy增加代理的需求。

    相关文章

      网友评论

        本文标题:Scrapy使用代理爬取网站

        本文链接:https://www.haomeiwen.com/subject/kgzrwftx.html