爬虫 | 继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 条评论
登录 后参与评论

相关文章

来自专栏移动开发之家

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

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

1851
来自专栏数据结构笔记

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

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

1312
来自专栏IT派

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

本文采用requests + Xpath,爬取豆瓣电影《黑豹》部分短评内容。话不多说,代码先上:

903
来自专栏Linyb极客之路

贫血,充血模型的解释以及一些经验

下面用举一个具体的代码来说明,代码来自Hibernate的caveatemptor,但经过我的改写: 一个实体类叫做Item,指的是一个拍卖项目 一个DA...

5992
来自专栏程序员宝库

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

作者:王爵nice 链接:https://blog.biezhi.me/2018/01/design-and-implement-a-crawler-fram...

4028
来自专栏架构师小秘圈

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

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

3635
来自专栏北京马哥教育

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

2026
来自专栏魏琼东

一步一步教你使用AgileEAS.NET基础类库进行应用开发-WinForm应用篇-演示使用报表构建UI-入库业务查询模块

回顾与说明     前面我们把“商品字典”、“商品入库”、“商品库存查询”三个模块已经概括或者详细的演示完了,这些模块涉及到简单数据的增、删、修,也涉及到复杂业...

2365
来自专栏xdecode

Java高并发之锁优化

1874
来自专栏微信小程序开发

python爬虫scrapy框架介绍

Scrapy介绍 ? Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。 所...

3317

扫码关注云+社区

领取腾讯云代金券