自动更新IP池

写个自动获取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 requestsclass Proxies(object):"""docstring for Proxies"""def __init__(self, page=3):self.proxies = []self.varify_pro = []self.page = pageself.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.pagewhile page < page_stop:url = 'http://www.xicidaili.com/nt/%d' % pagehtml = requests.get(url, headers=self.headers).contentsoup = 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 += 1def get_proxies_nn(self):page = random.randint(1, 10)page_stop = page + self.pagewhile page < page_stop:url = 'http://www.xicidaili.com/nn/%d' % pagehtml = request.get(url, headers=self.headers).contentsoup = 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 += 1def 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:breakprint('verfiy_proxies done!')def verify_one_proxy(self, old_queue, new_queue):while 1:proxy = old_queue.get()if proxy == 0: breakprotocol = '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)proxies = a.proxieswith open('proxies.txt', 'a') as f:for proxy in proxies:f.write(proxy+'\n')           

执行一下:

python proxies.py

这些有效的IP就会保存到proxies.txt文件中去

修改中间件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'] = proxydef 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)# 对当前request加上代理request.meta['proxy'] = proxyreturn requestreturn responsedef 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

修改下settings文件

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

这里的myproxies是工程的名字,middlewares是py文件的名,ProxyMiddleWare是类的名字

或者利用crawlera神器(收费)--------自行百度

土豪自然随意,直接淘宝买一些代理IP就好,稳定也不是特别贵

Github 搜索 proxy ip会发现更多

Python网络爬虫--Scrapy使用IP代理池相关推荐

  1. 在Python网络爬虫程序中使用线程池

    在Python网络爬虫程序中使用线程池 一.为什么需要使用线程池 二.线程池的使用 2.1 线程池的类与方法 2.2 使用线程池的一般步骤 三.在爬虫程序中使用线程池的实例 一.为什么需要使用线程池 ...

  2. python如何基于redis实现ip代理池

    这篇文章主要介绍了python如何基于redis实现ip代理池,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 使用apscheduler库定时爬取i ...

  3. python爬虫之:IP代理池开源项目讲解

    Table of Contents 一.项目基本介绍 二.项目讲解 三.一些项目问题答疑 四.代理池设计 一.项目基本介绍 本项目来源于github,截止于2019/08/20,star数量:7133 ...

  4. python爬虫-自建IP代理池

    写在前面 最近跟静觅大神学习了维护代理池 就借此机会整理一下 整体思路 代理池主要分为4个模块:存储模块.获取模块.检测模块.接口模块 存储模块:使用Redis有序集合,用来做代理的去重和状态标识 获 ...

  5. python 爬取西刺ip代理池

    1. 如何在requests中设置ip代理 最直接的用法,在get中添加proxies设置ip代理 proxies = {'https': 'http://183.148.153.147:9999/' ...

  6. Python爬虫Scrapy框架IP代理的配置与调试

    在调试爬虫的时候,新手都会遇到关于ip的错误,好好的程序突然报错了,怎么解决,关于ip访问的错误其实很好解决,但是怎么知道解决好了呢?怎么确定是代理ip的问题呢?由于笔者主修语言是Java,所以有些解 ...

  7. python 下载文件 限速-Python网络爬虫---scrapy通用爬虫及反爬技巧

    一.通用爬虫 通用爬虫一般有以下通用特性:爬取大量(一般来说是无限)的网站而不是特定的一些网站. 不会将整个网站都爬取完毕,因为这十分不实际(或者说是不可能)完成的.相反,其会限制爬取的时间及数量. ...

  8. IP代理池检测代理可用性

    目录 项目代码 utils.py settings.py proxy_queue.py check_proxy.py 运行方法 在<基于Scrapy的IP代理池搭建>一文中,我们将从网页爬 ...

  9. [Python 爬虫] 使用 Scrapy 爬取新浪微博用户信息(四) —— 应对反爬技术(选取 User-Agent、添加 IP代理池以及Cookies池 )

    上一篇:[Python 爬虫] 使用 Scrapy 爬取新浪微博用户信息(三) -- 数据的持久化--使用MongoDB存储爬取的数据 最近项目有些忙,很多需求紧急上线,所以一直没能完善< 使用 ...

最新文章

  1. Highcharts X轴纵向显示
  2. Cocos2D-x(3)——动作类备忘
  3. 为什么 Linux 上的 Asp.NET 5 需要 Kestrel ?
  4. [ ERROR ] Can not init Myriad device: NC_ERROR
  5. 水滴公司更新招股书:发行价区间为10-12美元
  6. 深入Scripting Runtime Library
  7. 【学习笔记】RecyclerView的使用
  8. Java从入门到入土
  9. itextpdf使用总结
  10. 【ESD专题】1.ESD基础及IEC61000-4-2标准
  11. mysql复制一行sql语句_MySQL复制表数据操作sql语句
  12. 安理工计算机专业分数线,安徽理工大学复试录取分数线
  13. Java学习中遇到的中文乱码问题的整理和解决方法
  14. 1.1.24 制作红头文件
  15. 销售额高达2.8亿的 “像素猫头鹰”项目Moonbirds,何以令NFT收藏家趋之若鹜?
  16. SLAM中的李群和李代数
  17. 基于CUDA的GPU并行计算技术实现网课课表编排
  18. 08-微服务版单点登陆系统(SSO)实践
  19. 程序员必读书单1.0
  20. 计算用户输入的日期离1900年1月1日相距多少天

热门文章

  1. Java中的Atomic包使用指南
  2. leetcode--70. 爬楼梯
  3. Codeup-问题 A: 装箱问题
  4. POJ 3311 Hie with the Pie (flyod + DFS枚举)
  5. 详解JSONObject.parseObject和JSONObject.fromObject——Web网络系列学习笔记
  6. 【传智播客】Javaweb程序设计任务教程 黑马程序员 第二章 课后答案
  7. 覆盖索引最左前缀原则索引下推
  8. 单片机原理及其应用——单片机控制按键点亮发光二极管
  9. python工具栏消失_[Python自学] PyQT5-菜单栏、工具栏、状态栏
  10. Nginx使用之location和rewrite用法