爬虫 | 继Helloworld程序 『scrapy & redis』

前言 天黑之后就在图书馆玩一个爬虫,就是那个开源的爬虫 -- scrapy!早几天就搭建了一个Redis集群服务器,于是就将爬取的数据存储于Redis数据库。 Redis数据库集群搭建 | 实践篇


Scrapy Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。 可以应用在包括数据挖掘,信息处理或存储历史数。Scrapy 使用 Twisted这个异步网络库来处理网络通讯,架构清晰,并且包含了各种中间件接口,可以灵活的完成各种需求。


目的 目标是学校图书馆的热榜书籍,内网首选[ 省流量O(∩_∩)O哈哈~ ]。 将热榜书籍的相关数据存储到Reids数据库即可,很简单的一个实验 PS

# 安装python-redis
sudo pip install python-redis

一切就绪前提已经掌握helloworld

  • 关闭ROBOTSTXT_OBEY 编辑settings.py,不然有些URL拒绝访问。
# Obey robots.txt rules
ROBOTSTXT_OBEY = False
  • 定义Item 编辑items.py,该文件就是用于定义对象的。此时我们定义书籍的对象。
class BookItem(scrapy.Item):
    bid = scrapy.Field()  # 序号
    name = scrapy.Field()  # 书名
    author = scrapy.Field()  # 作者
    kid = scrapy.Field()  # 索引号
    isbn = scrapy.Field()  # isbn
    public_location = scrapy.Field()  # 出版社
    public = scrapy.Field()  # 出版地
    clicked = scrapy.Field()  # 浏览次数
    type = scrapy.Field()  # 书籍类型
  • 编辑爬虫Spider程序 在spiders文件夹新建一个BookSpider.py文件,用户爬取数据逻辑的文件,获取书籍的信息并存储到Redis,核心程序! 内容如下:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import scrapy
import redis

from demo01.items import BookItem


class BookSpider(scrapy.Spider):
    # Spider的名字 | 唯一的
    name = "books"
    # 允许爬取的域名
    # allowed_domains = ["samego.com"]
    # 爬取的域名
    start_urls = [
        "http://172.16.4.188:8081/opac/index_hotll.jsp/"
    ]

    # 开始执行任务 | parse属于Spider的一个方法
    def parse(self, response):
        # 定义redis线程池
        pool = redis.ConnectionPool(host='172.16.168.1', port=6379)
        presenter = redis.Redis(connection_pool=pool)

        # 有关书籍的表格
        book_table = response.xpath('//table[@class="bordermain"][1]')

        # 获取每一本书的集合tr
        book_elements = book_table.xpath(".//tr")
        # 删除第一行的tr
        del book_elements[0]

        # 遍历处理数据
        for book_tr in book_elements:
            # 定义书籍对象
            book_item = BookItem()

            # 获取各本书籍的信息
            book = book_tr.xpath(".//td")
            book_item["bid"] = book[1].xpath("./text()").extract()
            book_item["name"] = book[2].xpath("./text()").extract()
            book_item["author"] = book[3].xpath("./text()").extract()
            book_item["kid"] = book[4].xpath("./text()").extract()
            book_item["isbn"] = book[5].xpath("./text()").extract()
            book_item["public_location"] = book[6].xpath("./text()").extract()
            book_item["public"] = book[7].xpath("./text()").extract()
            book_item["clicked"] = book[9].xpath("./text()").extract()
            book_item["type"] = book[10].xpath("./text()").extract()

            # 设置有序集合键值
            z_key = '%s_%s' % ('book', book_item["bid"][0])
            # 将数据保存redis
            presenter.zadd(z_key, book_item["name"], 1)
            presenter.zadd(z_key, book_item["author"], 2)
            presenter.zadd(z_key, book_item["name"], 3)
            presenter.zadd(z_key, book_item["kid"], 4)
            presenter.zadd(z_key, book_item["isbn"], 5)
            presenter.zadd(z_key, book_item["public_location"], 6)
            presenter.zadd(z_key, book_item["public"], 7)
            presenter.zadd(z_key, book_item["clicked"], 8)
            presenter.zadd(z_key, book_item["type"], 9)

            yield book_item
  • 执行scrapy的程序
➜  ~ scrapy crawl books

# or 将数据以json的形式保存在books.json
➜  ~ scrapy crawl books -o books.json
  • 终端运行 部分返回如下
➜  demo01 scrapy crawl books
2017-04-19 21:45:45 [scrapy.utils.log] INFO: Scrapy 1.3.3 started (bot: demo01)
... ...
2017-04-19 21:45:46 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://172.16.4.188:8081/opac/index_hotll.jsp/> (referer: None)
2017-04-19 21:45:47 [scrapy.core.scraper] DEBUG: Scraped from <200 http://172.16.4.188:8081/opac/index_hotll.jsp/>
{'author': ['杨萃先 ... [等]著\xa0'],
 'bid': ['1'],
 'clicked': ['14987\xa0'],
 'isbn': ['978-7-80080-752-7\xa0'],
 'kid': ['C913.2/258\xa0'],
 'name': ['\xa0'],
 'public': ['群言出版社\xa0'],
 'public_location': ['北京\xa0'],
 'type': ['中文图书\xa0']}
2017-04-19 21:45:47 [scrapy.core.scraper] DEBUG: Scraped from <200 http://172.16.4.188:8081/opac/index_hotll.jsp/>
{'author': ['(英)霭理士(Havelock Ellis)著\xa0'],
 'bid': ['2'],
 'clicked': ['1219\xa0'],
 'isbn': ['7-108-00161-6\xa0'],
 'kid': ['R167/20\xa0'],
 'name': ['\xa0'],
 'public': ['三联书店\xa0'],
 'public_location': ['北京\xa0'],
 'type': ['中文图书\xa0']}
... ...

注意:还有一点问题,存在unicode编码的字符,编码处理不难,可是图书馆又准备关门了。得跑路啦O(∩_∩)O哈哈~


本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏崔庆才的专栏

利用Scrapy爬取所有知乎用户详细信息并存至MongoDB

本节分享一下爬取知乎用户所有用户信息的Scrapy爬虫实战。本节目标本节要实现的内容有:从一个大V用户开始,通过递归抓取粉丝列表和关注列表,实现知乎所有用户的详...

1.8K1
来自专栏移动开发之家

Android全面插件化RePlugin流程与源码解析

RePlugin,360开源的全面插件化框架,按照官网说的,其目的是“尽可能多的让模块变成插件”,并在很稳定的前提下,尽可能像开发普通App那样灵活。那么下面就...

1161
来自专栏数据结构笔记

scrapy爬虫框架(二):创建一个scrapy爬虫

在创建新的scrapy爬虫之前,我们需要先了解一下创建一个scrapy爬虫的基本步骤

1222
来自专栏大数据杂谈

12行Python暴力爬《黑豹》豆瓣短评

草长莺飞,转眼间又到了三月“爬虫月”。 这时往往不少童鞋写论文苦于数据获取艰难,辗转走上爬虫之路; 许多分析师做舆情监控或者竞品分析的时候,也常常使用到爬虫。

1866
来自专栏xdecode

Java高并发之锁优化

1324
来自专栏IMWeb前端团队

在NodeJS中玩转Protocol Buffer

本文作者:IMWeb link 原文出处:IMWeb社区 未经同意,禁止转载 这篇文章的代码都是基于Protobuf.js 4.x的API写的,已经...

5048
来自专栏我和PYTHON有个约会

爬虫0060:scrapy快速入门爬虫高级操作:Scrapy framework

官方网站:https://scrapy.org/,打开官方网站,可以看到一段关于scrapy的描述

1171
来自专栏java初学

scrapy(1)——scrapy介绍

3537
来自专栏架构师小秘圈

设计和实现一款轻量级的爬虫框架

作者:王爵nice ,来自架构文摘(ID:ArchDigest) 说起爬虫,大家能够想起 Python 里赫赫有名的 Scrapy 框架, 在本文中我们参考这...

3205
来自专栏喔家ArchiSelf

MCU上的代码执行时间

在许多实时应用程序中,二八原则并不生效,CPU 可以花费95%(或更多)的时间在不到5% 的代码上。电动机控制、引擎控制、无线通信以及其他许多对时间敏感的应用程...

842

扫码关注云+社区