前言
天黑之后就在图书馆玩一个爬虫,就是那个开源的爬虫 -- scrapy!早几天就搭建了一个Redis集群服务器,于是就将爬取的数据存储于Redis数据库。
Redis数据库集群搭建 | 实践篇
Scrapy
Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。 可以应用在包括数据挖掘,信息处理或存储历史数。Scrapy 使用 Twisted这个异步网络库来处理网络通讯,架构清晰,并且包含了各种中间件接口,可以灵活的完成各种需求。
目的
目标是学校图书馆的热榜书籍,内网首选 省流量O(∩_∩)O哈哈~ 。
将热榜书籍的相关数据存储到Reids数据库即可,很简单的一个实验
PS
代码语言:javascript复制# 安装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': ['14987xa0'],
'isbn': ['978-7-80080-752-7xa0'],
'kid': ['C913.2/258xa0'],
'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': ['1219xa0'],
'isbn': ['7-108-00161-6xa0'],
'kid': ['R167/20xa0'],
'name': ['xa0'],
'public': ['三联书店xa0'],
'public_location': ['北京xa0'],
'type': ['中文图书xa0']}
... ...
注意:还有一点问题,存在unicode编码的字符,编码处理不难,可是图书馆又准备关门了。得跑路啦O(∩_∩)O哈哈~