利用Flask写了一个代理IP提取接口,并附上电影下载站点刷分程序用于测试代理IP可用性

版权声明:本文为博主原创文章,注明出处,随意转载。 https://blog.csdn.net/IMW_MG/article/details/88602427

热烈庆祝失踪人口回归

代理IP获取接口

  • 接口地址:http://api.faceme.site/proxy/

  • 请求方法:GET

  • 接口参数:

    • limit 单次代理IP提取数量,默认提取全部,int类型

    • scheme 代理方式 httphttps,默认不限

    • oversea 境内代理0或境外代理1,默认不限

    • type 返回文本格式,jsonlines,默认以json形式返回

返回数据示例

  • http://api.faceme.site/proxy/?limit=3&scheme=http&oversea=0
{
    "code": 200,
    "data": [
        {
            "area": "",
            "collect_time": "2019-03-16 13:43:56",
            "oversea": 0,
            "proxy": "170.239.84.24:3128",
            "scheme": [
                "http"
            ],
            "verify_time": "2019-03-16 15:39:48"
        },
        {
            "area": "",
            "collect_time": "2019-03-16 09:41:34",
            "oversea": 0,
            "proxy": "119.28.31.29:8888",
            "scheme": [
                "http"
            ],
            "verify_time": "2019-03-16 15:40:13"
        },
        {
            "area": "",
            "collect_time": "2019-03-16 05:01:34",
            "oversea": 0,
            "proxy": "159.203.14.121:8000",
            "scheme": [
                "http"
            ],
            "verify_time": "2019-03-16 15:38:10"
        }
    ],
    "message": "获取到了 3 个代理IP"
}
  • http://api.faceme.site/proxy/?limit=5&oversea=0&type=lines
47.95.201.41:3128
120.210.219.74:80
139.224.187.136:3128
39.134.67.207:8088
112.85.52.180:8118

代理IP来源与验证

  • 代理IP来源
    • 西刺代理免费代理IP
    • 89代理免费代理IP
    • 无忧代理免费代理IP
    • 66IP代理免费代理IP
    • Fate0开源代理IP
    • 米扑付费代理IP
  • 代理IP验证
    • 境内代理IP验证站点:2019.ip138.com/ic.asp
    • 境外代理IP验证站点:httpbin.org/ip
    • 验证通过条件
      • 设置代理IP后能正常访问目标站点
      • 访问目标站点延迟不超过3s
      • 单个代理IP每5min进行一次验证
    • 验证方式不严谨,通过以上站点验证通过的代理IP也不能确保能正常访问另外的站点

代理IP测试站点—Hao6v电影下载网刷评分

  • hao6v.com站点经DNS查询,主机地址为Los Angeles, California, United States,是境外主机,则选用境外代理IP用于测试
  • 本代理池代理IP测试结论:代理IP可用率超过90%
  • 附上测试代码,Hao6v站点刷电影评分程序
# -*- coding: utf-8 -*-
# @Author : Leo

import sys
import logging
import requests
from bs4 import BeautifulSoup
from urllib.parse import parse_qs, urlparse

logging.basicConfig(level=logging.INFO,  # 最低输出
                    format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
                    datefmt='%d %b %H:%M:%S')


class Hao6vScore:
    """
    hao6v站点刷票
    """

    def __init__(self, movie_url):
        self.movie_url = movie_url

        self.base_headers = {
            'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'}
        # 提交评分的接口
        self.submit_score_url = 'http://www.hao6v.com/e/enews/'
        # 提交评分需要的参数
        self.score_params = {'enews': 'AddInfoPfen', 'classid': '', 'id': '',
                             'doajax': 1, 'ajaxarea': 'showpf', 'fen': 0}
        self._init_score_info()

    def submit_one_score(self, score, proxy):
        """
        利用代理IP提交一次评分
        :param score:
        :param proxy:
        :return:
        """
        if all([self.score_params.get('classid'), self.score_params.get('id')]):
            self.score_params['fen'] = score
            try:
                score_resp = requests.get(url=self.submit_score_url, params=self.score_params,
                                          headers=self.base_headers, proxies=proxy)
                logging.info('点赞成功,当前评分: %s,使用代理IP: %s' % (score_resp.text.split('|')[0], proxy))
            except requests.exceptions.RequestException as err:
                logging.info('点赞失败,失败原因: %s' % err)
        else:
            raise ValueError('未获取到classid或id参数,无法点赞')

    def _init_score_info(self):
        """
        获取点赞信息
        :return:
        """
        try:
            resp = requests.get(url=self.movie_url, headers=self.base_headers)
            if resp.status_code == 200:
                soup = BeautifulSoup(resp.text, 'html.parser')
                iframe_tag = soup.find('iframe', {'id': 'ifc', 'src': True})
                if iframe_tag is not None:
                    classid_id_url = iframe_tag.get('src')
                    parse_result = parse_qs(urlparse(url=classid_id_url).query)
                    self.score_params['classid'] = parse_result.get('classid')[0] \
                        if parse_result.get('classid') is not None else ''
                    self.score_params['id'] = parse_result.get('id')[0] \
                        if parse_result.get('id') is not None else ''
        except requests.exceptions.RequestException:
            pass


def get_proxy(limit=20, oversea=0, scheme=None):
    """
    获取代理IP
    :param limit: 提取代理IP数量
    :param oversea: 是否境外IP,0境内,1境外
    :param scheme: 代理方式
    :return:
    """
    target_proxy_list = None
    # 代理IP获取接口
    proxy_url = 'http://api.faceme.site/proxy/'
    proxy_params = {'limit': limit,
                    'oversea': oversea,
                    'scheme': scheme}
    proxy_resp = requests.get(url=proxy_url, params=proxy_params)
    if proxy_resp.status_code == 200 and proxy_resp.json().get('code') == 200:
        target_proxy_list = [{'http:': 'http://' + item.get('proxy'),
                              'https': 'https://' + item.get('proxy')} for item in proxy_resp.json().get('data')]
    return target_proxy_list


if __name__ == '__main__':
    # 用于测试的hao6v站点《纯洁心灵-逐梦演艺圈》影片链接
    test_movie_url = 'http://www.hao6v.com/gq/2018-08-09/CJXLZMYYQ.html'
    scorer = Hao6vScore(movie_url=test_movie_url)
    while True:
        # 每次提取10个代理IP,选用境外代理,代理方式为http
        proxy_list = get_proxy(limit=10, oversea=1, scheme='http')
        try:
            for each_proxy in proxy_list:
                scorer.submit_one_score(score=5, proxy=each_proxy)
        except ValueError:
            sys.exit(0)

猜你喜欢

转载自blog.csdn.net/IMW_MG/article/details/88602427