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 相关文章推荐
python中如何使用朴素贝叶斯算法
Apr 06 Python
python进阶_浅谈面向对象进阶
Aug 17 Python
python中logging库的使用总结
Oct 18 Python
Python+matplotlib实现华丽的文本框演示代码
Jan 22 Python
python通过Windows下远程控制Linux系统
Jun 20 Python
Python图像的增强处理操作示例【基于ImageEnhance类】
Jan 03 Python
python里运用私有属性和方法总结
Jul 08 Python
关于PyTorch源码解读之torchvision.models
Aug 17 Python
Python内置方法实现字符串的秘钥加解密(推荐)
Dec 09 Python
python cv2截取不规则区域图片实例
Dec 21 Python
tensorflow的计算图总结
Jan 12 Python
使用 Python 读取电子表格中的数据实例详解
Apr 17 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
PHP错误抑制符(@)导致引用传参失败Bug的分析
2011/05/02 PHP
php 短链接算法收集与分析
2011/12/30 PHP
php按百分比生成缩略图的代码分享
2014/05/10 PHP
PHP 快速排序算法详解
2014/11/10 PHP
php array 转json及java 转换 json数据格式操作示例
2019/11/13 PHP
动态加载iframe
2006/06/16 Javascript
浅谈jQuery中replace()方法
2015/05/13 Javascript
使用Raygun对Node.js应用进行错误处理的方法
2015/06/23 Javascript
javascript实现多栏闭合展开式广告位菜单效果实例
2015/08/05 Javascript
深入浅析同源策略和跨域访问
2015/11/26 Javascript
JavaScript中闭包之浅析解读(必看篇)
2016/08/25 Javascript
javascript学习笔记_浅谈基础语法,类型,变量
2016/09/19 Javascript
JavaScript 最佳实践:帮你提升代码质量
2016/12/03 Javascript
清除浏览器缓存的几种方法总结(必看)
2016/12/09 Javascript
webpack 4.0.0-beta.0版本新特性介绍
2018/02/10 Javascript
axios 封装上传文件的请求方法
2018/09/26 Javascript
jquery使用FormData实现异步上传文件
2018/10/25 jQuery
layui 实现表单和文件上传一起传到后台的例子
2019/09/16 Javascript
Python序列化基础知识(json/pickle)
2017/10/19 Python
Flask数据库迁移简单介绍
2017/10/24 Python
使用Python处理Excel表格的简单方法
2018/06/07 Python
详解python-图像处理(映射变换)
2019/03/22 Python
tensor和numpy的互相转换的实现示例
2019/08/02 Python
python快速排序的实现及运行时间比较
2019/11/22 Python
Python利用matplotlib绘制散点图的新手教程
2020/11/05 Python
魔声耳机官方网站:Monster是世界第一品牌的高性能耳机
2016/10/26 全球购物
美国女士内衣在线折扣商店:One Hanes Place
2019/03/24 全球购物
一加手机美国官方网站:OnePlus美国
2019/09/19 全球购物
本科生的职业生涯规划范文
2014/01/09 职场文书
集中整治工作方案
2014/05/01 职场文书
销售提升方案
2014/06/07 职场文书
精神文明建设标语
2014/06/16 职场文书
授权委托书格式
2014/07/31 职场文书
政府个人对照检查材料
2014/08/28 职场文书
python 安全地删除列表元素的方法
2022/03/16 Python
【TED出品】天梯非主流开心游1700 划水骑士
2022/03/31 魔兽争霸