Scrapy调用proxypool代理

这段时间要写一个爬虫项目, 但是目标网站ip阈值限制很低, 两下就被ban了, 于是计划引入免费ip代理解决这一情况.

在网上找了很多资料, 但是用起来都是各种奇怪的报错, 只好见步行步, 一个个坑趟过去, 因为坑太多,所以写下这个笔记, 防止下次再做的时候有修半天.

第一步: 部署proxypool, 这个部分分为三步下载proxypool与redis, 启动redis服务, 启动 proxypool.

Scrapy调用proxypool代理

(1). 下载ProxyPool与Redis(系统为Windows)

下载地址:

Releases · jhao104/proxy_pool · GitHub

Scrapy调用proxypool代理

因为是使用windows系统, 这里使用的是

Releases · jhao104/proxy_pool · GitHub

Scrapy调用proxypool代理

比较久远, 但是能用, 不纠结这些

两个压缩包都下载完以后, 随便解压到一个文件夹就行, 先去安装ProxyPool的依赖包

在ProxyPool解压文件夹输入cmd打开命令符

Scrapy调用proxypool代理
pip install -r requirements.txt

Scrapy调用proxypool代理

(2)安装redis

安装好包后, 先去吧redis启动一下

启动方式和ProxyPool一样, 都是在解压文件夹的位置使用cmd

Scrapy调用proxypool代理

先启动redis服务:

redis-server.exe redis.windows.conf

Scrapy调用proxypool代理

我已经启动过了,如果第一次启动会类似这样:

Scrapy调用proxypool代理

在redis根目录再打开一个cmd, 安装redis到 windows服务

redis-server --service-install redis.windows.conf

Scrapy调用proxypool代理

启动redis服务, 需要先把第一步打开的”启动服务”cmd窗口关闭, 再重新打开一个cmd窗口输入:

redis-server --service-start

启动完以后, 直接关闭cmd窗口即可

现在redis应该已经可以正常使用了, 在CMD输入一下代码检查redis状态

redis-cli.exe -h 127.0.0.1 -p 6379

(3)配置ProxyPool

打开ProxyPool所在根目录处的setting.py

Scrapy调用proxypool代理
############### server config ###############
HOST = "0.0.0.0"

PORT = 5010

############### database config ###################
db connection uri
example:
     Redis: redis://:password@ip:port/db
     Ssdb:  ssdb://:password@ip:port
DB_CONN = 'redis://127.0.0.1:6379'

proxy table name
TABLE_NAME = 'use_proxy'

###### config the proxy fetch function ######
PROXY_FETCHER = [
    "freeProxy01",
    "freeProxy02",
    "freeProxy03",
    "freeProxy04",
    "freeProxy05",
    "freeProxy06",
    "freeProxy07",
    "freeProxy08",
    "freeProxy09",
    "freeProxy10"
]

DB_CONN:Redis数据库位置,注意ip和端口,127.0.0.1:6379, 如果redis有秘密啊就加在地址前并在后面加@

启动ProxyPool代理池(1) 启动调度程序:

python proxyPool.py schedule

Scrapy调用proxypool代理

(2) 启动webApi服务:

python proxyPool.py server 

这个可能会出现Api服务启动失败, 出现:ImportError: cannot import name ‘Markup’ from ‘jinja2’ Error

解决办法是安装l Flask==2.0.3Jinja2==3.1.1

pip install Flask==2.0.3
pip install Jinja2==3.1.1.

Api服务启动成功:

Scrapy调用proxypool代理

打开浏览器, 输入127.0.0.1:5010/count/可以查看现在可用的代理数量

Scrapy调用proxypool代理

输入127.0.0.1:5010/get/可以随机获得一条代理

Scrapy调用proxypool代理

第二步: 编写Scrapy中间件

(1).打开Scrapy项目所在根目录的middlewares.py, 添加代码:

from scrapy import signals
import json
import requests
import logging
import json, random

PROXY_URL = 'http://127.0.0.1:5010/get'
####################代理池接口###############################
class ProxyMiddleware(object):

    def __init__(self, proxy_url):
        self.logger = logging.getLogger(__name__)
        self.proxy_url = proxy_url
        # self.method = SSL.SSLv23_METHOD

    def get_random_proxy(self):
        try:
            response = requests.get(self.proxy_url)
            print(str(response))
            road = 0
            asd = 0

            if response.status_code == 200:
                global proxy
                if road == asd :
                    p = json.loads(response.text)
                    print("P的值为" + str(p))
                    proxy = "{}".format(p.get('proxy'))
                    proxy = "http://" + proxy
                    print("代理地址:" + proxy)

                    print('get proxy ...')
                    ip = {"http": proxy, "https": proxy}
                    print("ip: " + str(ip))
                    r = requests.get("http://www.baidu.com", proxies=ip, timeout=60)
                    print("代理返回值为:" + str(r))
                    print("r的网页返回值:" + str(r.status_code))
                    if str(r.status_code) == 200:
                        return proxy
        except:
            print('get proxy again ...')
            return self.get_random_proxy()

    def process_request(self, request, spider):
            proxy = self.get_random_proxy()
            if proxy:
                self.logger.debug('======' + '使用代理 ' + str(proxy) + "======")
                request.meta['proxy'] = proxy

    def process_response(self, request, response, spider):
        if response.status != 200:
            print("again response ip:")
            request.meta['proxy'] = proxy
            return request
        return response

    @classmethod
    def from_crawler(cls, crawler):
        settings = crawler.settings
        return cls(
            proxy_url=settings.get('PROXY_URL')
        )

在这里因为出过很多问题在一直反复修改, 所以添加很多print展示状态, 有强迫症可以直接删掉.

(2).打开Scrapy项目所在根目录的settings.py, 添加以下代码:

###################################启用代理池################################
PROXY_URL = 'http://127.0.0.1:5010/get'

DOWNLOADER_MIDDLEWARES = {
  '你项目的名字.middlewares.ProxyMiddleware': 543,
  'scrapy.downloadermiddleware.httpproxy.HttpProxyMiddleware': None#关闭scrapy自带代理服务
}
DOWNLOADER_CLIENTCONTEXTFACTORY = 'imgsPro.context.CustomContextFactory'

现在已经和代理池连接完毕了

(3).进入到爬虫所在位置, 打开cmd, 启动爬虫:

scrapy crawl 你的爬虫名

Scrapy调用proxypool代理

已经可以正常运行

Original: https://blog.csdn.net/GamersRay/article/details/125909288
Author: GamersRay
Title: Scrapy调用proxypool代理

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/788562/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 图像识别基础代码汇总(python+opencv)

    为了方便复制粘贴,汇总一下基础图像处理代码(如有遗漏欢迎指出,后续再添加修改)没有原理讲解,我也是个小白,方便日后写代码直接复制使用做的笔记 一、导入需要用的设置 二、读入、显示、…

    Python 2023年8月3日
    0111
  • MOCO框架及Flask模拟接口

    主要内容:1.熟悉moco框架实现接口模拟2.基于Flask框架实现模拟接口 1.1 什么是MOCKmock 测试就是在测试过程中,对于某些不容易构造或者不容易获取的对象,用一个虚…

    Python 2023年8月10日
    053
  • 2021-10-21 pytest-metadata运行环境参数提取

    什么是元数据?元数据是关于数据的描述,存储着关于数据的信息,为人们更方便地检索信息提供了帮助。pytest 框架里面的元数据可以使用 pytest-metadata 插件实现。文档…

    Python 2023年9月13日
    030
  • django单元测试

    测Django的东西仅限于在MTV模型。哪些可以测?哪些不可以。 1、html里的东西不能测。 Html里的HTML代码大部分都是写死的,嵌套在html中的Django模板语言也不…

    Python 2023年8月6日
    035
  • Django 4.0.6源码分析:自动重启机制

    之前分析了一波Flask的源码,其实DEBUG模式下,也有自动重启的功能,不过没有深究。最近在研究Django框架,同样也有自动重启的功能,这次我们就来研究一下吧。 Ps:Pyth…

    Python 2023年8月6日
    063
  • Python爬虫代码:双十一到了,爬一下某东看看有没有好东西,这不得买一波大的!

    现在电商平台上的商品数据很多,收集到的数据在电商价格战中占有优势。不,光棍节的预售已经开启,所以你不能对自己好一点,把购物车塞得满满的。 [En] Now there are a …

    Python 2023年5月25日
    066
  • 研发效能之环境管理

    “谁把我的环境给重新部署了?”“我的环境里边的数据怎么不对了?”“谁能帮我把线上的配置同步一下到线下?” 环…

    Python 2023年10月22日
    038
  • 读时加写锁,写时加读锁,Eureka可真的会玩

    大家好,我是三友~~ 在对于读写锁的认识当中,我们都认为读时加读锁,写时加写锁来保证读写和写写互斥,从而达到读写安全的目的。但是就在我翻Eureka源码的时候,发现Eureka在使…

    Python 2023年10月22日
    047
  • pytest.ini配置说明

    抵扣说明: 1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。 Original: https://blo…

    Python 2023年9月10日
    030
  • 多智能体强化学习之MAPPO理论解读

    本文主要是结合文章Joint Optimization of Handover Control and Power Allocation Based on Multi-Agent …

    Python 2023年8月2日
    057
  • Flask-SSTI注入

    我的博客:acsec.xyz微信公众号: Ac sec 一.概述 SSTI即服务端模板注入,是指用户输入的参数被服务端当成模板语言进行了渲染,从而导致代码执行。 1.Flask F…

    Python 2023年8月11日
    033
  • HeartSounds开发日志(2)

    后端部分: (1)form以及modelform的使用. form类里面的Meta类配置form的内容,如help_texts,label标签,需要的fields,需要的model…

    Python 2023年8月5日
    056
  • 基于卷积神经网络的人脸表情识别应用–AR川剧变脸(一)

    1、摘要 本项目将在Android上实现一种通过识别表情类别,从而给人脸戴上不同样式脸谱的AR软件,效果如下: 通过深度学习和Keras训练一个人脸表情识别的卷积神经网络,然后使用…

    Python 2023年10月29日
    050
  • 关于账本数据库:你想知道的这里都有

    💕前言:十二月份出个openGuass集合专栏,带领大家浅浅的认识一下国产数据库吧💕 1. 什么是账本数据库 区块链大家想必都耳熟能详,比特币、以太坊甚至狗狗币等代币,作为区块链的…

    Python 2023年9月27日
    037
  • React Native和Flutter语言如何选择

    为了一份代码能够运行在多个平台,从而节省开发和沟通成本,各公司都开始关注和使用跨端方案。目前,主流的跨端方案,主要分为两种:一种是,将 JavaScriptCore 引擎当作虚拟机…

    Python 2023年11月8日
    038
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球