網路爬蟲:使用Scrapy架構編寫一個抓取書籍資訊的爬蟲服務,爬蟲scrapy
上周學習了BeautifulSoup的基礎知識並用它完成了一個網路爬蟲( 使用Beautiful Soup編寫一個爬蟲 系列隨筆匯總 ), BeautifulSoup是一個非常流行的Python網路抓取庫,它提供了一個基於HTML結構的Python對象。 雖然簡單易懂,又能非常好的處理HTML資料,但是相比Scrapy而言,BeautifulSoup有一個最大的缺點:慢。
Scrapy 是一個開源的 Python 資料抓取架構,速度快,強大,而且使用簡單。 來看一個官網首頁上的簡單並完整的爬蟲: 非同步,也就是說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 scrapyclass BookItem(scrapy.Item): title = scrapy.Field() isbn = scrapy.Field() price = scrapy.Field()
編寫Spider類 設定這個Spider的名稱,允許爬取的網域名稱和從哪個連結開始:
import scrapyfrom book_project.items import BookItemclass 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() 方法解析並返回合格節點資料。
從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
結果: 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架構入門