专栏首页Python中文社区超轻量级爬虫框架:looter

超轻量级爬虫框架:looter

作者:半载流殇,Pythonistia && Otaku,努力转行中的一位测绘人员です

主页:zhihu.com/people/ban-zai-liu-shang

爬虫总共就三大步骤:发起请求——解析数据——存储数据,这样就足以写出最基本的爬虫了。诸如像Scrapy这样的框架,可以说是集成了爬虫的一切,但是新人可能会用的不怎么顺手,看教程可能还会踩各种各样的坑,而且Scrapy本身体积也有点大。因此,本人决定亲手写一个轻量级的爬虫框架——looter,里面集成了调试和爬虫模板这两个核心功能,利用looter,你就能迅速地写出一个高效的爬虫。另外,本项目的函数文档也相当完整,如果有不明白的地方可以自行阅读源码。

安装

$ pip install looter

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

快速开始

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

$ looter shell konachan.com/post

然后用2行代码就可以将图片抓取到本地

>>> imgs = tree.cssselect('a.directlink')
>>> save_imgs(imgs)

或者只用1行也行:d

>>> save_imgs(links(res, search='jpg'))

工作流

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

$ looter genspider <name> <tmpl> [--async]

在这行代码中,tmpl是模板,分为data和image两种模板。

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

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

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

以http://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.cssselect('ul li')
    for item in items:
        data = dict()
        # data[...] = item.cssselect(...)
        pprint(data)

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

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

但是,在你写完这个爬虫之前,最好用looter提供的shell来调试一下你的cssselect代码是否正确。

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

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

当然,本人也编写了好几个爬虫例子,可供参考。

函数

looter为用户提供了很多实用的函数。

view

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

>>> view(url)

save_imgs

当你获取了一堆图片链接时,用它可以直接将它们保存到本地

>>> img_urls = [...]
>>> save_imgs(img_urls)

alexa_rank

可以获取网站的reach和popularity指数(人气度),此函数返回一个元组(url, reachrank, popularityrank)

>>> alexa_rank(url)

links

获取网页的所有链接

>>> links(res)                  # 获取所有链接
>>> links(res, absolute=True)   # 获取绝对链接
>>> links(res, search='text')   # 查找指定链接

同样地,你也可以用正则表达式来获取匹配的链接

>>> re_links(res, r'regex_pattern')

saveasjson

将所得结果保存为json文件,支持按键值排序

>>> total = [...]
>>> save_as_json(total, name='text', sort_by='key')

parse_robots

用于爬取网站robots.txt上的所有链接。这个在做全站爬虫或者递归式url爬虫时颇为有效

>>> parse_robots(url)

login

有一些网站必须要先登录才能爬取,于是就有了login函数,本质其实就是建立session会话向服务器发送带有data的POST请求。 但是,每个网站的登录规则都各不相同,想要找到合适的postdata还是要费一番功夫的,而且更有甚者还要你构造param或header参数。 不过幸运的是在github上已经有人整理好了各大网站的模拟登录方法——fuck-login,本人很是佩服。 总之考验各位抓包的能力了,以下为模拟登录网易126邮箱(要求参数:postdata和param)

>>> params = {'df': 'mail126_letter', 'from': 'web', 'funcid': 'loginone', 'iframe': '1', 'language': '-1', 'passtype': '1', 'product': 'mail126',
 'verifycookie': '-1', 'net': 'failed', 'style': '-1', 'race': '-2_-2_-2_db', 'uid': 'webscraping123@126.com', 'hid': '10010102'}
>>> postdata = {'username': 你的用户名, 'savelogin': '1', 'url2': 'http://mail.126.com/errorpage/error126.htm', 'password': 你的密码}
>>> url = "https://mail.126.com/entry/cgi/ntesdoor?"
>>> res, ses = login(url, postdata, params=params) # res为post请求后的页面,ses为请求会话
>>> index_url = re.findall(r'href = "(.*?)"', res.text)[0] # 在res中获取重定向主页的链接
>>> index = ses.get(index_url) # 用ses会话访问重定向链接,想确认成功的话print下即可

Python网络爬虫学习系列课程共9节,提供课件和所有小节课程源代码。课程由《从零开始学Python网络爬虫》图书作者、简书知名博主、Python网络爬虫专家罗攀负责主讲。

第1讲:Python零基础语法入门

  1. 环境安装
  2. 变量与字符串
  3. 流程控制
  4. 数据结构
  5. 文件操作

第2讲:正则表达式爬虫

  1. 网络连接
  2. 爬虫原理
  3. Chrome浏览器安装和使用
  4. Request库使用
  5. 正则表达式
  6. csv文件存储

第3讲:Lxml库与xpath语法

  1. Excel存储
  2. lxml库
  3. Xpath语法

第4讲:API爬虫

  1. API概念
  2. 百度地图API调用
  3. JSON数据解析
  4. 图片爬虫

第5讲:异步加载

  1. MySQL数据库安装
  2. MySQL数据库简单使用
  3. Python操作数据库
  4. 异步加载
  5. 逆向工程
  6. 综合案例

第6讲:表单交互与模拟登陆

  1. post请求
  2. 逆向工程
  3. 提交cookie
  4. 综合案例

第7讲:Selenium模拟浏览器

  1. Selenium
  2. PhantomJS
  3. 异步加载处理
  4. 网页操作处理
  5. 综合案例

第8讲:Scrapy入门

  1. Scrapy安装
  2. 创建项目
  3. 各组件介绍
  4. 综合案例

第9讲:Scrapy精进

  1. 跨页面爬虫
  2. 存储数据库

本文分享自微信公众号 - Python中文社区(python-china)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-08-02

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 不踩坑的Python爬虫:如何在一个月内学会爬取大规模数据

    Python爬虫为什么受欢迎 如果你仔细观察,就不难发现,懂爬虫、学习爬虫的人越来越多,一方面,互联网可以获取的数据越来越多,另一方面,像 Python这样的...

    Python中文社区
  • 反爬虫机制和破解方法汇总

    什么是爬虫和反爬虫? 爬虫:使用任何技术手段,批量获取网站信息的一种方式。 反爬虫:使用任何技术手段,阻止别人批量获取自己网站信息的一种方式。 ? 常见的反...

    Python中文社区
  • 我是如何零基础开始能写爬虫的

    利用这些数据,可以做很多领域的分析、市场调研,获得很多有价值的信息,可以应用在很多的工作场景,于是果断开始学习。

    Python中文社区
  • 如果你不知道做什么,那就学一门杂学吧

    多年以后,面对人工智能研究员那混乱不堪的代码,我会想起第一次和S君相见的那个遥远的下午。那时的B公司,还是一个仅有6个人的小团队,Mac和显示器在桌上依次排开,...

    青南
  • 网络爬虫的风险

    随着互联网的发展,网络爬虫也越来越多,爬虫本身是一种网络技术,所以爬虫不是违法的技术。如果使用爬虫技术去做违法项目,例如:色情,赌博等违法业务,一旦发现就会触碰...

    用户6172015
  • python 认识爬虫与反爬虫

    参考资料:Python爬虫,你是否真的了解它?: https://www.bilibili.com/read/cv4144658

    forxtz
  • Python 网络爬虫概述

    几乎每个网站都有一个名为robots.txt的文档,当然也有有些网站没有设定。对于没有设定robots.txt的网站可以通过网络爬虫获取没有口令加密的数据,也就...

    Python知识大全
  • Python 爬虫学习一

    简单来说网络爬虫就是自动索引互联网上信息的一段程序,看起来像是一个搜索引擎「实际上网络爬虫就是搜索引擎的重要组成部分」,对于我们不做搜索引擎的人来说又为什么来学...

    keinYe
  • 如何高效学习Python爬虫技术?

      学Python网络爬虫时先了解Python基本常识,变量、字符串、列表、字典、元组、操控句子、语法等,把基础打牢,在做案例时能知道运用的是哪些知识点。此外还...

    python学习教程
  • 爬虫课程(一)|课程介绍和安排

    黄小怪

扫码关注云+社区

领取腾讯云代金券