網絡爬蟲:使用Scrapy框架編寫一個抓取書籍信息的爬蟲服務

 
上週學習了BeautifulSoup的基礎知識並用它完成了一個網絡爬蟲( 使用Beautiful Soup編寫一個爬蟲 系列隨筆彙總 ),
BeautifulSoup是一個很是流行的Python網絡抓取庫,它提供了一個基於HTML結構的Python對象。
雖然簡單易懂,又能很是好的處理HTML數據,可是相比Scrapy而言,BeautifulSoup有一個最大的缺點:

Scrapy 是一個開源的 Python 數據抓取框架,速度快強大,並且使用簡單
來看一個官網主頁上的簡單並完整的爬蟲:

雖然只有10行左右的代碼,可是它的確是一個完整的爬蟲服務:
  1. 當執行scrapy runspider xxx.py命令的時候, Scrapy在項目裏查找Spider(蜘蛛🕷️)並經過爬蟲引擎來執行它。
  2. 首先從定義在start_urls裏的URL開始發起請求,而後經過parse()方法處理響應。response參數就是返回的響應對象。
  3. 在parse()方法中,經過一個CSS選擇器獲取想要抓取的數據。
Scrapy全部的請求都是 異步的,也就是說Scrapy不須要等一個請求完成才能處理下一條請求,而是同時發起另外一條請求。
並且,異步請求的另外一個好處是當某個請求失敗了,其餘的請求不會受到影響。

安裝(Mac)
pip install scrapy
其餘操做系統請參考完整安裝指導: http://doc.scrapy.org/en/latest/intro/install.html

Scrapy中幾個須要瞭解的概念

Spiders
Spider類想要表達的是: 如何抓取一個肯定了的網站的數據。好比在start_urls裏定義的去哪一個連接抓取,parse()方法中定義的要抓取什麼樣的數據。
當一個Spider開始執行的時候,它首先從start_urls()中的第一個連接開始發起請求,而後在callback裏處理返回的數據。

Items
Item類提供格式化的數據,能夠理解爲數據 Model類。

Selectors
Scrapy的Selector類基於lxml庫, 提供HTML或XML轉換功能。以response對象做爲參數生成的Selector實例便可經過實例對象的xpath()方法獲取節點的數據。

編寫一個Web爬蟲

接下來將上一個Beautiful Soup版的抓取書籍信息的例子 使用Beautiful Soup編寫一個爬蟲 系列隨筆彙總 改寫成Scrapy版本。

新建項目
scrapy startproject book_project
這行命令會建立一個名爲book_project的項目。

編寫Item類
即實體類,代碼以下:
import scrapy

class BookItem(scrapy.Item):
    title = scrapy.Field()
    isbn = scrapy.Field()
    price = scrapy.Field()
 
編寫Spider類
設置這個Spider的名稱,容許爬取的域名和從哪一個連接開始:
import scrapy
from book_project.items import BookItem

class BookInfoSpider(scrapy.Spider):
    name = "bookinfo"
    allowed_domains = ["allitebooks.com", "amazon.com"]
    start_urls = [
        "http://www.allitebooks.com/security/",
    ]

 

遍歷分頁數據的方法
def parse(self, response):
    num_pages = int(response.xpath('//a[contains(@title, "Last Page →")]/text()').extract_first())
    base_url = "http://www.allitebooks.com/security/page/{0}/"
    for page in range(1, num_pages):
        yield scrapy.Request(base_url.format(page), dont_filter=True, callback=self.parse_page)

'//a'的意思全部的a標籤;
'//a[contains(@title, "Last Page →")' 的意思是在全部的a標籤中,title屬性包涵"Last Page →"的a標籤;
extract() 方法解析並返回符合條件的節點數據。css

從allitebooks.com獲取書籍信息方法
def parse_page(self, response):
        for sel in response.xpath('//div/article'):
            book_detail_url = sel.xpath('div/header/h2/a/@href').extract_first()
            yield scrapy.Request(book_detail_url, callback=self.parse_book_info)

def parse_book_info(self, response):
    title = response.css('.single-title').xpath('text()').extract_first()
    isbn = response.xpath('//dd[2]/text()').extract_first()
    item = BookItem()
    item['title'] = title
    item['isbn'] = isbn
    amazon_search_url = 'https://www.amazon.com/s/ref=nb_sb_noss?url=search-alias%3Daps&field-keywords=' + isbn
    yield scrapy.Request(amazon_search_url, callback=self.parse_price, meta={ 'item': item })

 

從amazon.com獲取書籍價格方法            
def parse_price(self, response):
    item = response.meta['item']
    item['price'] = response.xpath('//span/text()').re(r'\$[0-9]+\.[0-9]{2}?')[0]
    yield item

啓動服務開始抓取
scrapy crawl bookinfo -o books.csv
-o books.csv 參數的意思是將抓取的Item集合輸出到csv文件。
除了CSV格式,Scrapy還支持JSON,XML的格式輸入。具體請參考: http://doc.scrapy.org/en/latest/topics/feed-exports.html#topics-feed-exports

結果:
 
 
完整代碼請移步GitHub:  https://github.com/backslash112/book_scraper_scrapy
咱們處於大數據時代,對數據處理感興趣的朋友歡迎查看另外一個系列隨筆:  利用Python進行數據分析 基礎系列隨筆彙總

大數據,大數據分析、BeautifulSoup,Beautiful Soup入門,Scrapy, Scrapy爬蟲,數據挖掘,數據分析,數據處理,pandas,網絡爬蟲,web scraper,python excel,python寫入excel數據,python處理csv文件 Scrapy csv, python操做Excel,excel讀寫 Scrapy框架 Scrapy框架入門大數據,大數據分析、BeautifulSoup,Beautiful Soup入門,Scrapy, Scrapy爬蟲,數據挖掘,數據分析,數據處理,pandas,網絡爬蟲,web scraper,python excel,python寫入excel數據,python處理csv文件 Scrapy csv, python操做Excel,excel讀寫 Scrapy框架 Scrapy框架入門 大數據,大數據分析、BeautifulSoup,Beautiful Soup入門,Scrapy, Scrapy爬蟲,數據挖掘,數據分析,數據處理,pandas,網絡爬蟲,web scraper,python excel,python寫入excel數據,python處理csv文件 Scrapy csv, python操做Excel,excel讀寫 Scrapy框架 Scrapy框架入門 大數據,大數據分析、BeautifulSoup,Beautiful Soup入門,Scrapy, Scrapy爬蟲,數據挖掘,數據分析,數據處理,pandas,網絡爬蟲,web scraper,python excel,python寫入excel數據,python處理csv文件 Scrapy csv, python操做Excel,excel讀寫 Scrapy框架 Scrapy框架入門 大數據,大數據分析、BeautifulSoup,Beautiful Soup入門,Scrapy, Scrapy爬蟲,數據挖掘,數據分析,數據處理,pandas,網絡爬蟲,web scraper,python excel,python寫入excel數據,python處理csv文件 Scrapy csv, python操做Excel,excel讀寫 Scrapy框架 Scrapy框架入門html

相關文章
相關標籤/搜索