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


在对网站信息进去抓取时,难免遇到被封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

相关内容

    暂无相关文章

评论关闭