網絡爬蟲:使用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() 方法解析並返回符合條件的節點數據。

從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框架入門


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM