您好,登錄后才能下訂單哦!
爬蟲是python最常見的一類應(yīng)用,但是如何自己動(dòng)手來(lái)寫一個(gè)爬蟲,這可能是很多人關(guān)心的問題,這次準(zhǔn)備用30分鐘來(lái)教會(huì)大家如何自己動(dòng)手編寫一個(gè)Scrapy爬蟲的應(yīng)用
推薦一個(gè)不錯(cuò)的Scrapy視頻教程給大家,可以直接點(diǎn)擊觀看:https://www.bilibili.com/video/av27042686/
首先,我們需要理解爬蟲的原理,只是拿一個(gè)庫(kù)來(lái)用誰(shuí)都會(huì),但理解它的原理才對(duì)大家有好處
通過上圖我們可以對(duì)爬蟲的工作原理(不僅限于Scrapy框架)有一個(gè)認(rèn)識(shí):
- 數(shù)據(jù)源:需要知道從哪里拿到你要的數(shù)據(jù),可以是Web,也可以是App或其他應(yīng)用
- 下載器(Download):需要將數(shù)據(jù)下載到本機(jī)才能進(jìn)行分析工作,而在下載中我們需要關(guān)注幾件事:性能、模擬操作和分布式等
- 分析器(Parser):對(duì)已下載的數(shù)據(jù)進(jìn)行分析,有很多種,比如HTML、正則、json等,當(dāng)然,在分析的過程中,也能發(fā)現(xiàn)更多的鏈接,從而生成更多采集任務(wù)
- 數(shù)據(jù)存儲(chǔ)(Storage):可以將數(shù)據(jù)保存在數(shù)據(jù)或磁盤上,以供后續(xù)產(chǎn)品的調(diào)取、分析等
既然理解了爬蟲的原理,我們可以更進(jìn)一步的認(rèn)識(shí)一下Scrapy框架
Scrapy是Python中很成熟、很常用的一個(gè)框架,大部分Python爬蟲都是由Scrapy來(lái)編寫的,那么,為了理解Scrapy的基本結(jié)構(gòu),我們先來(lái)看一張圖:
其實(shí),這張圖和我們之前說的爬蟲原理是一一對(duì)應(yīng)的,我們來(lái)看看:
- 下載器(Downloader):將數(shù)據(jù)下載回來(lái),以供分析
- 爬蟲(Spider):這個(gè)其實(shí)是用于分析的(Parser),用于對(duì)下載的數(shù)據(jù)進(jìn)行分析
- 調(diào)度器(Scheduler):負(fù)責(zé)調(diào)度任務(wù)
- 數(shù)據(jù)管道(Pipeline):負(fù)責(zé)把數(shù)據(jù)導(dǎo)出給其他程序、文件、數(shù)據(jù)庫(kù)
當(dāng)然,只是了解上述內(nèi)容其實(shí)意義不大,我們來(lái)通過動(dòng)手做一個(gè)例子理解Scrapy
在正式開始編寫爬蟲之前,我們需要先來(lái)創(chuàng)建一個(gè)項(xiàng)目
$> scrapy startproject 項(xiàng)目名稱
先來(lái)了解一下剛剛創(chuàng)建好的目錄里面都有什么
在這里面,其實(shí)只有兩個(gè)東西是我們目前需要關(guān)心的:
本文我們先關(guān)心最基本的功能,所以不會(huì)過于深入Scrapy的細(xì)節(jié),所以只對(duì)中間件和items的功能做一簡(jiǎn)單敘述,在其他文章中再詳細(xì)說明:
本案例中,我們準(zhǔn)備抓取一個(gè)拍賣手機(jī)號(hào)的網(wǎng)站:http://www.jihaoba.com/escrow/
在剛剛創(chuàng)建好的項(xiàng)目中,我們?cè)賱?chuàng)建一個(gè)文件:phone_spider.py
import scrapy
class PhoneSpider(scrapy.Spider):
name='phone'
start_urls=[
'http://www.jihaoba.com/escrow/'
]
def parse(self, response):
pass
在這里我們主要關(guān)心幾件事:
盡管現(xiàn)在還沒有實(shí)際的工作,但我們可以試著啟動(dòng)爬蟲的抓取
scrapy crawl phone
我們可以看到爬蟲的抓取能夠正常啟動(dòng)
我們可以繼續(xù)為爬蟲加入實(shí)際的功能
import scrapy
class PhoneSpider(scrapy.Spider):
name='phone'
start_urls=[
'http://www.jihaoba.com/escrow/'
]
def parse(self, response):
for ul in response.xpath('//div[@class="numbershow"]/ul'):
phone=ul.xpath('li[contains(@class,"number")]/a/@href').re("\\d{11}")[0]
price=ul.xpath('li[@class="price"]/span/text()').extract_first()[1:]
print(phone, price)
這里我們用了一個(gè)非常重要的東西——xpath,xpath是一種用于從XML和HTML中提取數(shù)據(jù)的查詢語(yǔ)言,在這里不做贅述,想了解更多xpath的內(nèi)容請(qǐng)點(diǎn)擊https://www.bilibili.com/video/av30320885
再次啟動(dòng)抓取,我們會(huì)看到一些有用的數(shù)據(jù)產(chǎn)生了
當(dāng)然,我們現(xiàn)在只是把print出來(lái),這肯定不行,需要把數(shù)據(jù)保存到文件中,以便后續(xù)使用
所以,將print改為yield
import scrapy
class PhoneSpider(scrapy.Spider):
name='phone'
start_urls=[
'http://www.jihaoba.com/escrow/'
]
def parse(self, response):
for ul in response.xpath('//div[@class="numbershow"]/ul'):
phone=ul.xpath('li[contains(@class,"number")]/a/@href').re("\\d{11}")[0]
price=ul.xpath('li[@class="price"]/span/text()').extract_first()[1:]
#print(phone, price)
yield {
"phone": phone,
"price": price
}
再次運(yùn)行,并且需要修改運(yùn)行命令,添加輸出選項(xiàng)
scrapy crawl phone
改為
scrapy crawl phone -o data.json
我們可以看到,運(yùn)行后目錄中會(huì)多出一個(gè)data.json,打開后就是我們要的結(jié)果數(shù)據(jù)
注意,這里導(dǎo)出的價(jià)格中,有的帶有“\u4e07”,這其實(shí)是中文“萬(wàn)”的unicode碼,并不影響數(shù)據(jù)使用
目前只抓取了第一頁(yè)的數(shù)據(jù),而我們希望能獲取所有的數(shù)據(jù),所以需要找到下一頁(yè)的地址,并讓爬蟲進(jìn)入其中繼續(xù)抓取
所以,我們需要對(duì)代碼進(jìn)行修改
import scrapy
class PhoneSpider(scrapy.Spider):
name='phone'
start_urls=[
'http://www.jihaoba.com/escrow/'
]
def parse(self, response):
for ul in response.xpath('//div[@class="numbershow"]/ul'):
phone=ul.xpath('li[contains(@class,"number")]/a/@href').re("\\d{11}")[0]
price=ul.xpath('li[@class="price"]/span/text()').extract_first()[1:]
#print(phone, price)
yield {
"phone": phone,
"price": price
}
#繼續(xù)抓取下一頁(yè)
next="http://www.jihaoba.com"+response.xpath('//a[@class="m-pages-next"]/@href').extract_first()
yield scrapy.Request(next)
我們?cè)俅螁?dòng)爬蟲
scrapy crawl phone -o data.json
這次,我們會(huì)得到比之前多的數(shù)據(jù)
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。