通过爬虫获取数据会经常被服务器ban掉ip,所以有个有效的proxy pool十分必要。这几天在爬网易云音乐的用户数据,顺便搞了个proxyhunter,并且尝试发布成pip包:proxyhunter,方便以后的使用。下面主要说下requests在进行请求的时候,proxy如何设置,以及我这个proxyhunter如何使用。

这里获取的proxy都是免费的,来自http://www.kuaidaili.com/。如果对proxy有比较高的要求,可以使用付费版的,我买了一周的开放代理,和免费的比起来,返回的代理列表中可用的比例相对来说还是挺高的。

request的proxy

在利用requests进行数据请求的时候,可以通过设置proxy来指定请求的proxy,当然,如果proxy不可用,请求是无法返回所需要的数据的。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
    def test_proxy(current_proxy):
        # param: current_proxy是一个由host和port构成的tuple
        # 将获得的proxy通过'http://ip.cn/'测试,如果可用返回True
        proxies = dict()
        if current_proxy:
            proxies['http'] = "http://{}:{}".format(*current_proxy)
            proxies['https'] = "http://{}:{}".format(*current_proxy)
            try:
                test_response = requests.get(
                    'http://ip.cn/', timeout=5, proxies=proxies)
            except Exception:
                return False
            else:
                if test_response.status_code == 200:
                    test_soup = BeautifulSoup(test_response.content, 'lxml')
                    ip_info = test_soup.select('.well')
                    if ip_info:
                        print(ip_info)
                        return True
                else:
                    return False

可以看到,在通过request调用get的时候,设置proxies=proxies即可。 通过请求http://ip.cn/可以查询到当前的ip和port,前提是当前的proxy可用。

proxyhunter

由于是第一次向pypi提交python包,还是有必要记录一下过程:

  1. 第一步当然是注册用户
  2. 在完成注册和邮箱验证之后,可以安装一个twine,稍后上传包会用到这个工具
  3. 打包代码:
    1
    2
    3
    4
    5
    6
    7
    
    ├── LICENSE
    ├── README.md
    ├── proxyhunter
    │   ├── __init__.py
    │   └── huntingOn.py
    ├── requirements.txt
    └── setup.py
    

    初始情况下,自己的代码放在proxyhunter目录中,编写打包相关代码,在setup.py中:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    
    from setuptools import setup, find_packages
    
    setup(
        name="proxyhunter",
        version="0.0.1",
        keywords=("pip", "http", "http proxy"),
        description="free available http proxy from web",
        long_description="proxy hunter",
        license="MIT Licence",
    
        url="https://eclipsesv.com",
        author="wangmengcn",
        author_email="eclipse_sv@163.com",
    
        packages=find_packages(),
        include_package_data=True,
        platforms="any",
        install_requires=["requests", "lxml", "bs4"]
    )
    

    这里边的配置根据自己要发布包的具体情况而定。 然后就可以通过

    1
    2
    
    python setup.py bdist_egg   # easy_install
    python setup.py sdist       # pip
    

    在dist目录中生成对应文件:

    1
    2
    
    ├── proxyhunter-0.0.1-py2.7.egg
    └── proxyhunter-0.0.1.tar.gz
    

    这样就完成了代码的打包。🍺🍺🍺

  4. 发布代码 使用刚才安装的工具twine:twine upload dist/* 在命令行中输入对应内容即可。 这时候,目录结构应该是这样的:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
    ├── LICENSE
    ├── README.md
    ├── build
    │   ├── bdist.macosx-10.12-intel
    │   └── lib
    │       └── proxyhunter
    │           ├── __init__.py
    │           └── huntingOn.py
    ├── dist
    │   ├── proxyhunter-0.0.1-py2.7.egg
    │   └── proxyhunter-0.0.1.tar.gz
    ├── proxyhunter
    │   ├── __init__.py
    │   └── huntingOn.py
    ├── proxyhunter.egg-info
    │   ├── PKG-INFO
    │   ├── SOURCES.txt
    │   ├── dependency_links.txt
    │   ├── requires.txt
    │   └── top_level.txt
    ├── requirements.txt
    └── setup.py

并且,网站上可以看到相关的内容

proxyhunter用法

由于现在已经打包了,用的时候也会十分简单:

  1. 安装 pip install proxyhunter
  2. 使用
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
    In [1]: from proxyhunter.huntingOn import Hunter

    In [2]: hunter = Hunter()

    In [3]: for proxy in hunter:
       ...:     print proxy
       ...:
    wating for new proxy
    wating for new proxy
    [<div class="well"><p>\u60a8\u73b0\u5728\u7684 IP\uff1a<code>60.174.237.43</code></p><p>\u6240\u5728\u5730\u7406\u4f4d\u7f6e\uff1a<code>\u5b89\u5fbd\u7701\u5de2\u6e56\u5e02 \u7535\u4fe1</code></p><p>GeoIP: Hefei, Anhui, China</p></div>]
    (u'60.174.237.43', u'9999')