python 构建 ip 代理池以及简单的应用

  • Post author:
  • Post category:python




背景摘要

由于最近在研究爬虫相关知识,有时在频繁获取(爬取)网站数据时会出现 ip 被限制的情况导致无法及时获取想要的数据,因此想着该搞个

ip proxy pool

啦,啥也不说开始干呗。



代码实现

import re
import json
import requests
import urllib
from lxml import etree


url = 'https://raw.githubusercontent.com/fate0/proxylist/master/proxy.list'

class GetIpProxyPool(object):

    ping_url = 'https://blog.csdn.net/DanielJackZ/article/details/106870071'

    def __init__(self, url):
        self.url = url
        self.get_proxy_data()

    def get_proxy_data(self):
        result = requests.get(self.url).text
        self.store_data(result)

    def store_data(self, data):
        f = open('./res.txt', 'w+')
        f.write(data)
        f.close()

    def get_read_lines(self):
        f = open('./res.txt', 'rb')
        lines = f.readlines()
        return lines

    def validate_proxy(self):
        f = open('./useful.txt', 'w+')
        lines = self.get_read_lines()
        for line in lines:
            line = json.loads(line.strip())
            proxy_ip = {line.get('type'): line.get('host')}
            proxy_support = urllib.request.ProxyHandler(proxy_ip)
            opener = urllib.request.build_opener(proxy_support)
            opener.addheaders = [('User-Agent',
                                            'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36')]
            urllib.request.install_opener(opener)
            try:
                response = urllib.request.urlopen(self.ping_url, timeout=5)
            except:
                pass
            if response.read().decode('utf-8'):
                f.write(json.dumps(line) + '\n')

if __name__ == "__main__":
    proxy_pool = GetIpProxyPool(url)
    proxy_pool.validate_proxy()

这部分代码中在

validate_proxy

中实现

ip

代理代码部分为:

.request.ProxyHandler(proxy_ip)
            opener = urllib.request.build_opener(proxy_support)
            opener.addheaders = [('User-Agent',
                                            'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36')]
            urllib.request.install_opener(opener)

在验证

ip

有效可用的方法上使用了一个比较笨的方法:让获取到的

ip

去访问某个网站,通过访问结果是否正常来作为判断依据,能正常获取到请求内容的默认它是有效的反之则无效,后期会在针对这部分代码进行优化



IP 代理池简单应用

当我们通过上面的步骤构建个人

IP

代理池后,我们难道只是简单的解决当我们在获取数据时

IP

被限制这一个问题吗,当然不是这玩意可以做的事情可多了,这里我举个简单的应用场景,当我们写一篇博客是发现阅读量很低想要多刷点访问量我们也可以通过代理

ip

方式去访问对应的链接,达到增加访问量的目的(note: 这只是一个简单的应用场景举例大家应该还是按照正常客流量来看待博客访问量问题)



代码实现

import os
import json
import requests
from lxml import etree
from urllib import request

def get_blog_list(blog_list_url):
    headers = {
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0.1 Safari/605.1.15'
    }
    html = requests.get(blog_list_url, headers=headers).text
    selector = etree.HTML(html)
    data = selector.xpath('//*[@id="articleMeList-blog"]/div[2]/div//a/@href')
    return data

def brush_visits(data):
    f = open(os.path.join(os.path.dirname(__file__), 'useful.txt'))
    for line in f.readlines():
        line = json.loads(line)
        proxy_ip = {line.get('type'): line.get('host')}
        print('>>>', proxy_ip)
        proxy_support = request.ProxyHandler(proxy_ip)
        opener = request.build_opener(proxy_support)
        opener.addheaders = [('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36')]
        for link in data:
            print('brush>>>', link)
            request.urlopen(link)

# 这个地址换成你账户下的博客列表即可
blog_list_url = 'https://blog.csdn.net/xxxxx'
data = get_blog_list(blog_list_url)
brush_visits(data)


项目源码地址



版权声明:本文为DanielJackZ原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。