網(wǎng)絡(luò )爬蟲(chóng):使用Scrapy框架編撰一個(gè)抓取書(shū)籍信息的爬蟲(chóng)服務(wù)
優(yōu)采云 發(fā)布時(shí)間: 2020-05-04 08:06上周學(xué)習了BeautifulSoup的基礎知識并用它完成了一個(gè)網(wǎng)絡(luò )爬蟲(chóng)( 使用Beautiful Soup編撰一個(gè)爬蟲(chóng) 系列隨筆匯總),
BeautifulSoup是一個(gè)十分流行的Python網(wǎng)路抓取庫,它提供了一個(gè)基于HTML結構的Python對象。
雖然簡(jiǎn)單易懂,又能非常好的處理HTML數據,
但是相比Scrapy而言網(wǎng)絡(luò )爬蟲(chóng)程序書(shū),BeautifulSoup有一個(gè)最大的缺點(diǎn):慢。
Scrapy 是一個(gè)開(kāi)源的 Python 數據抓取框架,速度快,強大,而且使用簡(jiǎn)單。
來(lái)看一個(gè)官網(wǎng)主頁(yè)上的簡(jiǎn)單并完整的爬蟲(chóng):
雖然只有10行左右的代碼,但是它的確是一個(gè)完整的爬蟲(chóng)服務(wù):
Scrapy所有的懇求都是異步的:
安裝(Mac)
pip install scrapy
其他操作系統請參考完整安裝指導:
Spider類(lèi)想要抒發(fā)的是:如何抓取一個(gè)確定了的網(wǎng)站的數據。比如在start_urls里定義的去那個(gè)鏈接抓取,parse()方法中定義的要抓取什么樣的數據。
當一個(gè)Spider開(kāi)始執行的時(shí)侯,它首先從start_urls()中的第一個(gè)鏈接開(kāi)始發(fā)起懇求網(wǎng)絡(luò )爬蟲(chóng)程序書(shū),然后在callback里處理返回的數據。
Item類(lèi)提供低格的數據,可以理解為數據Model類(lèi)。
Scrapy的Selector類(lèi)基于lxml庫,提供HTML或XML轉換功能。以response對象作為參數生成的Selector實(shí)例即可通過(guò)實(shí)例對象的xpath()方法獲取節點(diǎn)的數據。
接下來(lái)將上一個(gè)Beautiful Soup版的抓取書(shū)籍信息的事例( 使用Beautiful Soup編撰一個(gè)爬蟲(chóng) 系列隨筆匯總)改寫(xiě)成Scrapy版本。
scrapy startproject book_project
這行命令會(huì )創(chuàng )建一個(gè)名為book_project的項目。
即實(shí)體類(lèi),代碼如下:
import scrapy
class BookItem(scrapy.Item):
title = scrapy.Field()
isbn = scrapy.Field()
price = scrapy.Field()
設置這個(gè)Spider的名稱(chēng),允許爬取的域名和從那個(gè)鏈接開(kāi)始:
class BookInfoSpider(scrapy.Spider):
name = "bookinfo"
allowed_domains = ["allitebooks.com", "amazon.com"]
start_urls = [
"http://www.allitebooks.com/security/",
]
def parse(self, response):
# response.xpath('//a[contains(@title, "Last Page →")]/@href').re(r'(\d+)')[0]
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)



