通过爬虫获取数据会经常被服务器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')