亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

scrapy簡單入門及實例講解

發布時間:2020-07-05 09:13:03 來源:網絡 閱讀:2291 作者:智源學院 欄目:編程語言

爬蟲是python最常見的一類應用,但是如何自己動手來寫一個爬蟲,這可能是很多人關心的問題,這次準備用30分鐘來教會大家如何自己動手編寫一個Scrapy爬蟲的應用

推薦一個不錯的Scrapy視頻教程給大家,可以直接點擊觀看:https://www.bilibili.com/video/av27042686/


一、理解爬蟲原理

首先,我們需要理解爬蟲的原理,只是拿一個庫來用誰都會,但理解它的原理才對大家有好處
scrapy簡單入門及實例講解

通過上圖我們可以對爬蟲的工作原理(不僅限于Scrapy框架)有一個認識:

  • 數據源:需要知道從哪里拿到你要的數據,可以是Web,也可以是App或其他應用
  • 下載器(Download):需要將數據下載到本機才能進行分析工作,而在下載中我們需要關注幾件事:性能、模擬操作和分布式等
  • 分析器(Parser):對已下載的數據進行分析,有很多種,比如HTML、正則、json等,當然,在分析的過程中,也能發現更多的鏈接,從而生成更多采集任務
  • 數據存儲(Storage):可以將數據保存在數據或磁盤上,以供后續產品的調取、分析等

既然理解了爬蟲的原理,我們可以更進一步的認識一下Scrapy框架

二、認識Scrapy框架

Scrapy是Python中很成熟、很常用的一個框架,大部分Python爬蟲都是由Scrapy來編寫的,那么,為了理解Scrapy的基本結構,我們先來看一張圖:
scrapy簡單入門及實例講解

其實,這張圖和我們之前說的爬蟲原理是一一對應的,我們來看看:

  • 下載器(Downloader):將數據下載回來,以供分析
  • 爬蟲(Spider):這個其實是用于分析的(Parser),用于對下載的數據進行分析
  • 調度器(Scheduler):負責調度任務
  • 數據管道(Pipeline):負責把數據導出給其他程序、文件、數據庫

三、認識Scrapy項目

當然,只是了解上述內容其實意義不大,我們來通過動手做一個例子理解Scrapy

1.搭建初識項目環境

在正式開始編寫爬蟲之前,我們需要先來創建一個項目

$> scrapy startproject 項目名稱

scrapy簡單入門及實例講解

2.認識項目目錄

先來了解一下剛剛創建好的目錄里面都有什么
scrapy簡單入門及實例講解

在這里面,其實只有兩個東西是我們目前需要關心的:

  • spiders目錄:編寫的所有爬蟲類,都會放在這里
  • settings.py:Scrapy框架提供的所有設置,都會通過這個文件來修改

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

本文我們先關心最基本的功能,所以不會過于深入Scrapy的細節,所以只對中間件和items的功能做一簡單敘述,在其他文章中再詳細說明:

  • 中間件:由于各類數據源其實有很多差異,所以middlewares用于屏蔽這種差異,以便于統一處理
  • items:對項目中所有數據進行統一化,生成統一的結構化數據,從而實現程序(爬蟲和其他程序)的標準化

四、抓取案例

本案例中,我們準備抓取一個拍賣手機號的網站:http://www.jihaoba.com/escrow/
scrapy簡單入門及實例講解

1.創建spider

在剛剛創建好的項目中,我們再創建一個文件:phone_spider.py
scrapy簡單入門及實例講解

2.編寫Spider類

import scrapy

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

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

    def parse(self, response):
        pass

在這里我們主要關心幾件事:

  • name:spider的名字,用于啟動抓取(后面會說)
  • start_urls:起始抓取地址,后續任務可能產生更多url,但start_urls是入口
  • parse方法:默認的解析回調方法,當下載完成后會自動調用

3.啟動抓取

盡管現在還沒有實際的工作,但我們可以試著啟動爬蟲的抓取

scrapy crawl phone

scrapy簡單入門及實例講解

我們可以看到爬蟲的抓取能夠正常啟動

4.為爬蟲添加功能

我們可以繼續為爬蟲加入實際的功能

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)

這里我們用了一個非常重要的東西——xpath,xpath是一種用于從XML和HTML中提取數據的查詢語言,在這里不做贅述,想了解更多xpath的內容請點擊https://www.bilibili.com/video/av30320885

再次啟動抓取,我們會看到一些有用的數據產生了
scrapy簡單入門及實例講解

5.爬蟲數據導出

當然,我們現在只是把print出來,這肯定不行,需要把數據保存到文件中,以便后續使用
所以,將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
            }

再次運行,并且需要修改運行命令,添加輸出選項

scrapy crawl phone

改為

scrapy crawl phone -o data.json

我們可以看到,運行后目錄中會多出一個data.json,打開后就是我們要的結果數據
scrapy簡單入門及實例講解
scrapy簡單入門及實例講解

注意,這里導出的價格中,有的帶有“\u4e07”,這其實是中文“萬”的unicode碼,并不影響數據使用
scrapy簡單入門及實例講解

6.抓取更多數據

目前只抓取了第一頁的數據,而我們希望能獲取所有的數據,所以需要找到下一頁的地址,并讓爬蟲進入其中繼續抓取
scrapy簡單入門及實例講解
scrapy簡單入門及實例講解

所以,我們需要對代碼進行修改

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
            }

        #繼續抓取下一頁
        next="http://www.jihaoba.com"+response.xpath('//a[@class="m-pages-next"]/@href').extract_first()
        yield scrapy.Request(next)

我們再次啟動爬蟲

scrapy crawl phone -o data.json

這次,我們會得到比之前多的數據
scrapy簡單入門及實例講解

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

宜兴市| 北安市| 彭泽县| 于田县| 天津市| 偏关县| 通辽市| 合江县| 获嘉县| 鄂托克旗| 定边县| 郁南县| 库伦旗| 海原县| 饶平县| 焉耆| 额敏县| 金乡县| 冷水江市| 五峰| 买车| 洮南市| 卫辉市| 麻城市| 西林县| 普洱| 开远市| 永靖县| 呼图壁县| 灵台县| 临沧市| 天门市| 镇安县| 湄潭县| 松溪县| 方正县| 三穗县| 嘉善县| 疏勒县| 怀安县| 舞阳县|