前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Scrapy ip代理池

Scrapy ip代理池

作者头像
py3study
发布于 2020-11-11 06:33:30
发布于 2020-11-11 06:33:30
1.4K00
代码可运行
举报
文章被收录于专栏:python3python3
运行总次数:0
代码可运行

一、概述

在众多的网站防爬措施中,有一种是根据ip的访问频率进行限制,即在某一时间段内,当某个ip的访问次数达到一定的阀值时,该ip就会被拉黑、在一段时间内禁止访问。

应对的方法有两种:

1. 降低爬虫的爬取频率,避免IP被限制访问,缺点显而易见:会大大降低爬取的效率。

2. 搭建一个IP代理池,使用不同的IP轮流进行爬取。

环境说明

操作系统:centos 7.6

ip地址:192.168.31.230

说明:运行redis和ip代理池

操作系统:windows 10

ip地址:192.168.31.230

说明:运行Scrapy 爬虫项目

二、搭建IP代理池

介绍

在github上,有一个现成的ip代理池项目,地址:https://github.com/jhao104/proxy_pool

爬虫代理IP池项目,主要功能为定时采集网上发布的免费代理验证入库,定时验证入库的代理保证代理的可用性,提供API和CLI两种使用方式。同时你也可以扩展代理源以增加代理池IP的质量和数量。

搭建redis

注意:此项目运行时,依赖于redis。这里直接用docker搭建

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker run -d --name redis -p 6380:6379 redis --requirepass 123456

说明:

映射端口6080,redis密码为:123456

运行ip代理池

由于ip代理池项目,在dockerhub上面有现成的镜像,直接拿来使用即可。

启动命令示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker run --env DB_CONN=redis://:password@ip:port/db -p 5010:5010 jhao104/proxy_pool:latest

注意:这里要根据实际情况,指定redis的连接信息。

所以:根据上面的环境说明,正确的redis连接信息为:DB_CONN=redis://:123456@192.168.31.230:6380/0

因此启动命令为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker run -d --env DB_CONN=redis://:123456@192.168.31.230:6380/0 -p 5010:5010 jhao104/proxy_pool:latest

注意:请根据实际情况,修改redis连接信息,-d表示后台运行。

使用

api

启动web服务后, 默认配置下会开启 http://127.0.0.1:5010 的api接口服务:

随机获取一个代理,访问页面

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
http://192.168.31.230:5010/get/

效果如下:

 其中,proxy字段,就是我们需要的代理了

那么在爬虫项目中,获取到这个字段,就可以使用了。

三、项目演示

那么如何知道,我的爬虫项目,用了ip代理,去访问指定的网站呢?

一般来说,打开:https://www.ip138.com/ 就能看到我的公网ip了。但是通过代码爬取这个页面,得到我的公网ip比较麻烦。

有一个简单网页:http://httpbin.org/get 直接访问它,它会返回一段json数据,里面就包含了我的公网ip地址。

那么下面,我将创建一个Scrapy 项目,应用ip代理池,去访问 http://httpbin.org/get,并打印出公网ip地址。

创建项目

打开Pycharm,并打开Terminal,执行以下命令

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
scrapy startproject ip_proxy
cd ip_proxy
scrapy genspider httpbin httpbin.org

在scrapy.cfg同级目录,创建bin.py,用于启动Scrapy项目,内容如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#在项目根目录下新建:bin.py
from scrapy.cmdline import execute
# 第三个参数是:爬虫程序名
execute(['scrapy', 'crawl', 'blog',"--nolog"])

在items.py同级目录,创建proxy_handle.py,内容如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import json
import requests

def get_proxy():
    response = requests.get("http://192.168.31.230:5010/get/").text
    result = json.loads(response)
    # print(result, type(result))
    return result['proxy']

def delete_proxy(proxy):
    requests.get("http://192.168.31.230:5010/delete/?proxy={}".format(proxy))

创建好的项目树形目录如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
./
├── bin.py
├── ip_proxy
│   ├── __init__.py
│   ├── items.py
│   ├── middlewares.py
│   ├── pipelines.py
│   ├── proxy_handle.py
│   ├── settings.py
│   └── spiders
│       ├── httpbin.py
│       └── __init__.py
└── scrapy.cfg

修改httpbin.py

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# -*- coding: utf-8 -*-
import scrapy
import json
from scrapy import Request  # 导入模块

class HttpbinSpider(scrapy.Spider):
    name = 'httpbin'
    allowed_domains = ['httpbin.org']
    # start_urls = ['http://httpbin.org/']
    # 自定义配置,注意:变量名必须是custom_settings
    custom_settings = {
        'REQUEST_HEADERS': {
            'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.75 Safari/537.36',
        }
    }

    def start_requests(self):
        r1 = Request(url="http://httpbin.org/get",
                     headers=self.settings.get('REQUEST_HEADERS'), )
        yield r1

    def parse(self, response):
        # print(response.text,type(response.text))
        result = json.loads(response.text)
        # print(result,type(result))
        origin = result['origin']
        print("公网ip: ",origin)

修改middlewares.py

这里,我主要修改下载中间件的内容

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class IpProxyDownloaderMiddleware(object):
    # Not all methods need to be defined. If a method is not defined,
    # scrapy acts as if the downloader middleware does not modify the
    # passed objects.

    @classmethod
    def from_crawler(cls, crawler):
        # This method is used by Scrapy to create your spiders.
        s = cls()
        crawler.signals.connect(s.spider_opened, signal=signals.spider_opened)
        return s

    def process_request(self, request, spider):
        """
        请求需要被下载时,经过所有下载器中间件的process_request调用
        :param request:
        :param spider:
        :return:
            None,继续后续中间件去下载;
            Response对象,停止process_request的执行,开始执行process_response
            Request对象,停止中间件的执行,将Request重新调度器
            raise IgnoreRequest异常,停止process_request的执行,开始执行process_exception
        """
        proxy = "http://" + get_proxy()
        request.meta['download_timeout'] = 10
        request.meta["proxy"] = proxy
        print('为 %s 添加代理 %s ' % (request.url, proxy))
        # print('元数据为', request.meta.get("proxy"))

    def process_response(self, request, response, spider):
        """
        spider处理完成,返回时调用
        :param response:
        :param result:
        :param spider:
        :return:
            Response 对象:转交给其他中间件process_response
            Request 对象:停止中间件,request会被重新调度下载
            raise IgnoreRequest 异常:调用Request.errback
        """
        print('返回状态码', response.status)
        return response

    def process_exception(self, request, exception, spider):
        """
        当下载处理器(download handler)process_request() (下载中间件)抛出异常
        :param response:
        :param exception:
        :param spider:
        :return:
            None:继续交给后续中间件处理异常;
            Response对象:停止后续process_exception方法
            Request对象:停止中间件,request将会被重新调用下载
        """
        print('代理%s,访问%s出现异常:%s' % (request.meta['proxy'], request.url, exception))
        import time
        time.sleep(5)
        delete_proxy(request.meta['proxy'].split("//")[-1])
        request.meta['proxy'] = 'http://' + get_proxy()

        return request

    def spider_opened(self, spider):
        spider.logger.info('Spider opened: %s' % spider.name)

说明:在请求之前,从ip代理池中获取一个随机ip。当ip代理访问异常时,从ip代理池中,删除这个代理ip。

修改settings.py,应用下载中间件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
DOWNLOADER_MIDDLEWARES = {
   'ip_proxy.middlewares.IpProxyDownloaderMiddleware': 543,
}

执行bin.py,启动爬虫项目,效果如下:

注意:每次访问一个链接时,ip地址是不一样的。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/11/09 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
深度学习轻松学:如何用可视化界面来部署深度学习模型
翻译 | AI科技大本营 参与 | 王赫 上个月,我有幸结识了 DeepCognition.ai 的创始人。 Deep Cognition (深度认知) 建立的深度学习工作室,为很多准备部署深度学习框架和采用人工智能技术的机构打破了诸多难以逾越的障碍。 究竟什么是深度学习? 在我们说明Deep Cognition是如何简化深度学习和人工智能之前,先让我们定义一些深度学习的主要概念。 深度学习,它的核心是用连续"层状"结构来逐级递进的学习有意义的特征表示,其作为机器学习的一个特定的子研究领域,现已成为
企鹅号小编
2018/01/23
2.4K0
深度学习轻松学:如何用可视化界面来部署深度学习模型
【前沿】飞入寻常百姓家:DeepCognition.ai教你轻松部署AI应用
【导读】你是否曾为选择TensorFlow或Keras而感到纠结?又是否认深度学习编程费时费力而感到苦恼?本文带大家领略一下DeepCognition.ai,其致力于克服深度学习向大众化应用中遇到的障
WZEARW
2018/04/11
1.7K0
【前沿】飞入寻常百姓家:DeepCognition.ai教你轻松部署AI应用
深度学习简述
作为人工智能领域里最热门的概念,深度学习会在未来对我们的生活产生显著的影响,或许现在已经是了,从 AlphaGo 到 iPhone X 上的人脸识别(FaceID),背后都有它的身影。关于深度学习,我们能够看到很多优秀的介绍、课程和博客,本文将列举其中的精华部分,而且,你会发现这是一篇「不一样」的文章。 不一样在哪儿呢?可能是本文没有按照「正常」的深度学习博客结构:从数学讲起,然后介绍论文、实现,最后讲应用。我希望用讲故事的方式来介绍深度学习,这可能要比只介绍信息和公式要更加平易近人一些。 我为
朱晓霞
2018/04/18
8430
深度学习简述
这是一份「不正经」的深度学习简述
作为人工智能领域里最热门的概念,深度学习会在未来对我们的生活产生显著的影响,或许现在已经是了,从 AlphaGo 到 iPhone X 上的人脸识别(FaceID),背后都有它的身影。关于深度学习,我
小莹莹
2018/04/18
6430
这是一份「不正经」的深度学习简述
送你一份不正经的深度学习简述(附论文)
来源:机器之心 本文共3798字,建议阅读8分钟。 本文一反常态用讲故事的方式进行介绍,让你对深度学习产生新的认识。 作为人工智能领域里最热门的概念,深度学习会在未来对我们的生活产生显著的影响,或许现
数据派THU
2018/06/12
9070
Medium网友分享了一篇帖子 介绍了他的深度学习心路历程
Medium网友Favio Vázquez分享了他是如何学习深度学习并利用它来解决数据科学问题的。这是一个非正式的帖子,但内容很有趣。以下是他分享的内容。 关于我和深度学习的一点介绍 我的专业是物理和
AiTechYun
2018/03/06
9650
Medium网友分享了一篇帖子 介绍了他的深度学习心路历程
学习使用Deep Learning Studio
Deep Learning Studio是自2017年1月以来第一个强健的深度学习平台,有云计算和桌面计算两个版本,该平台拥有可视化界面。该平台提供了数据提取,模型开发,训练,配置和管理等全面解决方案。Deep Learning Studio由Deep Cognition开发,这是一家人工智能软件公司,它简化了开发和配置人工智能的过程。AI工程师,数据科学家和全球的研究人员免费使用AI软件平台Deep Learning Studio。通过使用Deep Learning Studio,从开发人员到工程师或研究人员,任何人都可以通过与TensorFlow,MXNet和Keras的强大集成获得快速开发和配置深度学习解决方案的能力。
用户8858326
2021/07/21
1K0
深度学习的原理与应用:开启智能时代的大门
深度学习(Deep Learning)是人工智能(AI)和机器学习(ML)领域中备受瞩目的一项技术。凭借其强大的数据处理能力和自我学习能力,深度学习在多个领域展现出了巨大的潜力和应用前景。本文将详细介绍深度学习的基本原理,并通过具体代码示例展示其在图像识别中的应用。
Echo_Wish
2024/12/26
1940
深度学习的原理与应用:开启智能时代的大门
深入探索:【人工智能】、【机器学习】与【深度学习】的全景视觉之旅
人工智能(Artificial Intelligence, AI)是计算机科学的一个分支,旨在开发能够模拟或增强人类智能的系统。AI的研究范围广泛,涵盖了从基础算法到复杂系统的开发。
小李很执着
2024/08/14
1280
Python 深度学习第二版(GPT 重译)(一)
如果你拿起这本书,你可能已经意识到深度学习在最近对人工智能领域所代表的非凡进步。我们从几乎无法使用的计算机视觉和自然语言处理发展到了在你每天使用的产品中大规模部署的高性能系统。这一突然进步的后果几乎影响到了每一个行业。我们已经将深度学习应用于几乎每个领域的重要问题,跨越了医学影像、农业、自动驾驶、教育、灾害预防和制造等不同领域。
ApacheCN_飞龙
2024/03/21
4760
Python 深度学习第二版(GPT 重译)(一)
你现在应该阅读的7本最好的深度学习书籍
原标题: The 7 best deep learning books you should be reading right now 原作者: Adrian Rosebrock 翻译者: Amusi
Amusi
2018/04/12
4K0
你现在应该阅读的7本最好的深度学习书籍
神经网络与深度学习框架
神经网络和深度学习是当前人工智能领域的热门话题,尤其在图像识别、自然语言处理和语音识别等任务中,神经网络的应用取得了突破性进展。深度学习框架的出现使得构建和训练神经网络变得更加高效和便捷。本文将介绍神经网络的基本概念、如何构建基本的神经网络,并结合深度学习框架进行实现。
LucianaiB
2025/01/20
1260
深度学习小白的福音:使用Deep Learning Studio不涉及任何编码,训练并配置深度学习模型
Deep Learning Studio是自2017年1月以来第一个强健的深度学习平台,有云计算和桌面计算两个版本,该平台拥有可视化界面。该平台提供了数据提取,模型开发,训练,配置和管理等全面解决方案。Deep Learning Studio由Deep Cognition开发,这是一家人工智能软件公司,它简化了开发和配置人工智能的过程。AI工程师,数据科学家和全球的研究人员免费使用AI软件平台Deep Learning Studio。通过使用Deep Learning Studio,从开发人员到工程师或研究人员,任何人都可以通过与TensorFlow,MXNet和Keras的强大集成获得快速开发和配置深度学习解决方案的能力。
AiTechYun
2018/07/27
1.2K0
深度学习小白的福音:使用Deep Learning Studio不涉及任何编码,训练并配置深度学习模型
掌握深度学习,为什么要用PyTorch、TensorFlow框架?
【导读】如果你需要深度学习模型,那么 PyTorch 和 TensorFlow 都是不错的选择。
AI科技大本营
2019/09/05
1.5K0
深度学习基础+网络模型
文中的链接请点击网址:http://yerevann.com/a-guide-to-deep-learning/ 预备知识 你必须有大学数学知识。你可以在深度学习这本书的前几章中回顾这些概念: 深度学
IT派
2018/03/28
1.2K0
深度学习基础+网络模型
8个深度学习框架
随着越来越多的企业希望扩大其运营规模,它们已成为接受机器学习和预测分析的必要条件。人工智能与正确的深度学习框架相结合,真正放大了企业在其领域内可以实现和获得的整体规模。
February
2018/12/04
1.4K0
2018年最佳深度学习书单
摘要: AI人才缺口巨大?如果你想成为AI革命中的一员,那么你就必须要学习深度学习,看看这12本书,它们将成为你的利器! 我相信你应该知道人工智能,尤其是深度学习在过去5年左右取得了不错的进步。 深度学习是由少数研究人员开始的一个相对较小的领域,现在已经变得如此主流,以至于我们现在每天使用的应用程序和服务,现在都在使用深度学习来执行不久前难以想象的任务。 但深度学习并不新鲜,从20世纪40年代开始,Warren McCulloch和Walter Pitts就基于数学和算法创建了神经网络的计算模型。 然而,
程序员的酒和故事
2018/03/12
1.1K0
深度学习三大框架对比
人工智能的浪潮正席卷全球,诸多词汇时刻萦绕在我们的耳边,如人工智能,机器学习,深度学习等。“人工智能”的概念早在1956年就被提出,顾名思义用计算机来构造复杂的,拥有与人类智慧同样本质特性的机器。经过几十年的发展,在2012年后,得益于数据量的上涨,运算力的提升和机器学习算法(深度学习)的出现,人工智能开始大爆发。但目前的科研工作都集中在弱人工智能部分,即让机器具备观察和感知能力,可以一定程度的理解和推理,预期在该领域能够取得一些重大突破。电影里的人工智能多半都是在描绘强人工智能,即让机器获得自适应能力,解决一些之前还没遇到过的问题,而这部分在目前的现实世界里难以真正实现。
用户2368476
2018/06/19
2K0
深度学习三大框架对比
R语言中不能进行深度学习?
摘要: R语言现在能也进行深度学习了,而且和python一样好,快来试一试吧。 众所周知,R语言是统计分析最好用的语言。但在Keras和TensorFlow的帮助下,R语言也可以进行深度学习了。 在机器学习的语言的选择上,R和Python之间选择一直是一个有争议的话题。但随着深度学习的爆炸性增长,越来越多的人选择了Python,因为它有一个很大的深度学习库和框架,而R却没有(直到现在)。 但是我就是想使用R语言进入深度学习空间,所以我就从Python领域转入到了R领域,继续我的深度学习的研究了。这可能看
小莹莹
2018/04/24
1.3K0
R语言中不能进行深度学习?
深度学习:7种范例教程分享
来源商业新知网,原标题:MIT高赞深度学习教程:一文看懂CNN、RNN等7种范例(TensorFlow教程)
商业新知
2019/05/07
1.1K0
深度学习:7种范例教程分享
推荐阅读
相关推荐
深度学习轻松学:如何用可视化界面来部署深度学习模型
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档