looter——超轻量级爬虫框架

repo: github.com/alphardex/p…

如今,网上的爬虫教程可谓是泛滥成灾了,从urllib开始讲,最后才讲到requests和selenium这类高级库,实际上,根本就不必这么费心地去了解这么多无谓的东西的。只需记住爬虫总共就三大步骤:发起请求——解析数据——存储数据,这样就足以写出最基本的爬虫了。诸如像Scrapy这样的框架,可以说是集成了爬虫的一切,但是新人可能会用的不怎么顺手,看教程可能还会踩各种各样的坑,而且Scrapy本身体积也有点大。因此,本人决定亲手写一个轻量级的爬虫框架————looter,里面集成了调试和爬虫模板这两个核心功能,利用looter,你就能迅速地写出一个高效的爬虫。另外,本项目的函数文档也相当完整,如果有不明白的地方可以自行阅读源码(一般都是按Ctrl+左键或者F12)。

安装

$ pip install looter
复制代码

仅支持Python3.6及以上版本。

快速开始

让我们先来撸一个非常简单的图片爬虫:首先,用shell获取网站

$ looter shell https://konachan.com/post
复制代码

然后用1行代码将图片的url提取出来

>>> imgs = tree.css('a.directlink::attr(href)').extract()
复制代码

或者用另一种方式提取

>>> imgs = links(res, pattern=r'.*/(jpeg|image)/.*')
复制代码

将url保存到本地

>>> Path('konachan.txt').write_text('\n'.join(imgs))
复制代码

可以通过wget等下载工具将图片下载下来

$ wget -i konachan.txt
复制代码

如果想要看更多的爬虫例子,猛戳这里

工作流

如果你想迅速撸出一个爬虫,那么你可以用looter提供的模板来自动生成一个

$ looter genspider <name> [--async]
复制代码

async是一个备用的选项,它使得生成的爬虫核心用asyncio而非线程池。

在生成的模板中,你可以自定义domain和tasklist这两个变量。

什么是tasklist?实际上它就是你想要抓取的页面的所有链接。

以konachan.com为例,你可以使用列表推导式来创建自己的tasklist:

domain = 'https://konachan.com'
tasklist = [f'{domain}/post?page={i}' for i in range(1, 9777)]
复制代码

然后你就要定制你的crawl函数,这是爬虫的核心部分。

def crawl(url):
    tree = lt.fetch(url)
    items = tree.css('ul li')
    for item in items:
        data = {}
        # data[...] = item.css(...)
        pprint(data)
复制代码

在大多数情况下,你所要抓取的内容是一个列表(也就是HTML中的ul或ol标签),可以用css选择器将它们保存为items变量。

然后,你只需使用for循环来迭代它们,并抽取你想要的数据,将它们存储到dict中。

但是,在你写完这个爬虫之前,最好用looter提供的shell来调试一下你的css代码是否正确。(目前已集成ptpython,一个支持自动补全的REPL)

>>> items = tree.css('ul li')
>>> item = items[0]
>>> item.css(anything you want to crawl)
# 注意代码的输出是否正确!
复制代码

调试完成后,你的爬虫自然也就完成了。怎么样,是不是很简单:)

函数

looter为用户提供了一些比较实用的函数。

view

在爬取页面前,你最好确认一下页面的渲染是否是你想要的

>>> view(url)
复制代码

links

获取网页的所有链接

>>> links(res)                  # 获取所有链接
>>> links(res, search='...')    # 查找指定链接
>>> links(res, pattern=r'...')  # 正则查找链接
复制代码

save

将所得结果保存为数据文件,支持按键值排序(sort_by)和去重(no_duplicate)

>>> total = [...]
>>> save(total, sort_by='key', no_duplicate=True)
复制代码

默认保存为json格式,如果想保存为csv只需把文件名后缀改为csv,但必须保证pandas这个包已经安装好。

套路总结

  1. 通过抓包,确认网站是否开放了api,如果有,直接抓取api;如果没有,进入下一步
  2. 确认网站是静态的还是动态的(有无JS加载,是否需要登录等),方法有:肉眼观察、抓包、looter的view函数
  3. 若网站是静态网页,直接用looter genspider生成爬虫模板,再配合looter shell写出爬虫即可
  4. 若网站是动态网页,先抓包试试,尝试获取所有ajax生成的api链接;如果没有api,则进入下一步
  5. 有的网站并不会直接暴露ajax的api链接,这时就需要你自行根据规律,构造出api链接
  6. 如果上一步无法成功,那么就只好用requestium来渲染JS,抓取页面
  7. 至于模拟登录、代理IP、验证码、分布式等问题,由于范围太广,请自行解决
  8. 如果你的爬虫项目被要求用Scrapy,那么你也可以将looter的解析代码无痛地复制到Scrapy上(毕竟都用了parsel)

掌握了以上的套路,再难爬的网站也难不倒你。

转载于:https://juejin.im/post/5cc45b595188252d891d0549

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值