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

优采云 发布时间: 2020-05-04 08:06

  上周学习了BeautifulSoup的基础知识并用它完成了一个网络爬虫( 使用Beautiful Soup编撰一个爬虫 系列随笔汇总),

  BeautifulSoup是一个十分流行的Python网路抓取库,它提供了一个基于HTML结构的Python对象。

  虽然简单易懂,又能非常好的处理HTML数据,

  但是相比Scrapy而言网络爬虫程序书,BeautifulSoup有一个最大的缺点:慢。

  Scrapy 是一个开源的 Python 数据抓取框架,速度快,强大,而且使用简单。

  来看一个官网主页上的简单并完整的爬虫:

  

  虽然只有10行左右的代码,但是它的确是一个完整的爬虫服务:

  Scrapy所有的恳求都是异步的:

  安装(Mac)

  pip install scrapy

  其他操作系统请参考完整安装指导:

  Spider类想要抒发的是:如何抓取一个确定了的网站的数据。比如在start_urls里定义的去那个链接抓取,parse()方法中定义的要抓取什么样的数据。

  当一个Spider开始执行的时侯,它首先从start_urls()中的第一个链接开始发起恳求网络爬虫程序书,然后在callback里处理返回的数据。

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

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

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

  scrapy startproject book_project

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

  即实体类,代码如下:

  import scrapy

class BookItem(scrapy.Item):

title = scrapy.Field()

isbn = scrapy.Field()

price = scrapy.Field()

  设置这个Spider的名称,允许爬取的域名和从那个链接开始:

  class BookInfoSpider(scrapy.Spider):

name = "bookinfo"

allowed_domains = ["allitebooks.com", "amazon.com"]

start_urls = [

"http://www.allitebooks.com/security/",

]

  def parse(self, response):

# response.xpath('//a[contains(@title, "Last Page →")]/@href').re(r'(\d+)')[0]

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)

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线