超轻量级爬虫框架:looter

优采云 发布时间: 2022-06-14 14:45

  超轻量级爬虫框架:looter

  ♚

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

  主页:/people/ban-zai-liu-shang

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

  安装

  <p>$ pip install looter</p>

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

  快速开始

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

  <p>$ looter shell konachan.com/post</p>

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

  <p>>>> imgs = tree.cssselect('a.directlink')

  >>> save_imgs(imgs)</p>

  或者只用1行也行:d

  <p>>>> save_imgs(links(res, search='jpg'))</p>

  工作流

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

  <p>$ looter genspider [--async]</p>

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

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

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

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

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

  <p>domain = 'https://konachan.com'

  tasklist = [f'{domain}/post?page={i}' for i in range(1, 9777)]</p>

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

  <p>def crawl(url):

      tree = lt.fetch(url)

      items = tree.cssselect('ul li')

      for item in items:

          data = dict()

          # data[...] = item.cssselect(...)

          pprint(data)</p>

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

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

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

  <p>>>> items = tree.cssselect('ul li')

  >>> item = items[0]

  >>> item.cssselect(anything you want to crawl)

  # 注意代码的输出是否正确!</p>

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

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

  函数

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

  view

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

  <p>>>> view(url)</p>

  save_imgs

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

  <p>>>> img_urls = [...]

  >>> save_imgs(img_urls)</p>

  alexa_rank

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

  <p>>>> alexa_rank(url)</p>

  links

  获取网页的所有链接

  <p>>>> links(res)                  # 获取所有链接

  >>> links(res, absolute=True)   # 获取绝对链接

  >>> links(res, search='text')   # 查找指定链接</p>

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

  <p>>>> re_links(res, r'regex_pattern')</p>

  saveasjson

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

  <p>>>> total = [...]

  >>> save_as_json(total, name='text', sort_by='key')</p>

  parse_robots

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

  <p>>>> parse_robots(url)</p>

  login

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

  <p>>>> 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下即可</p>

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

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

  环境安装

  变量与字符串

  流程控制

  数据结构

  文件操作

  第2讲:正则表达式爬虫

  网络连接

  爬虫原理

  Chrome浏览器安装和使用

  Request库使用

  正则表达式

  csv文件存储

  第3讲:Lxml库与xpath语法

  Excel存储

  lxml库

  Xpath语法

  第4讲:API爬虫

  API概念

  百度地图API调用

  JSON数据解析

  图片爬虫

  第5讲:异步加载

  MySQL数据库安装

  MySQL数据库简单使用

  Python操作数据库

  异步加载

  逆向工程

  综合案例

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

  post请求

  逆向工程

  提交cookie

  综合案例

  第7讲:Selenium模拟浏览器

  Selenium

  PhantomJS

  异步加载处理

  网页操作处理

  综合案例

  第8讲:Scrapy入门

  Scrapy安装

  创建项目

  各组件介绍

  综合案例

  第9讲:Scrapy精进

  跨页面爬虫

  存储数据库

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线