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 · 6234 次点击
    这是一个创建于 2538 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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   ·   实用小工具   ·   1011 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 19:41 · PVG 03:41 · LAX 11:41 · JFK 14:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.