网络爬虫:使用Scrapy框架编写一个抓取书籍信息的爬虫服务

 
上周学习了BeautifulSoup的基础知识并用它完成了一个网络爬虫( 使用Beautiful Soup编写一个爬虫 系列随笔汇总 ),
BeautifulSoup是一个非常流行的Python网络抓取库,它提供了一个基于HTML结构的Python对象。
虽然简单易懂,又能非常好的处理HTML数据,但是相比Scrapy而言,BeautifulSoup有一个最大的缺点:

Scrapy 是一个开源的 Python 数据抓取框架,速度快强大,而且使用简单
来看一个官网主页上的简单并完整的爬虫:

虽然只有10行左右的代码,但是它的确是一个完整的爬虫服务:
  1. 当执行scrapy runspider xxx.py命令的时候, Scrapy在项目里查找Spider(蜘蛛🕷️)并通过爬虫引擎来执行它。
  2. 首先从定义在start_urls里的URL开始发起请求,然后通过parse()方法处理响应。response参数就是返回的响应对象。
  3. 在parse()方法中,通过一个CSS选择器获取想要抓取的数据。
Scrapy所有的请求都是异步的,也就是说Scrapy不需要等一个请求完成才能处理下一条请求,而是同时发起另一条请求。
而且,异步请求的另一个好处是当某个请求失败了,其他的请求不会受到影响。

安装(Mac)
pip install scrapy
其他操作系统请参考完整安装指导:http://doc.scrapy.org/en/latest/intro/install.html

Scrapy中几个需要了解的概念

Spiders
Spider类想要表达的是:如何抓取一个确定了的网站的数据。比如在start_urls里定义的去哪个链接抓取,parse()方法中定义的要抓取什么样的数据。
当一个Spider开始执行的时候,它首先从start_urls()中的第一个链接开始发起请求,然后在callback里处理返回的数据。

Items
Item类提供格式化的数据,可以理解为数据Model类。

Selectors
Scrapy的Selector类基于lxml库,提供HTML或XML转换功能。以response对象作为参数生成的Selector实例即可通过实例对象的xpath()方法获取节点的数据。

编写一个Web爬虫

接下来将上一个Beautiful Soup版的抓取书籍信息的例子使用Beautiful Soup编写一个爬虫 系列随笔汇总改写成Scrapy版本。

新建项目
scrapy startproject book_project
这行命令会创建一个名为book_project的项目。

编写Item类
即实体类,代码如下:
import scrapy

class BookItem(scrapy.Item):
    title = scrapy.Field()
    isbn = scrapy.Field()
    price = scrapy.Field()
 
编写Spider类
设置这个Spider的名称,允许爬取的域名和从哪个链接开始:
import scrapy
from book_project.items import BookItem

class BookInfoSpider(scrapy.Spider):
    name = "bookinfo"
    allowed_domains = ["allitebooks.com", "amazon.com"]
    start_urls = [
        "http://www.allitebooks.com/security/",
    ]

 

遍历分页数据的方法
def parse(self, response):
    num_pages = int(response.xpath('//a[contains(@title, "Last Page →")]/text()').extract_first())
    base_url = "http://www.allitebooks.com/security/page/{0}/"
    for page in range(1, num_pages):
        yield scrapy.Request(base_url.format(page), dont_filter=True, callback=self.parse_page)

'//a'的意思所有的a标签;
'//a[contains(@title, "Last Page →")' 的意思是在所有的a标签中,title属性包涵"Last Page →"的a标签;
extract() 方法解析并返回符合条件的节点数据。

从allitebooks.com获取书籍信息方法
def parse_page(self, response):
        for sel in response.xpath('//div/article'):
            book_detail_url = sel.xpath('div/header/h2/a/@href').extract_first()
            yield scrapy.Request(book_detail_url, callback=self.parse_book_info)

def parse_book_info(self, response):
    title = response.css('.single-title').xpath('text()').extract_first()
    isbn = response.xpath('//dd[2]/text()').extract_first()
    item = BookItem()
    item['title'] = title
    item['isbn'] = isbn
    amazon_search_url = 'https://www.amazon.com/s/ref=nb_sb_noss?url=search-alias%3Daps&field-keywords=' + isbn
    yield scrapy.Request(amazon_search_url, callback=self.parse_price, meta={ 'item': item })

 

从amazon.com获取书籍价格方法            
def parse_price(self, response):
    item = response.meta['item']
    item['price'] = response.xpath('//span/text()').re(r'\$[0-9]+\.[0-9]{2}?')[0]
    yield item

启动服务开始抓取
scrapy crawl bookinfo -o books.csv
-o books.csv 参数的意思是将抓取的Item集合输出到csv文件。
除了CSV格式,Scrapy还支持JSON,XML的格式输入。具体请参考:http://doc.scrapy.org/en/latest/topics/feed-exports.html#topics-feed-exports

结果:
 
 
我们处于大数据时代,对数据处理感兴趣的朋友欢迎查看另一个系列随笔: 利用Python进行数据分析 基础系列随笔汇总

大数据,大数据分析、BeautifulSoup,Beautiful Soup入门,Scrapy, Scrapy爬虫,数据挖掘,数据分析,数据处理,pandas,网络爬虫,web scraper,python excel,python写入excel数据,python处理csv文件 Scrapy csv, python操作Excel,excel读写 Scrapy框架 Scrapy框架入门大数据,大数据分析、BeautifulSoup,Beautiful Soup入门,Scrapy, Scrapy爬虫,数据挖掘,数据分析,数据处理,pandas,网络爬虫,web scraper,python excel,python写入excel数据,python处理csv文件 Scrapy csv, python操作Excel,excel读写 Scrapy框架 Scrapy框架入门 大数据,大数据分析、BeautifulSoup,Beautiful Soup入门,Scrapy, Scrapy爬虫,数据挖掘,数据分析,数据处理,pandas,网络爬虫,web scraper,python excel,python写入excel数据,python处理csv文件 Scrapy csv, python操作Excel,excel读写 Scrapy框架 Scrapy框架入门 大数据,大数据分析、BeautifulSoup,Beautiful Soup入门,Scrapy, Scrapy爬虫,数据挖掘,数据分析,数据处理,pandas,网络爬虫,web scraper,python excel,python写入excel数据,python处理csv文件 Scrapy csv, python操作Excel,excel读写 Scrapy框架 Scrapy框架入门 大数据,大数据分析、BeautifulSoup,Beautiful Soup入门,Scrapy, Scrapy爬虫,数据挖掘,数据分析,数据处理,pandas,网络爬虫,web scraper,python excel,python写入excel数据,python处理csv文件 Scrapy csv, python操作Excel,excel读写 Scrapy框架 Scrapy框架入门

posted on 2016-08-25 10:35  backslash112  阅读(12898)  评论(8编辑  收藏  举报

导航