python爬虫框架talonspider简单介绍


Posted in Python onJune 09, 2017

1.为什么写这个?

一些简单的页面,无需用比较大的框架来进行爬取,自己纯手写又比较麻烦

因此针对这个需求写了talonspider:

•1.针对单页面的item提取 - 具体介绍点这里
•2.spider模块 - 具体介绍点这里

2.介绍&&使用

2.1.item

这个模块是可以独立使用的,对于一些请求比较简单的网站(比如只需要get请求),单单只用这个模块就可以快速地编写出你想要的爬虫,比如(以下使用python3,python2见examples目录):

2.1.1.单页面单目标

比如要获取这个网址http://book.qidian.com/info/1004608738 的书籍信息,封面等信息,可直接这样写:

import time
from talonspider import Item, TextField, AttrField
from pprint import pprint

class TestSpider(Item):
  title = TextField(css_select='.book-info>h1>em')
  author = TextField(css_select='a.writer')
  cover = AttrField(css_select='a#bookImg>img', attr='src')

  def tal_title(self, title):
    return title

  def tal_cover(self, cover):
    return 'http:' + cover

if __name__ == '__main__':
  item_data = TestSpider.get_item(url='http://book.qidian.com/info/1004608738')
  pprint(item_data)

具体见qidian_details_by_item.py

2.1.1.单页面多目标

比如获取豆瓣250电影首页展示的25部电影,这一个页面有25个目标,可直接这样写:

from talonspider import Item, TextField, AttrField
from pprint import pprint

# 定义继承自item的爬虫类
class DoubanSpider(Item):
  target_item = TextField(css_select='div.item')
  title = TextField(css_select='span.title')
  cover = AttrField(css_select='div.pic>a>img', attr='src')
  abstract = TextField(css_select='span.inq')

  def tal_title(self, title):
    if isinstance(title, str):
      return title
    else:
      return ''.join([i.text.strip().replace('\xa0', '') for i in title])

if __name__ == '__main__':
  items_data = DoubanSpider.get_items(url='https://movie.douban.com/top250')
  result = []
  for item in items_data:
    result.append({
      'title': item.title,
      'cover': item.cover,
      'abstract': item.abstract,
    })
  pprint(result)

具体见douban_page_by_item.py

2.2.spider

当需要爬取有层次的页面时,比如爬取豆瓣250全部电影,这时候spider部分就派上了用场:

# !/usr/bin/env python
from talonspider import Spider, Item, TextField, AttrField, Request
from talonspider.utils import get_random_user_agent


# 定义继承自item的爬虫类
class DoubanItem(Item):
  target_item = TextField(css_select='div.item')
  title = TextField(css_select='span.title')
  cover = AttrField(css_select='div.pic>a>img', attr='src')
  abstract = TextField(css_select='span.inq')

  def tal_title(self, title):
    if isinstance(title, str):
      return title
    else:
      return ''.join([i.text.strip().replace('\xa0', '') for i in title])


class DoubanSpider(Spider):
  # 定义起始url,必须
  start_urls = ['https://movie.douban.com/top250']
  # requests配置
  request_config = {
    'RETRIES': 3,
    'DELAY': 0,
    'TIMEOUT': 20
  }
  # 解析函数 必须有
  def parse(self, html):
    # 将html转化为etree
    etree = self.e_html(html)
    # 提取目标值生成新的url
    pages = [i.get('href') for i in etree.cssselect('.paginator>a')]
    pages.insert(0, '?start=0&filter=')
    headers = {
      "User-Agent": get_random_user_agent()
    }
    for page in pages:
      url = self.start_urls[0] + page
      yield Request(url, request_config=self.request_config, headers=headers, callback=self.parse_item)

  def parse_item(self, html):
    items_data = DoubanItem.get_items(html=html)
    # result = []
    for item in items_data:
      # result.append({
      #   'title': item.title,
      #   'cover': item.cover,
      #   'abstract': item.abstract,
      # })
      # 保存
      with open('douban250.txt', 'a+') as f:
        f.writelines(item.title + '\n')


if __name__ == '__main__':
  DoubanSpider.start()

控制台:

/Users/howie/anaconda3/envs/work3/bin/python /Users/howie/Documents/programming/python/git/talonspider/examples/douban_page_by_spider.py
2017-06-07 23:17:30,346 - talonspider - INFO: talonspider started
2017-06-07 23:17:30,693 - talonspider_requests - INFO: GET a url: https://movie.douban.com/top250
2017-06-07 23:17:31,074 - talonspider_requests - INFO: GET a url: https://movie.douban.com/top250?start=25&filter=
2017-06-07 23:17:31,416 - talonspider_requests - INFO: GET a url: https://movie.douban.com/top250?start=50&filter=
2017-06-07 23:17:31,853 - talonspider_requests - INFO: GET a url: https://movie.douban.com/top250?start=75&filter=
2017-06-07 23:17:32,523 - talonspider_requests - INFO: GET a url: https://movie.douban.com/top250?start=100&filter=
2017-06-07 23:17:33,032 - talonspider_requests - INFO: GET a url: https://movie.douban.com/top250?start=125&filter=
2017-06-07 23:17:33,537 - talonspider_requests - INFO: GET a url: https://movie.douban.com/top250?start=150&filter=
2017-06-07 23:17:33,990 - talonspider_requests - INFO: GET a url: https://movie.douban.com/top250?start=175&filter=
2017-06-07 23:17:34,406 - talonspider_requests - INFO: GET a url: https://movie.douban.com/top250?start=200&filter=
2017-06-07 23:17:34,787 - talonspider_requests - INFO: GET a url: https://movie.douban.com/top250?start=225&filter=
2017-06-07 23:17:34,809 - talonspider - INFO: Time usage:0:00:04.462108

Process finished with exit code 0

此时当前目录会生成douban250.txt,具体见douban_page_by_spider.py。

3.说明

学习之作,待完善的地方还有很多,欢迎提意见,项目地址talonspider。

Python 相关文章推荐
pycharm 使用心得(三)Hello world!
Jun 05 Python
Python中zip()函数用法实例教程
Jul 31 Python
Windows下使Python2.x版本的解释器与3.x共存的方法
Oct 25 Python
Python的Flask框架应用程序实现使用QQ账号登录的方法
Jun 07 Python
Python中operator模块的操作符使用示例总结
Jun 28 Python
解决PyCharm同目录下导入模块会报错的问题
Oct 13 Python
对python tkinter窗口弹出置顶的方法详解
Jun 14 Python
Python Numpy 实现交换两行和两列的方法
Jun 26 Python
Python Pickle 实现在同一个文件中序列化多个对象
Dec 30 Python
Python安装并操作redis实现流程详解
Oct 13 Python
python爬虫快速响应服务器的做法
Nov 24 Python
Python绘制散点图之可视化神器pyecharts
Jul 07 Python
python实现list元素按关键字相加减的方法示例
Jun 09 #Python
Python利用QQ邮箱发送邮件的实现方法(分享)
Jun 09 #Python
老生常谈python的私有公有属性(必看篇)
Jun 09 #Python
Python 自动化表单提交实例代码
Jun 08 #Python
Python错误: SyntaxError: Non-ASCII character解决办法
Jun 08 #Python
Python实现网站注册验证码生成类
Jun 08 #Python
Python实现多线程抓取网页功能实例详解
Jun 08 #Python
You might like
老照片 - 几十年前的收音机与人
2021/03/02 无线电
header中Content-Disposition的作用与使用方法
2012/06/13 PHP
PHP 使用pcntl和libevent 实现Timer功能
2013/10/27 PHP
php实现使用正则将文本中的网址转换成链接标签
2014/12/03 PHP
php实现无限级分类(递归方法)
2015/08/06 PHP
46 个非常有用的 PHP 代码片段
2016/02/16 PHP
JavaScript 动态创建VML的方法
2009/10/14 Javascript
javascript innerHTML使用分析
2010/12/03 Javascript
js页面跳转的常用方法整理
2013/10/18 Javascript
离开当前页面前使用js判断条件提示是否要离开页面
2014/05/02 Javascript
5款JavaScript代码压缩工具推荐
2014/07/07 Javascript
jquery实现的鼠标下拉滚动置顶效果
2014/07/24 Javascript
AngularJs expression详解及简单示例
2016/09/01 Javascript
AngularJS表单和输入验证实例
2016/11/02 Javascript
获取jqGrid中选择的行的数据
2016/11/30 Javascript
jQuery控制控件文本的长度的操作方法
2016/12/05 Javascript
jQuery图片轮播功能实例代码
2017/01/29 Javascript
vue项目打包部署_nginx代理访问方法详解
2018/09/20 Javascript
轻量级富文本编辑器wangEditor结合vue使用方法示例
2018/10/10 Javascript
JavaScript链式调用实例浅析
2018/12/19 Javascript
JavaScript设计模式之命令模式实例分析
2019/01/16 Javascript
浅谈VUE防抖与节流的最佳解决方案(函数式组件)
2019/05/22 Javascript
微信小程序实现文件、图片上传功能
2020/08/18 Javascript
Python学习笔记之常用函数及说明
2014/05/23 Python
Python使用面向对象方式创建线程实现12306售票系统
2015/12/24 Python
Pycharm技巧之代码跳转该如何回退
2017/07/16 Python
Python实现输出某区间范围内全部素数的方法
2018/05/02 Python
python自定义线程池控制线程数量的示例
2019/02/22 Python
解决Python正则表达式匹配反斜杠''\''问题
2019/07/17 Python
HTML5 Canvas旋转动画的2个代码例子(一个旋转的太极图效果)
2014/04/10 HTML / CSS
Puritan’s Pride(普丽普莱)官方网站:美国最大最全的保健品公司之一
2016/10/23 全球购物
大学生求职简历的自我评价
2013/10/21 职场文书
会计主管岗位职责范文
2013/11/08 职场文书
土木工程专业推荐信
2014/02/19 职场文书
市政工程技术专业自荐书
2014/07/06 职场文书
HAM-2000摩机图
2021/04/22 无线电