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 相关文章推荐
pygame播放音乐的方法
May 19 Python
简单谈谈Python中函数的可变参数
Sep 02 Python
Python标准库06之子进程 (subprocess包) 详解
Dec 07 Python
Python简单操作sqlite3的方法示例
Mar 22 Python
Python操作csv文件实例详解
Jul 31 Python
Python中的TCP socket写法示例
May 11 Python
pycharm 解除默认unittest模式的方法
Nov 30 Python
Win下PyInstaller 安装和使用教程
Dec 25 Python
利用django model save方法对未更改的字段依然进行了保存
Mar 28 Python
使用matlab 判断两个矩阵是否相等的实例
May 11 Python
Python Mock模块原理及使用方法详解
Jul 07 Python
Python使用OpenCV实现虚拟缩放效果
Feb 28 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
实现“上一页”和“下一页按钮
2006/10/09 PHP
PHP写杨辉三角实例代码
2011/07/17 PHP
discuz目录文件资料汇总
2014/12/30 PHP
PHP设计模式之观察者模式实例
2016/02/22 PHP
PHPCrawl爬虫库实现抓取酷狗歌单的方法示例
2017/12/21 PHP
ThinkPHP框架实现导出excel数据的方法示例【基于PHPExcel】
2018/05/12 PHP
javascript 获取所有id中包含某关键字的控件的实现代码
2010/11/25 Javascript
javascript完美拖拽的实现方法
2013/09/29 Javascript
Javascript实现简单的富文本编辑器附演示
2014/06/16 Javascript
Javascript通过overflow控制列表闭合与展开的方法
2015/05/15 Javascript
javascript 闭包详解
2015/07/02 Javascript
js简单判断flash是否加载完成的方法
2016/06/21 Javascript
js实现3D图片展示效果
2017/03/09 Javascript
浅析Angular2子模块以及异步加载
2017/04/24 Javascript
NodeJS使用七牛云存储上传文件的方法
2017/07/24 NodeJs
JavaScript中 ES6变量的结构赋值
2018/07/10 Javascript
video.js 实现视频只能后退不能快进的思路详解
2018/08/09 Javascript
JS实现简易留言板特效
2019/12/23 Javascript
Python基本数据类型详细介绍
2014/03/11 Python
Python fileinput模块使用实例
2015/06/03 Python
python 3利用BeautifulSoup抓取div标签的方法示例
2017/05/28 Python
Python3读取Excel数据存入MySQL的方法
2018/05/04 Python
正则给header的冒号两边参数添加单引号(Python请求用)
2019/08/09 Python
Python cookie的保存与读取、SSL讲解
2020/02/17 Python
pyinstaller打包找不到文件的问题解决
2020/04/15 Python
python代码实现将列表中重复元素之间的内容全部滤除
2020/05/22 Python
对Python 字典元素进行删除的方法
2020/07/31 Python
Python 调用 ES、Solr、Phoenix的示例代码
2020/11/23 Python
CSS3字体效果的设置方法小结
2016/06/13 HTML / CSS
澳大利亚家具商店:Freedom
2020/12/17 全球购物
公司培训欢迎词
2014/01/10 职场文书
单位消防安全制度
2014/01/12 职场文书
社区创先争优承诺书
2014/08/30 职场文书
机票销售员态度不好检讨书
2014/09/27 职场文书
mysql 数据插入优化方法之concurrent_insert
2021/07/01 MySQL
JavaScript原型链详解
2021/11/07 Javascript