- 精通Scrapy網絡爬蟲
- 劉碩
- 1809字
- 2020-11-28 14:59:37
1.3 編寫第一個Scrapy爬蟲
為了幫助大家建立對Scrapy框架的初步印象,我們使用它完成一個簡單的爬蟲項目。
1.3.1 項目需求
在專門供爬蟲初學者訓練爬蟲技術的網站(http://books.toscrape.com)上爬取書籍信息,如圖1-1所示。

圖1-1
該網站中,這樣的書籍列表頁面一共有50頁,每頁有20本書,第一個例子應盡量簡單。我們下面僅爬取所有圖書(1000本)的書名和價格信息。
1.3.2 創建項目
首先,我們要創建一個Scrapy項目,在shell中使用scrapy startproject命令:
$ scrapy startproject example New Scrapy project 'example', using template directory '/usr/local/lib/python3.4/dist-packages/scrapy/templates/project', created in: /home/liushuo/book/example You can start your first spider with: cd example scrapy genspider example example.com
創建好一個名為example的項目后,可使用tree命令查看項目目錄下的文件,顯示如下:
$ tree example example/ ├── example │ ├── __init__.py │ ├── items.py │ ├── middlewares.py │ ├── pipelines.py │ ├── settings.py │ └── spiders │ └── __init__.py └── scrapy.cfg
隨著后面逐步深入學習,大家會了解這些文件的用途,此處不做解釋。
1.3.3 分析頁面
編寫爬蟲程序之前,首先需要對待爬取的頁面進行分析,主流的瀏覽器中都帶有分析頁面的工具或插件,這里我們選用Chrome瀏覽器的開發者工具(Tools→Developer tools)分析頁面。
1.數據信息
在Chrome瀏覽器中打開頁面http://books.toscrape.com,選中其中任意一本書并右擊,然后選擇“審查元素”,查看其HTML代碼,如圖1-2所示。

圖1-2
可以看到,每一本書的信息包裹在<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>。
2.鏈接信息
圖1-3所示為第一頁書籍列表頁面,可以通過單擊next按鈕訪問下一頁,選中頁面下方的next按鈕并右擊,然后選擇“審查元素”,查看其HTML代碼,如圖1-3所示。

圖1-3
可以發現,下一頁的URL在ul.pager > li.next > a元素的href屬性中,是一個相對URL地址,如<li class="next"><a href="catalogue/page-2.html">next</a></li>。
1.3.4 實現Spider
分析完頁面后,接下來編寫爬蟲。在Scrapy中編寫一個爬蟲,即實現一個scrapy.Spider的子類。
實現爬蟲的Python文件應位于exmaple/spiders目錄下,在該目錄下創建新文件book_spider.py。然后,在book_spider.py中實現爬蟲BooksSpider,代碼如下:
# -*- coding: utf-8-*- import scrapy class BooksSpider(scrapy.Spider): # 每一個爬蟲的唯一標識 name = "books" # 定義爬蟲爬取的起始點,起始點可以是多個,這里只有一個 start_urls = ['http://books.toscrape.com/'] def parse(self, response): # 提取數據 # 每一本書的信息在<article class="product_pod">中,我們使用 # css()方法找到所有這樣的article元素,并依次迭代 for book in response.css('article.product_pod'): # 書名信息在article>h3>a元素的title屬性里 # 例如:<a title="A Light in the Attic">A Light in the ...</a> name = book.xpath('./h3/a/@title').extract_first() # 書價信息在 <p class="price_color">的TEXT中。 # 例如:<p class="price_color">£51.77</p> price = book.css('p.price_color::text').extract_first() yield { 'name': name, 'price': price, } # 提取鏈接 # 下一頁的url在ul.pager>li.next>a里面 # 例如:<li class="next"><a href="catalogue/page-2.html">next</a></li> next_url = response.css('ul.pager li.next a::attr(href)').extract_first() if next_url: # 如果找到下一頁的URL,得到絕對路徑,構造新的Request對象 next_url = response.urljoin(next_url) yield scrapy.Request(next_url, callback=self.parse)
如果上述代碼中有看不懂的部分,大家不必擔心,更多詳細內容會在后面章節學習,這里只要先對實現一個爬蟲有個整體印象即可。
下面對BooksSpider的實現做簡單說明。
● name屬性
一個Scrapy項目中可能有多個爬蟲,每個爬蟲的name屬性是其自身的唯一標識,在一個項目中不能有同名的爬蟲,本例中的爬蟲取名為’books'。
● start_urls屬性
- 新一代通用視頻編碼H.266/VVC:原理、標準與實現
- C語言程序設計(第2版)
- DevOps入門與實踐
- Python程序設計
- 差分進化算法及其高維多目標優化應用
- Mastering AndEngine Game Development
- FLL+WRO樂高機器人競賽教程:機械、巡線與PID
- PySide 6/PyQt 6快速開發與實戰
- C語言程序設計
- 從零開始學Python網絡爬蟲
- Beginning C++ Game Programming
- 區塊鏈架構之美:從比特幣、以太坊、超級賬本看區塊鏈架構設計
- Magento 2 Beginners Guide
- Clojure Polymorphism
- jQuery從入門到精通(微課精編版)