爬虫学习笔记(一):爬取书籍信息
爬取爬虫练习网站的书籍信息
专门供爬虫初学者训练爬虫技术的网站(http://books.toscrape.com)
我使用的浏览器是Google Chrome浏览器
1. 创建项目
首先,我们要创建一个Scrapy项目,在shell中使用scrapy startproject命令:
$ scrapy startproject Spider_name
创建成功:

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

查看书籍链接信息:
可以发现,下一页的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 <SPIDER_NAME>命令运行爬虫’books’,并将爬取的数据存储到csv文件中:
>>>scrapy crawl books -o books.csv

