Scrapy使用你定義的爬蟲(chóng)的類(lèi)來(lái)從網(wǎng)站中爬取信息。你定義的爬蟲(chóng)的類(lèi)必須是scrapy.Spider的子類(lèi),并且需要定義此子類(lèi)的初始化請(qǐng)求、如何在頁(yè)面中爬取所需的鏈接嗓节、如何解析爬取到的頁(yè)面內(nèi)容并且提取你需要的數(shù)據(jù)。
在你的tutorial/spider路徑中創(chuàng)建一個(gè)名為quotes_spider.py文件皆警,并保存在你的項(xiàng)目中,我們的第一個(gè)爬蟲(chóng)的代碼如下:
import scrapy
class QuotesSpider(scrapy.Spider):
name = "quotes"
def start_requests(self):
urls = [
'http://quotes.toscrape.com/page/1/',
'http://quotes.toscrape.com/page/2/',
]
for url in urls:
yield scrapy.Request(url = url, callback = self.parse)
def parse(self, response):
page = response.url.split("/")[-2]
filename = 'quotes-%s.html' % page
with open(filename, 'wb') as f:
f.write(response.body)
self.log('Save file %s' % filename)
正如你所見(jiàn)到的拦宣,我們的爬蟲(chóng)(Spider)是scrapy.Spider的子類(lèi)(Spider繼承父類(lèi)),還定義了一些新的屬性和方法信姓。
-
name:識(shí)別爬蟲(chóng)(名字)鸵隧。
在一個(gè)項(xiàng)目中一個(gè)爬蟲(chóng)的名字必須是唯一的,你不能設(shè)置同樣的爬蟲(chóng)名字在此項(xiàng)目中意推。 -
start_request():必須返回一個(gè)請(qǐng)求(Request)的迭代對(duì)象(你也可以返回請(qǐng)求的列表或編寫(xiě)一個(gè)生成器函數(shù))爬蟲(chóng)將會(huì)從此請(qǐng)求開(kāi)始爬取豆瘫。
后續(xù)的請(qǐng)求將會(huì)從這些初始化請(qǐng)求依次生成。 -
parse():將調(diào)用一個(gè)方法來(lái)處理每個(gè)請(qǐng)求所響應(yīng)的下載菊值。
響應(yīng)參數(shù)是TextResponse的一個(gè)實(shí)例外驱,該實(shí)例不僅保存了頁(yè)面的內(nèi)容,而且有助于我們對(duì)實(shí)例作進(jìn)一步的操作腻窒。
parse()方法函數(shù)通常用來(lái)解析頁(yè)面返回的響應(yīng)昵宇,提取所爬取數(shù)據(jù)并生成字典類(lèi)型數(shù)據(jù),還可以尋找新的鏈接(URLs)和從鏈接中創(chuàng)建想的請(qǐng)求(Request)儿子。