欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

搭建免费代理池---采集代理(1)

程序员文章站 2022-06-07 11:06:59
在对网站信息进去抓取时,难免遇到被封IP的情况。针对这一情况可采用代理IP的方法来处理,好了 现在我遇到的问题是什么呢? 就是我没有代理IP啊。 百度了下,发现网上有好多免费的代理IP,所以我决定把能找到的所以免费代理IP全部采集下来,以后做成接口的方式来供大家免费使用。 本篇文章主要是对采集 “6 ......

在对网站信息进去抓取时,难免遇到被封ip的情况。针对这一情况可采用代理ip的方法来处理,好了  现在我遇到的问题是什么呢? 就是我没有代理ip啊。

百度了下,发现网上有好多免费的代理ip,所以我决定把能找到的所以免费代理ip全部采集下来,以后做成接口的方式来供大家免费使用。

本篇文章主要是对采集 “66免费代理网 http://www.66ip.cn/”做技术总结。

1、get/post 请求

为了让操作更加简单 采用工厂模式对get / post 请求进行了封装。

import requests
import abc

'''
请求方法抽象类
'''


class absmethod:

    @abc.abstractmethod
    def request(self, url, attach):
        pass


'''
get 方法
'''


class get(absmethod):
    '''
    请求
    '''

    def request(self, url, attach) -> requests.response:
        res = requests.post(url, attach)
        if not res.ok:
            return res.raise_for_status()
        return res


'''
post 方法
'''


class post(absmethod):
    '''
    请求
    '''

    def request(self, url, attach) -> requests.response:
        res = requests.get(url, attach)
        if not res.ok:
            return res.raise_for_status()
        return res


'''
方法工厂
'''


class methodfactory:
    def create(self, method: str) -> absmethod:
        return eval(method)()


'''
http 请求
'''


class httpreuqest:

    '''
    发送求请
    '''
    @staticmethod
    def send(url, attach = {}, method='get') -> requests.response:
        factory = methodfactory()
        target = factory.create(method)
        return target.request(url, attach)

 

2、采集目标站点

class www_66ip_cn:

    '''
    url地址
    '''
    __url = 'http://www.66ip.cn'

    '''
    页面编码
    '''
    __code = 'gbk'

    '''
    选择器
    '''
    __selector = '.containerbox table tr'

    '''
    获取免费代理
    '''

    def get_proxy(self) -> str:
        soup = bs4.beautifulsoup(self.text, 'lxml')
        result = soup.select(self.__selector)
        result = self.__filters([str(n) for n in result])
        return result

    '''
    获取页面内容
    '''
    @property
    def text(self) -> str:
        http = httpreuqest()
        res = http.send(self.__url)
        if res.headers['content-encoding'] == 'gzip':  # 页面采用gizp压缩了,需要对它进行解码不然中文会乱码
            return res.content.decode(self.__code)
        return res.text

    '''
    过滤
    '''

    def __filters(self, items: list[str]) -> list[list]:
        result, regex = [], re.compile(r'<td>([^<>]+)</td>')
        for item in items:
            result.append(regex.findall(item))
        return result


proxy = www_66ip_cn()

d = proxy.get_proxy()

print(d)

 

3、技术总结

  目标站点采用了 gzip 进行了页面压缩,如果不对页面进行解码那么中文字符就会以乱码的形式出现。针对这一情况,可采用 字符串函数 decode()进行解码

  

  

4、百度网盘

链接:https://pan.baidu.com/s/1bstzsfptemccfoum6_4ruw
提取码:dlsr