溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

scrapy簡(jiǎn)單入門及實(shí)例講解

發(fā)布時(shí)間:2020-07-05 09:13:03 來(lái)源:網(wǎng)絡(luò) 閱讀:2299 作者:智源學(xué)院 欄目:編程語(yǔ)言

爬蟲是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ì)大家有好處
scrapy簡(jiǎn)單入門及實(shí)例講解

通過上圖我們可以對(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框架

二、認(rèn)識(shí)Scrapy框架

Scrapy是Python中很成熟、很常用的一個(gè)框架,大部分Python爬蟲都是由Scrapy來(lái)編寫的,那么,為了理解Scrapy的基本結(jié)構(gòu),我們先來(lái)看一張圖:
scrapy簡(jiǎn)單入門及實(shí)例講解

其實(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ù)

三、認(rèn)識(shí)Scrapy項(xiàng)目

當(dāng)然,只是了解上述內(nèi)容其實(shí)意義不大,我們來(lái)通過動(dòng)手做一個(gè)例子理解Scrapy

1.搭建初識(shí)項(xiàng)目環(huán)境

在正式開始編寫爬蟲之前,我們需要先來(lái)創(chuàng)建一個(gè)項(xiàng)目

$> scrapy startproject 項(xiàng)目名稱

scrapy簡(jiǎn)單入門及實(shí)例講解

2.認(rèn)識(shí)項(xiàng)目目錄

先來(lái)了解一下剛剛創(chuàng)建好的目錄里面都有什么
scrapy簡(jiǎn)單入門及實(shí)例講解

在這里面,其實(shí)只有兩個(gè)東西是我們目前需要關(guān)心的:

  • spiders目錄:編寫的所有爬蟲類,都會(huì)放在這里
  • settings.py:Scrapy框架提供的所有設(shè)置,都會(huì)通過這個(gè)文件來(lái)修改

3.理解“中間件”和”items”

本文我們先關(guān)心最基本的功能,所以不會(huì)過于深入Scrapy的細(xì)節(jié),所以只對(duì)中間件和items的功能做一簡(jiǎn)單敘述,在其他文章中再詳細(xì)說明:

  • 中間件:由于各類數(shù)據(jù)源其實(shí)有很多差異,所以middlewares用于屏蔽這種差異,以便于統(tǒng)一處理
  • items:對(duì)項(xiàng)目中所有數(shù)據(jù)進(jìn)行統(tǒng)一化,生成統(tǒng)一的結(jié)構(gòu)化數(shù)據(jù),從而實(shí)現(xiàn)程序(爬蟲和其他程序)的標(biāo)準(zhǔn)化

四、抓取案例

本案例中,我們準(zhǔn)備抓取一個(gè)拍賣手機(jī)號(hào)的網(wǎng)站:http://www.jihaoba.com/escrow/
scrapy簡(jiǎn)單入門及實(shí)例講解

1.創(chuàng)建spider

在剛剛創(chuàng)建好的項(xiàng)目中,我們?cè)賱?chuàng)建一個(gè)文件:phone_spider.py
scrapy簡(jiǎn)單入門及實(shí)例講解

2.編寫Spider類

import scrapy

class PhoneSpider(scrapy.Spider):
    name='phone'

    start_urls=[
        'http://www.jihaoba.com/escrow/'
    ]

    def parse(self, response):
        pass

在這里我們主要關(guān)心幾件事:

  • name:spider的名字,用于啟動(dòng)抓?。ê竺鏁?huì)說)
  • start_urls:起始抓取地址,后續(xù)任務(wù)可能產(chǎn)生更多url,但start_urls是入口
  • parse方法:默認(rèn)的解析回調(diào)方法,當(dāng)下載完成后會(huì)自動(dòng)調(diào)用

3.啟動(dòng)抓取

盡管現(xiàn)在還沒有實(shí)際的工作,但我們可以試著啟動(dòng)爬蟲的抓取

scrapy crawl phone

scrapy簡(jiǎn)單入門及實(shí)例講解

我們可以看到爬蟲的抓取能夠正常啟動(dòng)

4.為爬蟲添加功能

我們可以繼續(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)生了
scrapy簡(jiǎn)單入門及實(shí)例講解

5.爬蟲數(shù)據(jù)導(dǎo)出

當(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ù)
scrapy簡(jiǎn)單入門及實(shí)例講解
scrapy簡(jiǎn)單入門及實(shí)例講解

注意,這里導(dǎo)出的價(jià)格中,有的帶有“\u4e07”,這其實(shí)是中文“萬(wàn)”的unicode碼,并不影響數(shù)據(jù)使用
scrapy簡(jiǎn)單入門及實(shí)例講解

6.抓取更多數(shù)據(jù)

目前只抓取了第一頁(yè)的數(shù)據(jù),而我們希望能獲取所有的數(shù)據(jù),所以需要找到下一頁(yè)的地址,并讓爬蟲進(jìn)入其中繼續(xù)抓取
scrapy簡(jiǎn)單入門及實(shí)例講解
scrapy簡(jiǎn)單入門及實(shí)例講解

所以,我們需要對(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ù)
scrapy簡(jiǎn)單入門及實(shí)例講解

向AI問一下細(xì)節(jié)

免責(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)容。

AI