爬虫学习笔记(一):爬取书籍信息

爬取爬虫练习网站的书籍信息

专门供爬虫初学者训练爬虫技术的网站(http://books.toscrape.com)

我使用的浏览器是Google Chrome浏览器

1. 创建项目

首先,我们要创建一个Scrapy项目,在shell中使用scrapy startproject命令:

$ scrapy startproject Spider_name

创建成功:
爬虫学习笔记(一):爬取书籍信息_第1张图片

2. 分析页面

网站首页如下图所示:
爬虫学习笔记(一):爬取书籍信息_第2张图片
接着将鼠标停在第一本书的图片上,点击鼠标右键,再选择“检查”。
或者按下F12键。显示如下信息:

可以看到,每一本书的信息包裹在< article class=“product_pod”>元素 中:
书名信息在其下h3 > a元素的title属性中,如< a href="catalogue/a-light- in-the-attic_1000/index.html"title=“A Light in the Attic”>A Light in the…< /a >; 书价信息在其下< p class=“price_color”>元素的文本中,如< p class=“price_color”>£51.77< /p>。

爬虫学习笔记(一):爬取书籍信息_第3张图片
查看书籍链接信息:

可以发现,下一页的URL在ul.pager > li.next > a元素的href属性中,是 一个相对URL地址,如< li class=“next”>< a href=“catalogue/page- 2.html”>next< /a>< /li>。

3. 实现Spider

分析完页面后,接下来编写爬虫。在Scrapy中编写一个爬虫,即实现一个scrapy.Spider的子类。 实现爬虫的Python文件应位于exmaple/spiders目录下,在该目录下创建新文件book_spider.py。然后,在book_spider.py中实现爬虫BooksSpider, 代码如下:

# -*- 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):
        #在article和product_pod下的h3中提取链接,提取书籍列表页面中每本书的链接
        le = LinkExtractor(restrict_css = 'article.product_pod h3')
        #extract_links是一个列表,保存提取的所以链接
        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-Z a-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+)avaliable\)')
        book['review_num'] = sel.xpath('(.//tr)[last()]/td/text()').extract_first()
        yield book

页面解析函数通常被实现成一个生成器函数,每一项从页面中提取的 数据以及每一个对链接页面的下载请求都由yield语句提交给Scrapy引擎。

4. 运行爬虫

完成代码后,运行爬虫爬取数据,在shell中执行scrapy crawl 命令运行爬虫’books’,并将爬取的数据存储到csv文件中:

>>>scrapy crawl books -o books.csv

爬虫学习笔记(一):爬取书籍信息_第4张图片

你可能感兴趣的:(python爬虫)