V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
awolfly9
V2EX  ›  Python

听说今天情人节。开源一个爬虫代理框架,各位大神轻喷

  •  
  •   awolfly9 · 2017-02-14 00:12:29 +08:00 · 7110 次点击
    这是一个创建于 2627 天前的主题,其中的信息可能已经有所发展或是发生改变。

    听说开源才能走的更高更远,才能让自己成长,所以尝试自己写的爬虫代理框架 IPProxyTools 。各位大神轻喷。

    使用 scrapy 爬虫抓取代理网站,获取大量的免费代理 ip 。过滤出所有可用的 ip ,存入数据库以备使用。

    github 地址: https://github.com/awolfly9/IPProxyTool

    第 1 条附言  ·  2017-02-14 09:06:31 +08:00
    很多人收藏,却很少人回复

    []
    43 条回复    2017-02-15 12:43:27 +08:00
    deleted
        1
    deleted  
       2017-02-14 00:57:50 +08:00
    抓代理很有用,学习了
    imcocc
        2
    imcocc  
       2017-02-14 03:36:22 +08:00 via iPhone
    mysql 是不是有点重,有没有考虑 sqlite ?
    uzumaki
        3
    uzumaki  
       2017-02-14 03:44:05 +08:00 via Android
    已 star
    songdezu
        4
    songdezu  
       2017-02-14 04:34:20 +08:00
    有了可用 ip list 之后, 怎么用户爬虫本身去轮流循环替换代理?
    awolfly9
        5
    awolfly9  
    OP
       2017-02-14 07:17:39 +08:00
    @imcocc 最开始就是尝试用的 splite ,后来改成 mysql 是为了数据更长久的保存,以及后续分布式部署。

    @uzumaki 如果有什么问题,请给我反馈

    @songdezu 目前的做法是从服务器端口获取到 ip list 之后,在 scrapy 请求的 Middleware 中循环从 ip list 中取 ip ,如果发现 ip 不可用就马上删除 ip 。当 ip list 剩余很少时,重新向服务器请求。具体可以参考我后续开源的利用这个代理 ip 抓取豆瓣电影以及书籍的爬虫
    awolfly9
        6
    awolfly9  
    OP
       2017-02-14 07:21:37 +08:00
    @deleted 共同进步
    Felldeadbird
        7
    Felldeadbird  
       2017-02-14 09:22:39 +08:00
    ip 有时效性啊。楼主入库多久会清理一次啊
    hellopython
        8
    hellopython  
       2017-02-14 09:27:39 +08:00 via iPhone
    学习了,谢谢分享!!!
    awolfly9
        9
    awolfly9  
    OP
       2017-02-14 09:35:34 +08:00   ❤️ 1
    @Felldeadbird 抓取的所有免费 ip 或插入到表 free_ipproxy .如果验证之后的有效 ip 会放在单独的表里面。具体表名可以配置,例如抓取豆瓣就放在 douban 中。然后 free_ipproxy 每次抓取的时候回删掉半个小时之前的数据。代理 ip 验证会先验证当前表中之前已经验证过的代理,如果不可用就从当前表中移除,然后在验证 free_ipproxy 中的代理,如果可用就加入到表中。
    dongxiaozhuo
        10
    dongxiaozhuo  
       2017-02-14 09:52:20 +08:00
    已经 star 。不过我的代理都是 zmap 扫描端口,验证请求 http://httbin.org/get 页面,正常返回即入库。数据库中峰值有 7W+ 可用的 http 代理,平均 3w+ 。
    wujunze
        11
    wujunze  
       2017-02-14 09:58:10 +08:00
    感谢分享
    heissuperhan
        12
    heissuperhan  
       2017-02-14 10:02:01 +08:00 via iPhone
    免费代理基本没有用
    youyoumarco
        13
    youyoumarco  
       2017-02-14 10:28:39 +08:00
    学习爬虫中。感谢分享
    ijustdo
        14
    ijustdo  
       2017-02-14 10:47:29 +08:00
    免费代理不做验证 基本好多都没法用的 小伙子加上代理验证吧

    这玩意 2007 年就做过 当时分布式抓取 分布式验证 服务端在 linux 客户端在 win 自动清理无效代理
    当时是给分布式爬虫用的
    awolfly9
        15
    awolfly9  
    OP
       2017-02-14 11:04:29 +08:00
    @ijustdo 是有代理验证的。抓取,验证,然后提供接口。
    hadoop
        16
    hadoop  
       2017-02-14 11:09:25 +08:00
    @dongxiaozhuo 这个数量 nb !
    jiezhi
        17
    jiezhi  
       2017-02-14 11:13:03 +08:00
    感谢分享, star 为敬
    mclxly
        18
    mclxly  
       2017-02-14 11:14:40 +08:00
    都 2017 了,为何不用 Python 3 写呢
    onestar
        19
    onestar  
       2017-02-14 11:49:20 +08:00
    学习了,已 star
    awolfly9
        20
    awolfly9  
    OP
       2017-02-14 12:31:36 +08:00
    @mclxly 以后开一个分支出来用 python3
    Clarencep
        21
    Clarencep  
       2017-02-14 13:01:45 +08:00
    已 star
    yesineedroot
        22
    yesineedroot  
       2017-02-14 14:12:31 +08:00
    感谢分享!
    kutata
        23
    kutata  
       2017-02-14 14:59:37 +08:00
    感谢分享~
    holyzhou
        24
    holyzhou  
       2017-02-14 15:24:45 +08:00
    通过 8000 端口 我怎么能拿到最近的按照响应排序好的可用的 http 地址 好像 api 接口有点弱。
    "http://127.0.0.1:8000/select?name=douban",我没理解这里的豆瓣是做什么用的
    vh2h
        25
    vh2h  
       2017-02-14 15:38:21 +08:00
    我提一个问题。你开源一个爬虫代理框架,和今天是情人节之间有什么关系呢?这之间没有任何逻辑可言嘛!
    lwd2136
        26
    lwd2136  
       2017-02-14 15:40:45 +08:00
    不错,已经收藏。
    herozzm
        27
    herozzm  
       2017-02-14 15:47:37 +08:00 via Android
    验证是关键,不然大量无用 ip ,功能就废了
    qsnow6
        28
    qsnow6  
       2017-02-14 16:10:13 +08:00
    @dongxiaozhuo 之前也想要这么操作,有没有示例
    Inn0cence
        29
    Inn0cence  
       2017-02-14 17:47:26 +08:00 via iPhone
    爬虫菜🐔学习。马可 学习下
    yuansmin
        30
    yuansmin  
       2017-02-14 18:20:48 +08:00
    项目挺不错的,赞一个。不过这个瓶颈主要还是网上的免费代理不靠谱啊
    holyzhou
        31
    holyzhou  
       2017-02-14 18:27:34 +08:00
    @awolfly9 感谢, 用了半天 还不错 改了 scan 的频率, 拿到的地址比我 1 块钱淘宝买的靠谱些,但也会有连接失败的,再者就是拿到的数量并不多(通过 http://127.0.0.1:8000/select?name=douban 拿到的)
    awolfly9
        32
    awolfly9  
    OP
       2017-02-14 19:49:10 +08:00
    @holyzhou 可用的代理 ip 会随着时间的增加而增加。由于我抓取的站点比较少,而且那些站点更新免费 ip 也很慢,所以有效的 ip 会随着时间增加而不断积累。失效的 ip 会被淘汰。
    awolfly9
        33
    awolfly9  
    OP
       2017-02-14 19:49:32 +08:00
    @yuansmin 你说的很对
    gamecmt
        34
    gamecmt  
       2017-02-14 20:22:58 +08:00
    强,已 star
    botman
        35
    botman  
       2017-02-14 21:22:57 +08:00
    好项目,表示去年也写过一个类似的项目,做爬虫必备良品啊,给 lz 顶一个先。
    给点建议,既然是写框架就不建议把代理站点硬编码进去,因为现在不少开放代理站点需要进行 js 解析才能拿到代理,所以不同的开放代理站点的解析规则也是不同的,建议把这部分功能里独立开来,规则大家可以一起维护。
    liangmishi
        36
    liangmishi  
       2017-02-14 22:08:49 +08:00
    感谢开源~
    Nyloner
        37
    Nyloner  
       2017-02-14 23:10:40 +08:00
    哈哈,前段时间也写了一个类似项目: http://nyloner.cn/proxy
    mingyun
        38
    mingyun  
       2017-02-14 23:16:32 +08:00
    130+ 收藏,厉害了
    anexplore
        39
    anexplore  
       2017-02-14 23:20:08 +08:00
    年前搞了一个扫描 ip:port 查找 http 代理的,功能还不完善。 https://github.com/anexplore/proxydetector.git
    DevilBin
        40
    DevilBin  
       2017-02-15 08:32:16 +08:00 via Android
    已 star
    awolfly9
        41
    awolfly9  
    OP
       2017-02-15 08:59:38 +08:00
    @botman 现在是一个站点一个脚本,非常方便维护,而且相互之间可以没有影响和关联
    fuxkcsdn
        42
    fuxkcsdn  
       2017-02-15 11:34:45 +08:00
    那个...运行了半小时左右, 66ip 就抓到 6 个代理...不合理啊...只抓取首页吗??
    半小时就只抓到 279 个代理 IP ,略少...
    awolfly9
        43
    awolfly9  
    OP
       2017-02-15 12:43:27 +08:00
    @fuxkcsdn 我只抓了首页,因为在之前的测试中发现后面的很多 IP 都失效了,抓下来也没什么作用。如果想要抓取多页,只需要到 sixsixip.py 中 self.urls = ['http://m.66ip.cn/%s.html' % n for n in range(1, 2)] 更改 2 为 想要抓取的页数
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1473 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 23:55 · PVG 07:55 · LAX 16:55 · JFK 19:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.