上文中我们了解到了如何在网页中的源代码中查找到相关信息,接下来进行页面爬取工作:
1、首先创建一个Scrapy项目,取名为toscrape_book,接下来创建Spider文件以及Spider类,步骤如下:
整个Scrapy框架建于D盘下的pycodes文件夹中,并在文件夹下的Spider文件中建立一个名为books的爬虫文件。
2、在实现Spider之前,先定义封装书籍信息的Item类,在toscrape_book/items.py中添加如下代码:
class BookItem(scrapy.Item): name=scrapy.Field() #书名 price=scrapy.Field() #价格 review_rating=scrapy.Field() #评价等级,1-5星 review_num=scrapy.Field() #评价数量 upc=scrapy.Field() #产品编码 stock=scrapy.Field() #库存量
3,接下来按照5步完成BooksSpider。
class BooksSpider(scrapy.Spider): name = 'books' allowed_domains = ['books.toscrape.com'] start_urls = ['http://books.toscrape.com/'] #书籍列表页面的解析函数 def parse(self, response): pass #书籍页面的解析函数 def parse_book(self,response): pass
先来完成第4步,实现书籍列表页面的解析函数(parse方法),需要完成以下两个任务:
class BooksSpider(scrapy.Spider): name = 'books' allowed_domains = ['books.toscrape.com'] start_urls = ['http://books.toscrape.com/'] #书籍列表页面的解析函数 def parse(self, response): #提取书籍列表页面中每本书的链接 le=LinkExtractor(restrict_css='article.product_pod h3') for link in le.extract_links(response): yield scrapy.Request(link.url,callback=self.parse_book) #提取“下一页”的链接 le=LinkExtractor(restrict_css='ul.pager li.next') links=le.extract_links(response) if links: next_url=links[0].url yield scrapy.Request(next_url,callback=self.parse)
最后完成第5步,实现书籍页面的解析函数(parse_book方法),只需要提取书籍信息存入BookItem对象即可。同样,提取书籍信息的细节也在页面分析时讨论过,最终完成代码如下:
# -*- coding: utf-8 -*- import scrapy from scrapy.linkextractors import LinkExtractor from ..items import BookItem class BooksSpider(scrapy.Spider): name = 'books' allowed_domains = ['books.toscrape.com'] start_urls = ['http://books.toscrape.com/'] #书籍列表页面的解析函数 def parse(self, response): #提取书籍列表页面中每本书的链接 le=LinkExtractor(restrict_css='article.product_pod h3') for link in le.extract_links(response): yield scrapy.Request(link.url,callback=self.parse_book) #提取“下一页”的链接 le=LinkExtractor(restrict_css='ul.pager li.next') links=le.extract_links(response) if links: next_url=links[0].url yield scrapy.Request(next_url,callback=self.parse) #书籍页面解析函数 def parse_book(self,response): book=BookItem() sel=response.css('div.product_main') book['name']=sel.xpath('./h1/text()').extract_first() book['price']=sel.css('p.price_color::text').extract_first() book['review_rating']=sel.css('p.star-rating::attr(class)')\ .re_first('star-rating ([A-Za-z]+)') sel=response.css('table.table.table-striped') book['upc']=sel.xpath('(.//tr)[1]/td/text()').extract_first() book['stock']=sel.xpath('(.//tr)[last()-1]/td/text()')\ .re_first('\((\d+) available\)') book['review_num']=sel.xpath('(.//tr)[last()]/td/text()').extract_first() yield book
完成代码后,运行爬虫并观察结果:
--------------------------------------------------------------------------------------------------------------------------------
输入第一行命令后等待一段时间出现第二行命令后即表示爬取数据成功。爬取到的所有数据以.csv格式存储在D:\pycodes\toscrape_book下。
到此,爬取工作结束。
文章来源: Scrapy爬虫爬取书籍网站信息(二)