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实现竖排打印传单手机号码易撕条
Mar 16 Python
Python实现配置文件备份的方法
Jul 30 Python
Python中django学习心得
Dec 06 Python
python numpy数组的索引和切片的操作方法
Oct 20 Python
在Pandas中给多层索引降级的方法
Nov 16 Python
在python中对变量判断是否为None的三种方法总结
Jan 23 Python
pandas读取CSV文件时查看修改各列的数据类型格式
Jul 07 Python
Django  ORM 练习题及答案
Jul 19 Python
tensorflow之并行读入数据详解
Feb 05 Python
python列表切片和嵌套列表取值操作详解
Feb 27 Python
浅谈Python程序的错误:变量未定义
Jun 02 Python
Python生成器generator原理及用法解析
Jul 20 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 数组入门教程小结
2009/05/20 PHP
php set_time_limit(0) 设置程序执行时间的函数
2010/05/26 PHP
memcache命令启动参数中文解释
2014/01/13 PHP
解决form中action属性后面?传递参数 获取不到的问题
2017/07/21 PHP
niceTitle 基于jquery的超链接提示插件
2010/05/31 Javascript
改变状态栏文字的js代码
2014/06/13 Javascript
小结Node.js中非阻塞IO和事件循环
2014/09/18 Javascript
node.js中的fs.mkdir方法使用说明
2014/12/17 Javascript
Jquery 实现图片轮换
2015/01/28 Javascript
jquery实现的省市区三级联动
2015/04/02 Javascript
Javascript常用小技巧汇总
2015/06/24 Javascript
JavaScipt选取文档元素的方法(推荐)
2016/08/05 Javascript
详解node.js搭建代理服务器请求数据
2017/04/08 Javascript
AngularJS实现根据不同条件显示不同控件
2017/04/20 Javascript
利用JavaScript对中文(汉字)进行排序实例详解
2017/06/18 Javascript
基于JavaScript实现淘宝商品广告效果
2017/08/10 Javascript
Vue.js 实现微信公众号菜单编辑器功能(二)
2018/05/08 Javascript
Node.js连接Sql Server 2008及数据层封装详解
2018/08/27 Javascript
CKEditor4配置与开发详细中文说明文档
2018/10/08 Javascript
vue+iview 实现可编辑表格的示例代码
2018/10/31 Javascript
解决node.js含有%百分号时发送get请求时浏览器地址自动编码的问题
2019/11/20 Javascript
vscode中Vue别名路径提示的实现
2020/07/31 Javascript
[07:38]2014DOTA2国际邀请赛 Newbee顺利挺进胜者组赛后专访
2014/07/15 DOTA
python访问类中docstring注释的实现方法
2015/05/04 Python
tensorflow2.0的函数签名与图结构(推荐)
2020/04/28 Python
如何利用python检测图片是否包含二维码
2020/10/15 Python
Python Web项目Cherrypy使用方法镜像
2020/11/05 Python
Python爬虫实战案例之爬取喜马拉雅音频数据详解
2020/12/07 Python
python中str内置函数用法总结
2020/12/27 Python
大学同学聚会邀请函
2014/01/29 职场文书
2015年学校体育工作总结
2015/04/22 职场文书
企业法律事务工作总结
2015/08/11 职场文书
领导干部学习心得体会
2016/01/23 职场文书
写作技巧:如何撰写商业计划书
2019/08/08 职场文书
z-index不起作用
2021/03/31 HTML / CSS
关于maven依赖 ${xxx.version}报错问题
2022/01/18 Java/Android