Rumah >pembangunan bahagian belakang >Tutorial Python >Gunakan rangka kerja Scrapy untuk merangkak pustaka imej Flickr

Gunakan rangka kerja Scrapy untuk merangkak pustaka imej Flickr

WBOY
WBOYasal
2023-06-22 11:02:07803semak imbas

Dalam era teknologi maklumat hari ini, merangkak data besar-besaran telah menjadi kemahiran penting. Dengan perkembangan pesat teknologi data besar, teknologi merangkak data sentiasa dikemas kini dan dipertingkatkan. Antaranya, rangka kerja Scrapy sudah pasti rangka kerja yang paling biasa digunakan dan popular. Ia mempunyai kelebihan dan fleksibiliti unik dalam rangkak dan pemprosesan data.

Artikel ini akan memperkenalkan cara menggunakan rangka kerja Scrapy untuk merangkak pustaka imej Flickr. Flickr ialah tapak web perkongsian gambar dengan ratusan juta gambar dalam inventorinya dan jumlah sumber data yang sangat besar. Melalui penggunaan rangka kerja Scrapy, kami boleh mendapatkan sumber data ini dengan mudah, menjalankan penyelidikan dan analisis, atau menggunakannya untuk membina model aplikasi, supaya dapat memanfaatkan kuasa data besar dengan lebih baik.

1. Pengenalan kepada rangka kerja Scrapy

Scrapy ialah rangka kerja perangkak web sumber terbuka berdasarkan bahasa Python. Ia memerlukan "kecekapan" dan "kebolehselenggaraan" sebagai konsep reka bentuknya dan melaksanakan rangka kerja perangkak yang komprehensif, yang lebih sesuai untuk merangkak dan memproses data berskala besar. Bahagian teras rangka kerja Scrapy termasuk modul fungsi utama berikut:

  • Enjin: Bertanggungjawab untuk memproses aliran data keseluruhan sistem dan mengawal interaksi dan pemindahan data antara pelbagai komponen.
  • Penjadual: Bertanggungjawab untuk mengisih permintaan yang dikeluarkan oleh enjin dan menghantarnya kepada Pemuat Turun.
  • Pemuat turun: Bertanggungjawab memuat turun kandungan web, memproses kandungan yang dikembalikan oleh halaman web, dan kemudian menyerahkannya kepada enjin.
  • Parser (Spider): Bertanggungjawab untuk menghuraikan halaman web yang dimuat turun oleh pemuat turun, mengekstrak data yang dikehendaki dan menyusunnya menjadi data berstruktur.
  • Saluran Paip: Bertanggungjawab untuk pemprosesan data yang diproses seterusnya, seperti menyimpan ke pangkalan data atau fail, dsb.

2. Dapatkan Kunci API Flickr

Sebelum merangkak data, kami perlu memohon Kunci API Flickr untuk mendapatkan kebenaran mengakses pangkalan data Flickr. Dalam tapak web pembangun Flickr (https://www.flickr.com/services/api/misc.api_keys.html), kami boleh mendapatkan API KEY dengan mendaftar. Langkah-langkah aplikasi khusus adalah seperti berikut:

① Pertama, kita perlu memasukkan https://www.flickr.com/services/apps/create/apply/ URL untuk memohon API KEY.

②Selepas memasuki laman web ini, kita perlu log masuk. Jika kita tidak mempunyai akaun, kita perlu mendaftarkannya sendiri.

③Selepas log masuk, anda perlu mengisi dan menyerahkan borang permohonan Flickr. Dalam borang, anda perlu mengisi dua aspek maklumat:

  • Nama permohonan kecil
  • Penerangan tentang tujuan "bukan komersial"

④Selepas melengkapkan borang permohonan, sistem akan menjana API KUNCI dan RAHSIA. Kita perlu menyimpan dua maklumat ini untuk kegunaan kemudian.

3. Pelaksanaan mengikis perpustakaan imej Flickr dengan rangka kerja Scrapy

Seterusnya, kami akan memperkenalkan cara menggunakan rangka kerja Scrapy untuk merangkak data perpustakaan imej Flickr.

1. Tulis perangkak Scrapy

Pertama, kita perlu mencipta projek Scrapy baharu dan mencipta fail perangkak dalam projek. Dalam fail perangkak, kami perlu menetapkan maklumat asas pangkalan data API Flickr dan lokasi penyimpanan data:

import time
import json
import scrapy
from flickr.items import FlickrItem

class FlickrSpider(scrapy.Spider):
    name = 'flickr'
    api_key = 'YOUR_API_KEY'  # 这里填写你自己的API Key
    tags = 'cat,dog'  # 这里将cat和dog作为爬取的关键词,你可以自由定义
    format = 'json'
    nojsoncallback = '1'
    page = '1'
    per_page = '50'

    start_urls = [
        'https://api.flickr.com/services/rest/?method=flickr.photos.search&'
        'api_key={}'
        '&tags={}'
        '&page={}'
        '&per_page={}'
        '&format={}'
        '&nojsoncallback={}'.format(api_key, tags, page, per_page, format, nojsoncallback)
    ]

    def parse(self, response):
        results = json.loads(response.body_as_unicode())
        for photo in results['photos']['photo']:
            item = FlickrItem()
            item['image_title'] = photo['title']
            item['image_url'] = 'https://farm{}.staticflickr.com/{}/{}_{}.jpg'.format(
                photo['farm'], photo['server'], photo['id'], photo['secret'])
            yield item

        if int(self.page) <= results['photos']['pages']:
            self.page = str(int(self.page) + 1)
            next_page_url = 'https://api.flickr.com/services/rest/?method=flickr.photos.search&' 
                            'api_key={}' 
                            '&tags={}' 
                            '&page={}' 
                            '&per_page={}' 
                            '&format={}' 
                            '&nojsoncallback={}'.format(self.api_key, self.tags, self.page, self.per_page, self.format, self.nojsoncallback)
            time.sleep(1)  # 设置延时1秒钟
            yield scrapy.Request(url=next_page_url, callback=self.parse)

Dalam fail perangkak, kami menetapkan kata kunci "kucing" dan "anjing" bagi Pustaka imej Flickr , dan kemudian tetapkan parameter perubahan halaman dan tetapkan format kepada json. Kami mengekstrak dan memproses maklumat setiap imej dalam fungsi parse dan mengembalikannya menggunakan hasil.

Seterusnya, kita perlu mentakrifkan lokasi storan dan format data, dan menetapkannya dalam tetapan.py:

ITEM_PIPELINES = {
   'flickr.pipelines.FlickrPipeline': 300,
}

IMAGES_STORE = 'images'

2 Write Item Pipeline

Seterusnya, kita perlu menulis Talian Paip Item untuk memproses dan menyimpan data imej yang dikumpul:

import scrapy
from scrapy.pipelines.images import ImagesPipeline
from scrapy.exceptions import DropItem

class FlickrPipeline(object):
    def process_item(self, item, spider):
        return item

class FlickrImagesPipeline(ImagesPipeline):
    def get_media_requests(self, item, info):
        for image_url in item['image_url']:
            try:
                yield scrapy.Request(image_url)
            except Exception as e:
                pass

    def item_completed(self, results, item, info):
        image_paths = [x['path'] for ok, x in results if ok]
        if not image_paths:
            raise DropItem("Item contains no images")
        item['image_paths'] = image_paths
        return item

3 Jalankan program

Apabila kami melengkapkan perkara di atas Selepas menulis kod, anda boleh menjalankan rangka kerja Scrapy untuk melaksanakan operasi merangkak data. Kita perlu memasukkan arahan berikut dalam baris arahan:

scrapy crawl flickr

Selepas program mula berjalan, perangkak akan merangkak imej "kucing" dan "anjing" dalam pangkalan data Flickr dan menyimpan imej dalam yang ditentukan tengah lokasi penyimpanan.

4. Ringkasan

Melalui pengenalan artikel ini, kami telah mempelajari secara terperinci cara menggunakan rangka kerja Scrapy untuk merangkak pustaka imej Flickr. Dalam aplikasi sebenar, kita boleh mengubah suai kata kunci, bilangan halaman, atau laluan storan imej mengikut keperluan kita sendiri. Tidak kira dari aspek mana, rangka kerja Scrapy ialah rangka kerja perangkak yang matang dan kaya dengan ciri Fungsinya yang sentiasa dikemas kini dan kebolehskalaan fleksibel memberikan sokongan kuat untuk kerja rangkak data kami.

Atas ialah kandungan terperinci Gunakan rangka kerja Scrapy untuk merangkak pustaka imej Flickr. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn