写了个爬虫用的小工具: LazySpider 发布啦! - V2EX
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
Ehco1996
V2EX    Python

写了个爬虫用的小工具: LazySpider 发布啦!

  •  
  •   Ehco1996 2017-12-19 16:52:57 +08:00 6682 次点击
    这是一个创建于 2929 天前的主题,其中的信息可能已经有所发展或是发生改变。

    lazyspider 并不是一个爬虫框架 他只是一个写爬虫时经常会用到的小工具

    这是我实习的时候写了一个多月爬虫,期间遇到的一些坑, 想着有没有比较好的方式来解决, 于是lazyspider就诞生啦!名字是女票给起的,感觉还不错 hhh~

    功能介绍

    其实目前也就实现了两个功能

    • 将 chrome 浏览器的里cookie/header格式化为dict格式,方便调用
    • pymysql再次封装了一层,做到了基本的增删改查

    所以目前 lazy 里也只有两个小模块:

    • lazyheaders
    • lazystore

    安装

    直接用 pip 安装就可以 仅支持 py3~

    pip install lazyspier 

    使用说明

    lazyspider用起来十分简单

    lazyheaders

    主要用于格式化 cookies 和 headers

    源字符串来自 chrome 开发工具页面请求的 Copy -> Copy as cURL

    复制好原始字符串之后:

    from lazyspider.lazyheaders import LazyHeaders # 注意!字符串要包裹在 三引号 或 双引号 里 curl = "curl 'https://pypi.python.org/pypi' -H 'cookie: .....balabala...." lh = LazyHeaders(curl) headers = lh.getHeaders() cookies = lh.getCookies() print('*' * 40) print('Headers: {}'.format(headers)) print('*' * 40) print('Cookies: {}'.format(cookies)) print('*' * 40) import requests r = requests.get('https://pypi.python.org/pypi', headers=headers, cookies=cookies) print(r.status_code) 

    输出如下:

    **************************************** Headers: {'origin': 'https', 'accept-encoding': 'gzip,deflate,br', 'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8,mt;q=0.7', 'upgrade-insecure-requests': '1', 'user-agent': 'Mozilla/5.0(Macintosh;IntelMacOSX10_13_2)AppleWebKit/537.36(KHTML,likeGecko)Chrome/63.0.3239.84Safari/537.36', 'content-type': '', 'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8', 'cache-control': 'max-age=0', 'authority': 'pypi.python.org', 'referer': 'https'} **************************************** Cookies: {'__utma': '32101439.146958433.1508462081.1509339065.1512998855.2', '__utmz': '32101439.1512998855.2.2.utmcsr=google|utmccn=(organic)|utmcmd=organic|utmctr=(not%20provided)', '_ga': 'GA1.2.146958433.1508462081', '_gid': 'GA1.2.555764366.1513659919', 'login_nonce': 'V649T4tBPTqQmg87ElGoHXQFviJkoz', 'pypi': '520cfc4475316b0c3fc41091af563886'} **************************************** 200 

    是不是很方便呢?

    lazystore

    目前只封装了mysql的操作,用法也简单

    初始化数据库连接

    from lazyspider.lazystore import LazyMysql # 数据库配置 TEST_DB = { 'host': '127.0.0.1', 'user': 'root', 'password': 'xxx', 'db': 'EhcoTestDb' } # 初始化数据库链接 store = LazyMysql(TEST_DB) 

    保存数据

    # 将要保存的数据以字典格式存储 data = {'id': 1, 'name': 'ehco', 'age': 20} # 新增数据的方法 # 只需要传入 数据<dict> 表名 两个参数 state = store.save_one_data(data, 'testtable') print(state) # 数据保存成功会返回 1 # 保存失败会返回-1 并答应错误堆栈 >>1 

    删除数据

    # 这里我将 id 为 1 的数据删除 state = store.delete_by_field('testtable','id','1') print (state) >>1 

    更新数据

    # 这里我更新 id 为 1 的 name 字段 data = {'id': 1, 'name': 'superehco', 'age': 20} state = store.update_by_id(data, 'testtable', '1') print(state) >>1 

    查询数据

    # 这里我更新 id 为 1 的 name 字段 res = store.find_by_field('testtable', 'age', '20') print(res) # 返回的是一个列表,每条查询记录都以字典格式返回 ''' [{'id': 1, 'name': 'superehco', 'age': 20}, {'id': 2, 'name': 'lurenjia', 'age': 20}] ''' 

    SQL 语句查询

    # 手撸 sql 也是必备的 sql = "select * from testtable" res = store.query(sql) print(res) ''' [{'id': 1, 'name': 'superehco', 'age': 20}, {'id': 2, 'name': 'lurenjia', 'age': 20}] ''' 

    结语

    目前也就做了这两个非常小的功能, 但这些都是我在平日里工作中每天都需要打交道的事情

    大家有什么好的想法可以一起开发~ 该项目已经放在GitHub上啦 地址: https://github.com/Ehco1996/lazySpider

    最后求个 Star 不过分吧~

    40 条回复    2017-12-23 09:36:02 +08:00
    welkinzh
        1
    welkinzh  
       2017-12-19 20:27:02 +08:00
    emmm... postman 可以完成你的第一个功能
    Ehco1996
        2
    Ehco1996  
    OP
       2017-12-19 20:31:47 +08:00 via iPhone
    @welkinzh
    没有用过耶 明天去试试
    scriptB0y
        3
    scriptB0y  
       2017-12-19 20:35:16 +08:00   3
    也推荐一下这个

    https://curl.trillworks.com/
    scriptB0y
        4
    scriptB0y  
       2017-12-19 20:36:27 +08:00   3
    @scriptB0y 之前总结了一些好用的爬虫工具,顺便贴下……

    https://www.kawabangga.com/posts/2365
    naiba
        5
    naiba  
       2017-12-19 20:38:32 +08:00 via Android
    这种东西优化好再拿出来吧
    mochanight
        6
    mochanight  
       2017-12-19 22:19:33 +08:00 via iPhone
    @scriptB0y 这是个神器。一直在用
    mimzy
        7
    mimzy  
       2017-12-19 22:25:37 +08:00
    不错~MySQL 的这个封装给了我一些启发 刚好最近操作得比较烦~
    fengche361
        8
    fengche361  
       2017-12-19 22:28:42 +08:00
    jeffreychiu95
        9
    jeffreychiu95  
       2017-12-20 01:38:16 +08:00 via Android
    不错,正需要
    Ehco1996
        10
    Ehco1996  
    OP
       2017-12-20 07:31:22 +08:00 via iPhone
    @scriptB0y 不错耶 谢谢
    Ehco1996
        11
    Ehco1996  
    OP
       2017-12-20 07:31:49 +08:00 via iPhone
    @naiba 什么意思 哪里有 bug 了
    Ehco1996
        12
    Ehco1996  
    OP
       2017-12-20 07:34:22 +08:00 via iPhone
    @mimzy 哈哈可以把常用的数据库操作都封装一下 这样用起来就很方便了
    lhx2008
        13
    lhx2008  
       2017-12-20 07:49:52 +08:00 via Android
    好像,切文本这种,一行 lamda 就实现了
    naiba
        14
    naiba  
       2017-12-20 08:07:50 +08:00 via Android   1
    我的意思是做的稍微像点样了再拿出来,写了两个函数就拿出来有点不像话了。

    http header to list

    还一个 mysql 的,你不知道装个 ORM 吗

    还是我给那个 iOCR 的评论,小儿科的东西不要往外拿。
    xiaozizayang
        15
    xiaozizayang  
       2017-12-20 08:30:42 +08:00
    支持楼主 谁不是新手来的
    ctro15547
        17
    ctro15547  
       2017-12-20 09:48:55 +08:00
    hehhee 支持一下, 之前为了方便也跟做过这类事情,就当练习了。
    Ehco1996
        18
    Ehco1996  
    OP
       2017-12-20 11:38:23 +08:00 via iPhone
    @naiba
    不喜欢
    觉得低级可以不用啊
    我求着你用了?

    我写什么是我的自由吧 和你有关系吗?
    真不知道哪这么大抱怨
    Ehco1996
        19
    Ehco1996  
    OP
       2017-12-20 11:39:28 +08:00 via iPhone
    @xiaozizayang
    谢谢支持!
    Ehco1996
        20
    Ehco1996  
    OP
       2017-12-20 11:39:40 +08:00 via iPhone
    @binux
    学习了!
    ligyxy
        21
    ligyxy  
       2017-12-20 11:44:11 +08:00 via Android
    realkenshinji
        22
    realkenshinji  
       2017-12-20 11:52:10 +08:00 via iPhone
    @naiba 如果你看看 npm 社区的 package,再看看楼主的....hmm

    我是支持楼主的,哪有什么一开始就做得很完善的东西,楼主善于把重复劳动整理成代码然后再分享出来就已经是很赞的了。至于已经有些成熟的工具有了相应的功能,程序员嘛,不都是喜欢重复造各种轮子嘛
    realkenshinji
        23
    realkenshinji  
       2017-12-20 11:54:47 +08:00 via iPhone
    @naiba 另外你如果觉得楼主的代码不好,可以优化,那你可以提 pr 或者 issue 啊,这是楼主改进的动力,talk is cheap, show me the code.
    Nick2VIPUser
        24
    Nick2VIPUser  
       2017-12-20 13:01:02 +08:00
    项目刚开始都不是十全十美了,后期慢慢迭代就好。支持
    sensui7
        25
    sensui7  
       2017-12-20 13:25:38 +08:00
    @realkenshinji 又黑我前端
    Allianzcortex
        26
    Allianzcortex  
       2017-12-20 13:28:35 +08:00
    其实 pypi 包写上一次就知道没那么难了...
    Allianzcortex
        27
    Allianzcortex  
       2017-12-20 13:32:16 +08:00   1
    其实看看代码我觉得还好...但 SQL 注入是无法防止的...每个 CRUD 后面的代码都是重复的,可以用 query() 直接简化喵 LZ 能解释一下你为什么写 query() 这个函数却不用吗? LZ 不是没写而是写了却没有用啊......?为什么会写了却没用?...
    Allianzcortex
        28
    Allianzcortex  
       2017-12-20 13:46:16 +08:00
    @ligyxy GWU 现在还没回我......
    ligyxy
        29
    ligyxy  
       2017-12-20 13:55:21 +08:00
    @Allianzcortex 美国人效率确实不高,需要帮忙的话可以联系我
    Allianzcortex
        30
    Allianzcortex  
       2017-12-20 13:57:59 +08:00
    @ligyxy 嗯,谢啦:D 不过看一亩三分地最近的形势,也在考虑还是换个地方比较好? fresh grad 太不友好了 quq
    realkenshinji
        31
    realkenshinji  
       2017-12-20 14:11:29 +08:00
    @sensui7 跟前端不前端关系不大,就是在说 js 的生态而已,你看看 npm 之王 Sindre Sorhus 的这个项目才几行代码 https://github.com/sindresorhus/has-emoji
    然而我并不是在批评 Sindre Sorhus, 人家在接受采访的时候明确说了,他只是觉得代码模块就跟乐高一样,把小块小块的组合一下就能有更多的用途
    https://medium.freecodecamp.org/sindre-sorhus-8426c0ed785d
    Ehco1996
        32
    Ehco1996  
    OP
       2017-12-20 14:30:18 +08:00
    @Allianzcortex 谢谢 ,我是最后才写 query 的....一开始先写了 CURD 操作。你不说我还真想不起来...我去改一下
    Allianzcortex
        33
    Allianzcortex  
       2017-12-20 14:38:18 +08:00
    @Ehco1996 其实还可以统一一下两个包的命名,比如 Python 向就统一下划线吧,headers 文件里就不要用驼峰了。还有 data 是不可数名词...
    sensui7
        34
    sensui7  
       2017-12-20 14:45:57 +08:00
    @realkenshinji

    node 的生态一直是这样的,我也很认同, 但具体到这个项目, 它还依赖 emoji-regex, 他这个项目其实就是一行代码, 用 emoji-regex 判断一下 text.

    这个要是我等 publish 出来, 可能会被笑话.
    Ehco1996
        35
    Ehco1996  
    OP
       2017-12-20 15:09:00 +08:00
    @Allianzcortex 老哥看的真仔细,我都感动了!
    Allianzcortex
        36
    Allianzcortex  
       2017-12-20 15:53:59 +08:00
    @Ehco1996 我就看了一下......
    Allianzcortex
        37
    Allianzcortex  
       2017-12-20 19:24:52 +08:00
    年轻真好啊
    Nugine
        38
    Nugine  
       2017-12-22 00:50:43 +08:00 via Android
    这个工具给我一些启发,以后可能会参与吧。
    不过真正要用起来的话,我会选择照着源码按自己的方式重写一遍,嵌入到自己的东西里去。
    (就是抄一遍……)
    Ehco1996
        39
    Ehco1996  
    OP
       2017-12-22 07:18:05 +08:00 via iPhone
    @Nugine 谢谢支持哈哈哈
    Ginson
        40
    Ginson  
       2017-12-23 09:36:02 +08:00
    支持楼主,感谢楼主分享。
    数据库的增删改查我也正准备自己造一个,这种小轮子自己造一下不挺好吗,不然怎成长
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2779 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 36ms UTC 02:08 PVG 10:08 LAX 18:08 JFK 21:08
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86