scrapy 解决IP代理池的三种方法_scrapy代理ip池-程序员宅基地

一.手动更新ip池
1.1在setting配置文件中新增ip池
IPPOOL=[
{“ipaddr”:”61.129.70.131:8080”},
{“ipaddr”:”61.152.81.193:9100”},
{“ipaddr”:”120.204.85.29:3128”},
{“ipaddr”:”219.228.126.86:8123”},
{“ipaddr”:”61.152.81.193:9100”},
{“ipaddr”:”218.82.33.225:53853”},
{“ipaddr”:”223.167.190.17:42789”}
]
这些IP可以从这个几个网站获取:快代理、代理66、有代理、西刺代理、guobanjia。如果出现像下面这种提示:“由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败”或者是这种,” 由 于目标计算机积极拒绝,无法连接。”. 那就是IP的问题,更换就行了。。。。发现上面好多IP都不能用。。

1.2修改middlewares.py文件

-- coding: utf-8 --

Define here the models for your spider middleware

See documentation in:

http://doc.scrapy.org/en/latest/topics/spider-middleware.html

import random  
from scrapy import signals  
from youx.settings import IPPOOL  

class MyproxiesSpiderMiddleware(object):  

      def __init__(self,ip=''):  
          self.ip=ip  

      def process_request(self, request, spider):  
          thisip=random.choice(IPPOOL)  
          print("this is ip:"+thisip["ipaddr"])  
          request.meta["proxy"]="http://"+thisip["ipaddr"]  

1.3在setting里面配置DOWNLOADER_MIDDLEWARES

    DOWNLOADER_MIDDLEWARES = {
        #  'youx.middlewares.MyCustomDownloaderMiddleware': 543,
        'scrapy.contrib.downloadermiddleware.httpproxy.HttpProxyMiddleware': None,
        'youx.middlewares.MyproxiesSpiderMiddleware': 125
    } 

二.直接在middlewares.py文件里面添加ip池
2.1middlewares文件里面代码
import base64
import random
from scrapy import signals

PROXIES = [
{‘ip_port’: ‘61.160.233.8’, ‘user_pass’: ”},
{‘ip_port’: ‘125.93.149.186’, ‘user_pass’: ”},
{‘ip_port’: ‘58.38.86.181’, ‘user_pass’: ”},
{‘ip_port’: ‘119.142.86.110’, ‘user_pass’: ”},
{‘ip_port’: ‘124.161.16.89’, ‘user_pass’: ”},
{‘ip_port’: ‘61.160.233.8’, ‘user_pass’: ”},
{‘ip_port’: ‘101.94.131.237’, ‘user_pass’: ”},
{‘ip_port’: ‘219.157.162.97’, ‘user_pass’: ”},
{‘ip_port’: ‘61.152.89.18’, ‘user_pass’: ”},
{‘ip_port’: ‘139.224.132.192’, ‘user_pass’: ”}

]

    class ProxyMiddleware(object):
        def process_request(self, request, spider):
            proxy = random.choice(PROXIES)
            if proxy['user_pass'] is not None:
                request.meta['proxy'] = "http://%s" % proxy['ip_port']
                encoded_user_pass = base64.encodestring(proxy['user_pass'])
                request.headers['Proxy-Authorization'] = 'Basic ' + encoded_user_pass
            else:
                request.meta['proxy'] = "http://%s" % proxy['ip_port']

2.2setting里面代码

    DOWNLOADER_MIDDLEWARES = {
        # 'youx.middlewares.MyCustomDownloaderMiddleware': 543,
        'youx.middlewares.ProxyMiddleware': 700,
        'scrapy.contrib.downloadermiddleware.httpproxy.HttpProxyMiddleware': None,
    }

三.自动更新IP池
3.1这里写个自动获取IP的类proxies.py,执行一下把获取的IP保存到txt文件中去:

    # *-* coding:utf-8 *-*  
    import requests  
    from bs4 import BeautifulSoup  
    import lxml  
    from multiprocessing import Process, Queue  
    import random  
    import json  
    import time  
    import requests  

class Proxies(object):  

    """docstring for Proxies"""  
    def __init__(self, page=3):  
        self.proxies = []  
        self.verify_pro = []  
        self.page = page  
        self.headers = {  
        'Accept': '*/*',  
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)   Chrome/45.0.2454.101 Safari/537.36',  
        'Accept-Encoding': 'gzip, deflate, sdch',  
        'Accept-Language': 'zh-CN,zh;q=0.8'  
        }  
        self.get_proxies()  
        self.get_proxies_nn()  

    def get_proxies(self):  
        page = random.randint(1,10)  
        page_stop = page + self.page  
        while page < page_stop:  
            url = 'http://www.xicidaili.com/nt/%d' % page  
            html = requests.get(url, headers=self.headers).content  
            soup = BeautifulSoup(html, 'lxml')  
            ip_list = soup.find(id='ip_list')  
            for odd in ip_list.find_all(class_='odd'):  
                protocol = odd.find_all('td')[5].get_text().lower()+'://'  
                self.proxies.append(protocol + ':'.join([x.get_text() for x in odd.find_all('td')[1:3]]))  
            page += 1  

    def get_proxies_nn(self):  
        page = random.randint(1,10)  
        page_stop = page + self.page  
        while page < page_stop:  
            url = 'http://www.xicidaili.com/nn/%d' % page  
            html = requests.get(url, headers=self.headers).content  
            soup = BeautifulSoup(html, 'lxml')  
            ip_list = soup.find(id='ip_list')  
            for odd in ip_list.find_all(class_='odd'):  
                protocol = odd.find_all('td')[5].get_text().lower() + '://'  
                self.proxies.append(protocol + ':'.join([x.get_text() for x in odd.find_all('td')[1:3]]))  
            page += 1  

    def verify_proxies(self):  
        # 没验证的代理  
        old_queue = Queue()  
        # 验证后的代理  
        new_queue = Queue()  
        print ('verify proxy........')  
        works = []  
        for _ in range(15):  
             works.append(Process(target=self.verify_one_proxy, args=(old_queue,new_queue)))  
        for work in works:  
            work.start()  
        for proxy in self.proxies:  
            old_queue.put(proxy)  
        for work in works:  
            old_queue.put(0)  
        for work in works:  
            work.join()  
        self.proxies = []  
        while 1:  
            try:  
                self.proxies.append(new_queue.get(timeout=1))  
            except:  
                break  
        print ('verify_proxies done!')  


    def verify_one_proxy(self, old_queue, new_queue):  
        while 1:  
            proxy = old_queue.get()  
            if proxy == 0:break  
            protocol = 'https' if 'https' in proxy else 'http'  
            proxies = {protocol: proxy}  
            try:  
                if requests.get('http://www.baidu.com', proxies=proxies, timeout=2).status_code == 200:  
                    print ('success %s' % proxy)  
                    new_queue.put(proxy)  
              except:  
                print ('fail %s' % proxy)  


if __name__ == '__main__':  
    a = Proxies()  
    a.verify_proxies()  
    print (a.proxies)  
    proxie = a.proxies   
    with open('proxies.txt', 'a') as f:  
        for proxy in proxie:  
             f.write(proxy+'\n')  

这些IP就会保存到proxies.txt文件中去。

image.png
3.2修改代理文件middlewares.py的内容为如下:

import random  
import scrapy  
from scrapy import log  


# logger = logging.getLogger()  

class ProxyMiddleWare(object):  
    """docstring for ProxyMiddleWare"""  
    def process_request(self,request, spider):  
        '''对request对象加上proxy'''  
        proxy = self.get_random_proxy()  
        print("this is request ip:"+proxy)  
        request.meta['proxy'] = proxy   


    def process_response(self, request, response, spider):  
        '''对返回的response处理'''  
        # 如果返回的response状态不是200,重新生成当前request对象  
        if response.status != 200:  
            proxy = self.get_random_proxy()  
            print("this is response ip:"+proxy)  
            # 对当前reque加上代理  
            request.meta['proxy'] = proxy   
            return request  
        return response  

    def get_random_proxy(self):  
        '''随机从文件中读取proxy'''  
        while 1:  
            with open('G:\\Scrapy_work\\myproxies\\myproxies\\proxies.txt', 'r') as f:  
            proxies = f.readlines()  
            if proxies:  
                break  
            else:  
                time.sleep(1)  
        proxy = random.choice(proxies).strip()  
        return proxy  

3.3修改下settings文件

DOWNLOADER_MIDDLEWARES = {  
 #    'youx.middlewares.MyCustomDownloaderMiddleware': 543,  
     'scrapy.contrib.downloadermiddleware.httpproxy.HttpProxyMiddleware':None,  
     'youx.middlewares.ProxyMiddleWare':125,  
     'scrapy.downloadermiddlewares.defaultheaders.DefaultHeadersMiddleware':None  
}

作者:Py_Explorer
链接:https://www.jianshu.com/p/8449b9c397bb
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_42709587/article/details/82708453

智能推荐

win8.1 android驱动安装失败,Win8.1版系统显卡驱动安装失败的解决方法-程序员宅基地

文章浏览阅读493次。图形卡驱动程序是用于驱动图形卡的程序,它是与硬件相对应的软件。驱动程序是由硬件制造商根据操作系统编写的配置文件。可以说,没有驱动程序,计算机中的硬件将无法工作。不同的操作系统具有不同的硬件驱动程序。为了确保硬件的兼容性并增强硬件的功能,各种硬件制造商将不断升级驱动程序。以下是解决Win 8. 1显卡驱动程序安装对每个人都不好的方法的集合,希望对您有所帮助。解决Win 8. 1显卡驱动程序安装错误的..._8.1显卡驱动一直安装不上什么情况

java毕业设计大学生数字云平台2021Mybatis+系统+数据库+调试部署_java后端开发算法接口云平台-程序员宅基地

文章浏览阅读233次。java毕业设计大学生数字云平台2021Mybatis+系统+数据库+调试部署。springboot基于Springboot校园招聘系统。jsp基于JavaWeb的社区商超系统的设计与实现。JSP社团管理系统的设计与实现sqlserver。ssm基于web的考试资料交易系统的设计与实现。ssm基于SpringMVC的时鲜蔬菜配送系统。ssm基于SpringMvC的流浪狗领养系统。_java后端开发算法接口云平台

FFmpeg AAC编解码、重采样实战_ffmpeg aac 重采样-程序员宅基地

文章浏览阅读413次,点赞9次,收藏10次。FFmpeg AAC编解码、重采样实战_ffmpeg aac 重采样

.NET Framework和.NET Core-程序员宅基地

文章浏览阅读1.8k次。个人保存一些c#的.NET Framework和.NET Core相关知识。基础知识。_.net framework和.net core

Linux 修改/etc/profile全局变量文件出错 导致终端不停刷日志-bash:/usr/bin/id CentOS一直循环登录界面_进入单用户模式,修改profile文件-程序员宅基地

文章浏览阅读829次。修改/etc/profile全局变量文件出错 导致终端不停刷日志-bash:/usr/bin/id CentOS一直循环登录界面。进入单用户模式,并对/etc/profile文件进行修改。_进入单用户模式,修改profile文件

SpringBoot日常:引入外部jar包_springboot引入外部jar包-程序员宅基地

文章浏览阅读3.5k次,点赞3次,收藏19次。我们开发中经常会遇到这样的场景,对接外部的应用接口,对方给了一个sdk,也就是一个jar包文件,此时需要引入即可调用封装好的方法。_springboot引入外部jar包

随便推点

java发送邮件[附件/内嵌图片]_java发带图片的邮件到outlook时,图片比例自动变为100%怎么解决-程序员宅基地

文章浏览阅读1.9k次。邮件收发要想在网络上实现邮件功能,必须要有专门的邮件服务器这些邮件服务器类似显示生活中的邮局,它主要接收用户投递过来的邮件,并把邮件投递到邮件接收者的电子邮箱中SMTP服务器地址:一般是smtp.xxx.com,比如163邮箱是smtp.163.com,qq邮箱是smtp.qq.com电子邮箱的获得需要在邮件服务器上进行申请,比如我们要使用qq邮箱,就需要开通邮箱功能。传输协议smtp协议发送邮件:我们通常把处理用户smtp请求(邮件发送请求)的服务器称之为SMTP服务器POP3协议接收_java发带图片的邮件到outlook时,图片比例自动变为100%怎么解决

软件工程技术面试个人指南-程序员宅基地

文章浏览阅读217次。在github 上发现这么一篇,感觉不错,分享出来。原文地址:https://github.com/kdn251/interviews/blob/master/README-zh-cn.md目录在线练习在线面试编程数据结构算法位运算算法复杂度分析视频教程面试书籍计算机科学与技术资讯文件结构在线练习LeetCodeV..._软件工程技术面试个人指南。 git

安装SSL证书后实现http自动跳转到https教程_sll证书 web.config设置跳转-程序员宅基地

文章浏览阅读1.5w次。我们在访问其他网站的时候可能会看到URL前面出现http和https这样的区别。这是什么原因呢?原来,URL前面出现https//前缀是因为采用了SSL加密了,这样加密的好处就是用户访问网站的时候电脑与服务器之间收发的信息传输将更加安全。我们安装GoDaddy SSL证书后就可以实现这样的效果。当然,在安装证书完成后,要想实现输入域名自动跳转到https,我们还需要通过添加代码才能达到效果_sll证书 web.config设置跳转

033_jQuery Ajax的ajax方法_jquery ajax before-程序员宅基地

文章浏览阅读211次。1. $.ajax()方法通过HTTP请求加载远程数据。2. $.ajax()方法是jQuery底层AJAX实现。简单易用的高层实现见$.get, $.post等。3. $.ajax()方法返回其创建的XMLHttpRequest对象的超类。大多数情况下你无需直接操作该函数, 除非你需要操作不常用的选项, 以获得更多的灵活性。4. 语法$.ajax({name:value, name:value, ... })5. 参数6. 所有的选项都可以通过$.ajaxSetup()函数来_jquery ajax before

Spark yarn-client和yarn-cluster的区别_spark yarn client cluster区别-程序员宅基地

文章浏览阅读2.3k次,点赞2次,收藏13次。  之前面试遇到过一次这个问题,回答的很不好,这次专门记录下来,进行深入的解析两者区别。  首先,最简单也十分浅显的一种说法是:yarn-cluster是用于生产环境,这种模式下客户端client在提交了任务以后,任务就托管给yarn了,这个时候client就可以断开连接不需要再管后续事情了,这种情况下无法直接查看到application运行的日志,查看日志较为麻烦;而yarn-clien..._spark yarn client cluster区别

potree--加载二进制格式文件-程序员宅基地

文章浏览阅读568次。针对二进制文件的处理,potree里面用到了第三方库plasio和Laszip,palsio是一个针对las、laz格式点云数据处理的js库,Potree里面的plasio主要包括以下几个部分:其中laslaz.js主要负责数据的解析,bluebird主要是负责数据的异步加载,laz-loader-worker是一个数据加载的多线程解决方案;首先介绍一下bluebird...._potree 打开.bin数据

推荐文章

热门文章

相关标签