侧边栏壁纸
博主头像
Into The Abyss 博主等级

My Life is a Death Race

  • 累计撰写 34 篇文章
  • 累计创建 7 个标签
  • 累计收到 4 条评论

目 录CONTENT

文章目录

个人代理池搭建

Administrator
2022-07-02 / 0 评论 / 0 点赞 / 403 阅读 / 0 字

前言

我们在使用爬虫的时候,如果请求次数过于频繁,经常会遇到IP被封的情况,导致本机IP在一定时间段内无法访问。

为了防止这种情况的发生,我们可以通过搭建个人代理池来避免。下面,我将通过一个Github开源项目来完成个人代理池的搭建。

Redis环境搭建

该项目是建立在Redis环境之上的,所以首先需要安装和配置Redis。Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。其项目地址为Releases · tporadowski/redis · GitHub下载其中的zip并解压。可以通过打开解压目录下的redis.windows.conf文件来对Redis进行相关配置,在Windows下常用的主要是配置密码:使用Ctrl+F搜索其中的requirepass来进行连接密码的配置。

在使用前需要首先打开其中的redis-server.exe.如果出现下图显示图片说明服务启动成功。

redisstart

你可以通过解压目录下的redis-cli.exe 来进行连接。不过,在使用过程中不能关闭redis_server。这样十分麻烦,所以我们还需要对其进行自启动配置,使其一直运行在后台。在redis项目目录下打开cmd窗口,键入下列代码来打开自启动服务。

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

然后通过下列方式启动redis-server

redis-server --service-start

其他redis服务命令:

  • 卸载服务:redis-server --service-uninstall

  • 停止服务:redis-server --service-stop

至此,redis配置完成。

代理池搭建

首先从项目地址中下载项目并解压。然后建立一个python虚拟环境。可以通过Annaconda进行包管理。也可以直接所需要的包安装在当前环境下。本文主要采用conda来进行包管理。首先通过Ctrl+R键入cmd或者直接打开Annaconda Prompt

然后,创建虚拟环境:

conda create -n your_env_name python=x.x

其中,your_env_name为虚拟环境的名字,python=x.x为python的版本(该项目python版本应该大于等于3.6,如果不指明具体的版本号,则默认当前最高版本)

然后打开解压文件夹,我使用的是VS Code,切换到刚才建立的虚拟环境下,通过

pip insyall -r requirements.txt

安装所依赖的包。

打开项目下的run.py运行即可,如果之前给redis设置了密码,还需要打开项目下的setting.py并找到

REDIS_PASSWORD = env.str('REDIS_PASSWORD', None)

将其中的None改为你设置的密码,再通过run.py来运行。

最后,可以在浏览器中输入

http://localhost:5555/random

检查是否可任意获取到代理IP。

至此,个人代理池搭建完毕。在爬虫代码中使用下列模板即可完成使用。

url = 'YOUR_URL'
proxy_url = 'http://localhost:5555/random'  # 代理池请求网址
headers = {
    'User-Agent': 'Chrome/10'
}


de get_proxy():
    try:
        resp = requests.get(proxy_url)
        if resp.status_code == 200:
            # print(resp.text)
            return resp.text
        return None
    except ConnectionError:
        return None



def get_html():
    proxy = get_proxy()
    proxies = {
        'http': 'http://' + proxy
    }
    response = requests.post(url, headers=headers, proxies=proxies)
    if response.status_code == 200:
        return response
    else:
        return get_html()
0

评论区