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调用java的Webservice示例
Mar 10 Python
python更改已存在excel文件的方法
May 03 Python
基于Python实现定时自动给微信好友发送天气预报
Oct 25 Python
python实现对任意大小图片均匀切割的示例
Dec 05 Python
Python替换月份为英文缩写的实现方法
Jul 15 Python
python中的数组赋值与拷贝的区别详解
Nov 26 Python
tensorflow模型保存、加载之变量重命名实例
Jan 21 Python
浅谈Python中的异常和JSON读写数据的实现
Feb 27 Python
解决jupyter notebook显示不全出现框框或者乱码问题
Apr 09 Python
Python OpenCV去除字母后面的杂线操作
Jul 05 Python
Selenium python时间控件输入问题解决方案
Jul 22 Python
用Python远程登陆服务器的步骤
Apr 16 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 UTF8中文字符截断函数代码
2012/09/11 PHP
php5.3 goto函数介绍和示例
2014/03/21 PHP
PHP中使用json数据格式定义字面量对象的方法
2014/08/20 PHP
PHP实现获取客户端IP并获取IP信息
2015/03/17 PHP
详解PHP匿名函数与注意事项
2016/03/29 PHP
PHP session会话操作技巧小结
2016/09/27 PHP
php实现微信企业号支付个人的方法详解
2017/07/26 PHP
jquery动画4.升级版遮罩效果的图片走廊--带自动运行效果
2012/08/24 Javascript
javascript编码的几个方法详细介绍
2013/01/06 Javascript
jQuery插件windowScroll实现单屏滚动特效
2015/07/14 Javascript
javascript实现2016新年版日历
2016/01/25 Javascript
jQuery实现表格与ckeckbox的全选与单选功能
2016/11/24 Javascript
微信小程序实战之自定义抽屉菜单(7)
2017/04/18 Javascript
jQuery动态添加.active 实现导航效果代码思路详解
2017/08/29 jQuery
详解vue.js根据不同环境(正式、测试)打包到不同目录
2018/07/13 Javascript
在vue项目中引入高德地图及其UI组件的方法
2018/09/04 Javascript
jQuery超简单遮罩层实现方法示例
2018/09/06 jQuery
微信小程序中的店铺评分组件及vue中用svg实现的评分显示组件
2018/11/16 Javascript
解决Layui数据表格的宽高问题
2019/09/28 Javascript
微信小程序实现选择地址省市区三级联动
2020/06/21 Javascript
Vue常用API、高级API的相关总结
2021/02/02 Vue.js
收集的几个Python小技巧分享
2014/11/22 Python
Python编程中用close()方法关闭文件的教程
2015/05/24 Python
浅谈用VSCode写python的正确姿势
2017/12/16 Python
python3利用Dlib19.7实现人脸68个特征点标定
2018/02/26 Python
python3.4控制用户输入与输出的方法
2018/10/17 Python
对django 模型 unique together的示例讲解
2019/08/06 Python
使用OpenCV实现仿射变换—缩放功能
2019/08/29 Python
python要安装在哪个盘
2020/06/15 Python
python定义具名元组实例操作
2021/02/28 Python
委托证明的格式
2014/01/10 职场文书
培训协议书范本
2014/04/22 职场文书
故意杀人案辩护词
2015/05/21 职场文书
学校少先队工作总结
2015/08/12 职场文书
不知如何爱孩子,这些方法教会您
2019/08/06 职场文书
深入理解mysql事务隔离级别和存储引擎
2022/04/12 MySQL