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 24 Python
Python调用ctypes使用C函数printf的方法
Aug 23 Python
Python文件操作基本流程代码实例
Dec 11 Python
Python爬虫中urllib库的进阶学习
Jan 05 Python
python 集合 并集、交集 Series list set 转换的实例
May 29 Python
Python+selenium 获取一组元素属性值的实例
Jun 22 Python
python后端接收前端回传的文件方法
Jan 02 Python
PyQt5实现简单数据标注工具
Mar 18 Python
Django组件cookie与session的具体使用
Jun 05 Python
Pandas时间序列基础详解(转换,索引,切片)
Feb 26 Python
Java Spring项目国际化(i18n)详细方法与实例
Mar 20 Python
使用Keras构造简单的CNN网络实例
Jun 29 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 最大运行时间 max_execution_time修改方法
2010/03/08 PHP
PHP 获取文件路径(灵活应用__FILE__)
2013/02/15 PHP
PHP常用数组函数介绍
2014/07/28 PHP
HTA版JSMin(省略修饰语若干)基于javascript语言编写
2009/12/24 Javascript
JavaScript在IE和Firefox浏览器下的7个差异兼容写法小结
2010/06/18 Javascript
jquery 获取 outerHtml 包含当前节点本身的代码
2014/10/30 Javascript
JS解析XML文件和XML字符串详解
2015/04/17 Javascript
js控制div弹出层实现方法
2015/05/11 Javascript
酷炫jQuery全屏3D焦点图动画效果
2016/03/22 Javascript
JS简单实现tab切换效果的多窗口显示功能
2016/09/07 Javascript
JavaScript中校验银行卡号的实现代码
2016/12/19 Javascript
jquery hover 不停闪动问题的解决方法(亦为stop()的使用)
2017/02/10 Javascript
js中作用域的实例解析
2017/03/16 Javascript
JS解决移动web开发手机输入框弹出的问题
2017/03/31 Javascript
Javascript中将变量转换为字符串的三种方法
2017/09/19 Javascript
Vue组件化开发思考
2018/02/02 Javascript
javascript-hashchange事件和历史状态管理实例分析
2020/04/18 Javascript
JavaScript ES6 Class类实现原理详解
2020/05/08 Javascript
[01:39]2014DOTA2国际邀请赛 Newbee经理CU专访队伍火力全开
2014/07/15 DOTA
python简单的函数定义和用法实例
2015/05/07 Python
Python模拟用户登录验证
2017/09/11 Python
Python复制Word内容并使用格式设字体与大小实例代码
2018/01/22 Python
python用post访问restful服务接口的方法
2018/12/07 Python
python 读取Linux服务器上的文件方法
2018/12/27 Python
nohup后台启动Python脚本,log不刷新的解决方法
2019/01/14 Python
Tensorflow中tf.ConfigProto()的用法详解
2020/02/06 Python
Python3基于print打印带颜色字符串
2020/07/06 Python
阿里云:Aliyun.com
2017/02/15 全球购物
Book Depository美国:全球领先的专业网上书店之一
2019/08/14 全球购物
Linux文件操作命令都有哪些
2015/02/27 面试题
大三自我鉴定范文
2013/10/05 职场文书
党员自评材料范文
2014/12/17 职场文书
导游带团欢迎词
2015/09/30 职场文书
教师纪律作风整顿心得体会
2016/01/23 职场文书
浅谈mysql执行过程以及顺序
2021/05/12 MySQL
Jedis操作Redis实现模拟验证码发送功能
2021/09/25 Redis