简单验证

import requests

url = "http://www.baidu.com/"
proxies = {"http": "http://x.x.x.x:端口号码"}
#空白位置为测试代理ip和代理ip使用端口

headers = {"User-Agent": "Mozilla/5.0"}
#响应头
res = requests.get(url, proxies=proxies, headers=headers)
#发起请求
print(res.status_code) #返回响应码

正常有效的可用代理ip返回的应该是响应码200   并添加到数据库

***************************************************************************************

抓取www.xicidaili 并保存到文本

import requestsfrom bs4 import BeautifulSoupimport lxmlfrom multiprocessing import Process, Queueimport randomimport jsonimport timeimport 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')

中间件处理
import randomimport scrapyfrom scrapy import logimport time

# 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('.\proxies.txt', 'r') as f:                proxies = f.readlines()                if proxies:                    break                else:                    time.sleep(1)        proxy = random.choice(proxies).strip()        return proxy

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

参考:https://www.jianshu.com/p/8449b9c397bb?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation
												

IP池验证IP是否可用 及scrapy使用 ip池的更多相关文章

  1. 写一个scrapy中间件--ip代理池

    middleware文件 # -*- coding: utf-8 -*- # Define here the models for your spider middleware # See docum ...

  2. Scrapy 代理IP

    Scrapy 代理IP 一.Scarpy使用代理IP 1.在setting.py 配置 代理服务器IP 2.在middlermares.py 配置 downloadmiddlermare(下载中间件) ...

  3. python-爬免费ip并验证其可行性

    前言 最近在重新温习python基础-正则,感觉正则很强大,不过有点枯燥,想着,就去应用正则,找点有趣的事玩玩 00xx01---代理IP 有好多免费的ip,不过一个一个保存太难了,也不可能,还是用我 ...

  4. scrapy设置"请求池"

    scrapy设置"请求池" 引言 相信大家有时候爬虫发出请求的时候会被ban,返回的是403错误,这个就是请求头的问题,其实在python发出请求时,使用的是默认的自己的请求头,网 ...

  5. scrapy的UA池和代理池

    一.下载中间件(Downloader Middlewares) 框架图如下 下载中间件(Downloader Middlewares)位于scrapy引擎和下载器之间的一层组件. - 作用: (1)引 ...

  6. 《TCP/IP具体解释卷2:实现》笔记--IP多播

    D类IP地址(224.0.0.0到239.255.255.255)不识别互联网内的单个接口,但识别接口组,被称为多播组. 单个网络上的组成员利用IGMP协议在系统之间通信. 多播路由器用多播选录协议. ...

  7. TCP/IP协议原理与应用笔记05:TCP/IP协议下的网关

    大家都知道,从一个房间走到另一个房间,必然要经过一扇门.同样,从一个网络向另一个网络发送信息,也必须经过一道“关口”,这道关口就是网关.顾名思义,网关(Gateway)就是一个网络连接到另一个网络的& ...

  8. 《TCP/IP具体解释卷2:实现》笔记--IP:网际协议

    本章介绍IP分组的结构和主要的IP处理过程,包含输入,转发和输出. 下图显示了IP层常见的组织形式. 在之前的文章中.我们看到了网络接口怎样把到达的IP分组放到IP输入队列ipintrq中去,并怎样调 ...

  9. 11月10日上午ajax基础知识、用ajax做登录页面、用ajax验证用户名是否可用、ajax动态调用数据库

    1.ajax的基础知识 ajax是结合了jquery.php等几种技术延伸出来的综合运用的技术,不是新的内容.ajax也是写在<script>标签里面的. 如果使用ajax一定是要有1个处 ...

随机推荐

  1. Java基于opencv实现图像数字识别(四)—图像降噪

    Java基于opencv实现图像数字识别(四)-图像降噪 我们每一步的工作都是基于前一步的,我们先把我们前面的几个函数封装成一个工具类,以后我们所有的函数都基于这个工具类 这个工具类呢,就一个成员变量 ...

  2. Django_ORM相关操作

    一般的操作 1.all():查询所有的结果 2.filter():包含与所有筛选条件匹配的对象 3.get():返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果对象没有或者超过一个会报错 4 ...

  3. 修改oracle数据库内存报错

    今天修改oracle数据库内存时, alter system set memory_max_target=10240M scope=spfile;语句正确修改:但重启时却报错 : SQL> al ...

  4. uva 202

    #include <iostream> #include<cstdio> #include<cstring> #include<algorithm> # ...

  5. 学习笔记TF062:TensorFlow线性代数编译框架XLA

    XLA(Accelerated Linear Algebra),线性代数领域专用编译器(demain-specific compiler),优化TensorFlow计算.即时(just-in-time ...

  6. XML注入(XXE)

    XML所有元素都必须要有一个结束标志 大小写敏感 所有元素嵌套必须正确 所有的XML文档都必须要有一个根标志 XML包括XML声明,DTD文档类型定义(可选),文档元素 DTD即文档类型定义,用来为X ...

  7. 通过junit写unit test

    how to run test within junit & mvn: During team development , there are more than 1 person edit ...

  8. 钱管够,你能接这个项目吗?+ tomcat源码分析

    最近看了几个咕泡学院的公开课,课堂老师讲到下面这两个经历. 1:钱给够,你有没有能力接下这个全国性的项目 平时也会有怀才不遇的时候,但是当你遇到这个机会的时候,有没有信心去接下这个单子呢? 信心和能力 ...

  9. zabbix4.0离线快速编译安装(编译安装方法)

    本博客已整理更新至第二版.更新与2019.4.17 其实这个主要是想试一下离线编译安装的具体步骤,记得要配置好本地yum云,因为我们需要使用yum,yum能帮我们自动解决很多依赖问题.发现最主要的问题 ...

  10. Eamon 埃蒙

    发售年份 1980 平台 AppleII 开发商 Donald Brown 类型 文字冒险 https://www.youtube.com/watch?v=uvZIxnIvRG8