repo: github.com/alphardex/p…css
现在,网上的爬虫教程可谓是泛滥成灾了,从urllib开始讲,最后才讲到requests和selenium这类高级库,实际上,根本就没必要这么费心地去了解这么多无谓的东西的。只需记住爬虫总共就三大步骤:发起请求——解析数据——存储数据,这样就足以写出最基本的爬虫了。诸如像Scrapy这样的框架,能够说是集成了爬虫的一切,可是新人可能会用的不怎么顺手,看教程可能还会踩各类各样的坑,并且Scrapy自己体积也有点大。所以,本人决定亲手写一个轻量级的爬虫框架————looter,里面集成了调试和爬虫模板这两个核心功能,利用looter,你就能迅速地写出一个高效的爬虫。另外,本项目的函数文档也至关完整,若是有不明白的地方能够自行阅读源码(通常都是按Ctrl+左键或者F12)。python
$ pip install looter
复制代码
仅支持Python3.6及以上版本。git
让咱们先来撸一个很是简单的图片爬虫:首先,用shell获取网站github
$ looter shell https://konachan.com/post
复制代码
而后用1行代码将图片的url提取出来ajax
>>> imgs = tree.css('a.directlink::attr(href)').extract()
复制代码
或者用另外一种方式提取shell
>>> imgs = links(res, pattern=r'.*/(jpeg|image)/.*')
复制代码
将url保存到本地json
>>> Path('konachan.txt').write_text('\n'.join(imgs))
复制代码
能够经过wget等下载工具将图片下载下来api
$ wget -i konachan.txt
复制代码
若是想要看更多的爬虫例子,猛戳这里bash
若是你想迅速撸出一个爬虫,那么你能够用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(url)
复制代码
获取网页的全部连接
>>> links(res) # 获取全部连接
>>> links(res, search='...') # 查找指定连接
>>> links(res, pattern=r'...') # 正则查找连接
复制代码
将所得结果保存为数据文件,支持按键值排序(sort_by)和去重(no_duplicate)
>>> total = [...]
>>> save(total, sort_by='key', no_duplicate=True)
复制代码
默认保存为json格式,若是想保存为csv只需把文件名后缀改成csv,但必须保证pandas这个包已经安装好。
掌握了以上的套路,再难爬的网站也难不倒你。