python爬虫代理ip池搭建

        最近大量爬取数据的时候总会遇到被封ip的情况,所有打算自己搭建一个代理ip池来使用。本次使用的是开源的ip代理池项目ProxyPool

1.下载redis数据库

        redis安装

        这里我选择直接下载redis的解压包形式,方便安装。下载地址:发布 ·TPORADOWSKI/REDIS (github.com)

         下载完成直接解压就可以使用了,使用:redis-server.exe redis.windows.conf命令启动redis服务。也可以直接双击启动程序来启动redis服务

        redis可视化工具

        安装完成redis后,搭配可视化工具使用会更方便一些。下载连接:https://github.com/uglide/RedisDesktopManager/releases/download/0.9.3/redis-desktop-manager-0.9.3.817.exe

        下载完成后选择想要的安装位置直接安装就行了,直接连接本地就行了,什么也不用填,只需要设置名字就行。

2.下载开源 ip代理池—ProxyPool

        ProxyPool安装

        下载地址:GitHub - Python3WebSpider/ProxyPool: An Efficient ProxyPool with Getter, Tester and Server

        下载压缩包解压即可。 

        ProxyPool配置

        可以让chatgpt帮忙把需要用到项目注释换成中文,如果项目报错缺少模块的缺什么模块安装什么模块就好:

        进入到对应目录下修改一些配置,如redis数据库地址,密码,想要使用记号库之类的。如果是跟本教程来做的,不用修改这些配置直接启动run.py运行项目就行了。

        项目启动后redis数据库结果如下,这些IP都在程序帮我们获取到的可以使用的IP:

        ProxyPool的原理简单说一下,就是这个程序去网上获取ip,然后拿回来进行检查,如果是好的就放入IP池里面,同时程序还会自己检查IP池,如果池中出现坏了的IP,程序会将此IP丢出IP池,并重新放入一个可用的IP进入IP池。

        有了IP池后,我们就可以编写程序去调用redis数据库,从数据库中获取一个ip拿来使用。大致代码如下(ProxyPool项目需要一直运行着,因为需要他来不断的给IP池进行补充和检查IP):

import requests

# 通过flask服务,访问本地redis数据库随机获取一个ip
proxypool_url = 'http://127.0.0.1:5555/random'

# 目标网站ip
target_url = 'http://httpbin.org/get'

# 获取代理ip
def get_random_proxy():
    return requests.get(proxypool_url).text.strip()

# 使用代理ip访问目标网站
def crawl(url, proxy):
    proxies = {'http': 'http://' + proxy}
    return requests.get(url, proxies=proxies).text


def main():
    proxy = get_random_proxy()
    print('get random proxy', proxy)
    html = crawl(target_url, proxy)
    print(html)

if __name__ == '__main__':
    main()

3.自定义

        自定义爬虫

        因为这个项目是几年前的了,它爬取的网站可能有些已经不管用了。我们需要在proxypool/crawlers/public目录下添加自己的爬虫文件。

        这是项目中一个爬虫的示例代码:

from pyquery import PyQuery as pq
from proxypool.schemas.proxy import Proxy
from proxypool.crawlers.base import BaseCrawler

# 免费代理IP网站的url
BASE_URL = 'http://www.664ip.cn/{page}.html'

# 爬取该网站的页数
MAX_PAGE = 5

class Daili66Crawler(BaseCrawler):

    # 创建urls任务列表
    urls = [BASE_URL.format(page=page) for page in range(1, MAX_PAGE + 1)]


    # 爬取过程本项目已经实现了,并返回了html    
    def parse(self, html):
        
        # 使用提取手段对返回的html进行提取,例如返回json格式,提取页面中的ip和端口

        for i in html['data']['proxy_list']:
            ip = i['ip']
            port = i['port']

            yield Proxy(host=ip, port=port)

        自定义目标

        在setting中我们可以自己修改测试网站,将测试网站改成我们要爬虫的目标网站,这样做的目的是让我们的prxoy项目爬取到的免费代理ip与目标网站进行连接测试,尽量的保证我们的redis数据库中的代理ip都是可以连接到目标网站的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值