Scrapy爬虫爬取书籍网站信息(二)

匿名 (未验证) 提交于 2019-12-03 00:19:01

上文中我们了解到了如何在网页中的源代码中查找到相关信息,接下来进行页面爬取工作:

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下。


到此,爬取工作结束。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!