初识Scrapy

一个网络爬虫程序的基本执行流程可以总结为以下循环

1.下载页面一个网页的内容本质上就是一个HTML文本,爬取一个网页内容之前,首先要根据网页的URL下载网页。

2.提取页面中的数据当一个网页(HTML)下载完成后,对页面中的内容进行分析,并提取出我们感兴趣的数据,提取到的数据可以以多种形式保存起来,比如将数据以某种格式(CSV、JSON)写入文件中,或存储到数据库(MySQL、MongoDB)中。

3.提取页面中的链接通常,我们想要获取的数据并不只在一个页面中,而是分布在多个页面中,这些页面彼此联系,一个页面中可能包含一个或多个到其他页面的链接,提取完当前页面中的数据后,还要把页面中的某些链接也提取出来,然后对链接页面进行爬取(循环1-3步骤)。

使用pip install scrapy安装scrpay
精通Scrapy网络爬虫【一】第一个爬虫项目_爬虫输入scrapy
测试是否安装成功
精通Scrapy网络爬虫【一】第一个爬虫项目_html_02

编写第一个爬虫项目

使用scrapystartproject命令:
精通Scrapy网络爬虫【一】第一个爬虫项目_html_03
精通Scrapy网络爬虫【一】第一个爬虫项目_数据_04

分析页面

http://books.toscrape.com/
打开开发者工具进行分析
精通Scrapy网络爬虫【一】第一个爬虫项目_数据_05

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

分析next按钮
精通Scrapy网络爬虫【一】第一个爬虫项目_python_06

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

编写爬虫

scrapy genspider book_spider http://books.toscrape.com/
创建spider
精通Scrapy网络爬虫【一】第一个爬虫项目_ide_07

编写

import scrapy


class BookSpiderSpider(scrapy.Spider):
    name = 'book_spider'
    # allowed_domains = ['http://books.toscrape.com/']
    start_urls = ['http://books.toscrape.com//']

    def parse(self, response):
        for book in response.css('article.product_pod'):
            name=book.xpath('./h3/a/@title').extract_first()
            price=book.css('p.price_color::text').extract_first()
            yield {
                'name':name,
                'price':price,
            }
        next_url=response.css('ul.pager li.next a::attr(href)').extract_first()
        if next_url:
            next_url=response.urljoin(next_url)
            yield scrapy.Request(next_url,callback=self.parse)

在shell中执行scrapy crawl book_spider运行爬虫
精通Scrapy网络爬虫【一】第一个爬虫项目_数据_08
从上述数据可以看出,我们成功地爬取到了1000本书的书名和价格信息(50页,每页20项)。

参考资料:《精通Scrapy网络爬虫》刘硕 清华大学出版社