Բարև, ես աշխատում եմ GAN ցանցի վրա, որը ստեղծում է պատկերներ NES ոճով: Բայց նախ, ես պետք է պատրաստեմ տվյալների բազա: Ես գտա http://www.vgmuseum.com/ կայքը, որը պարունակում է բազմաթիվ նկարներ NES-ի համար (~10000): Այդ իսկ պատճառով ես ստեղծում եմ սցենար՝ այդ պատկերները ջնջելու համար: Սկսելու համար ես պետք է տեղադրեմ քերծվածք և բարձ:

pip install scrapy
pip install pillow

Երբ scrapy-ը տեղադրվի՝ նախագիծ ստեղծելու համար:

scrapy.exe startproject vgmuseum
cd vgmuseum
scrapy genspider nes www.vgmuseum.com

Հրամանի կատարումից հետո կստեղծվի գրացուցակի կառուցվածքը:

Նախքան կոդի քերծվածքը գրելը պետք է կազմաձևել նկարները ներբեռնելու համար: Բացեք settings.py-ը և ավելացրեք IMAGES_STORE փոփոխականներ՝ ուղիով դեպի այն թղթապանակը, որտեղ ցանկանում եք պահել նկարները և միացնել ImagesPipeline՝ ավելացնելով կամ խմբագրելով ITEM_PIPELINES:

ITEM_PIPELINES = {"scrapy.pipelines.images.ImagesPipeline": 1}
IMAGES_STORE = "images"

Այնուհետև բացեք items.py: Այստեղ ես կստեղծեմ երկու դաշտային պատկեր, իսկ image_url սա ֆայլ է, որտեղ ես կպահեմ պատկերների մասին տեղեկությունները: Դաշտը պետք է ունենա անունների պատկերներ և image_url: Սա պահանջվում է ImagesPipeline-ի կողմից, սակայն այն կարող է փոխվել settings.py-ում:

# -*- coding: utf-8 -*-
# Define here the models for your scraped items
#
# See documentation in:
# https://doc.scrapy.org/en/latest/topics/items.html
import scrapy

class VgmuseumItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    images = scrapy.Field()
    image_urls = scrapy.Field()

Վերջապես, ես պատրաստ եմ ստեղծել spider open spider թղթապանակ և այնուհետև nes.py: Սկսեք ներմուծումից:
Ներմուծեք scrapy, scrapy հարցում և տարր VgmuseumItem դաս, որը ստեղծվել է տարրերի ֆայլում:

import scrapy
from scrapy.http import Request
from vgmuseum.items import VgmuseumItem

NesSpider դասի սկզբում ես պետք է նշեմ անունը, թույլատրված տիրույթները և սկզբնական URL-ները:

class NesSpider(scrapy.Spider):
    name = "nes"
    allowed_domains = ["www.vgmuseum.com"]
    start_urls = ["http://www.vgmuseum.com/nes_b.html"]

Այնուհետև ես պետք է ստեղծեմ վերլուծության մեթոդ: Երբ ես հաջորդ անգամ գործարկեմ spider-ը, այն կսկսվի վերլուծության մեթոդից: Վերլուծության մեթոդն ունի երկու արգումենտ ինքն ու պատասխան:

Այսպիսի տեսք ունի կայքը. Օգտագործելով XPath շարահյուսությունը, ես պետք է բեռնեմ բոլոր URL-ները այս էջից և այնուհետև ներբեռնեմ բոլոր պատկերները հատուկ url-ից: Բացի այդ, կա Վերադառնալ վերև, որը պետք է անտեսվի:

def parse(self, response):
    game_urls = response.xpath("//ol/li/a/@href").extract()
    for url in game_urls:
        if url != "#top":
            yield Request(
                response.urljoin(url), callback=self.parse_images
            )

game_urls պարունակում է էջի բոլոր url-ների ցանկը: Այնուհետև ես մի օղակ եմ բոլոր URL-ների միջով, զտում եմ բոլոր #վերևի URL-ները և կանչում եմ վերլուծության_պատկերների մեթոդը:
Սա խաղի էջի օրինակ է.

Այստեղ ես պետք է ստանամ պատկերի անուն և ձևավորեմ պատկերի URL: Այնուհետև ավելացրեք URL-ները ցուցակին և նշանակեք այս ցուցակը image_urls դաշտին VgmuseumItem դասից:

def parse_images(self, response):
    item = VgmuseumItem()
    image_urls = []
    image_name = response.xpath("//center/img/@src").extract()
    for name in image_name:
        image_urls.append(f"{response.url.rsplit('/', 1)[0]}/{name}")
    item["image_urls"] = image_urls
    yield item

Ստեղծեք VgmuseumItem դասի օրինակ, ստացեք բոլոր պատկերների անունները էջից, ձևավորեք url և ավելացրեք image_urls ցուցակին: image_urls-ը VgmuseumItem-ից դաշտին տալով և վերադարձնել այն: Ահա և վերջ։ Հիմա ես պատրաստ եմ մահապատժի ենթարկել սարդին։ Համոզվեք, որ դուք գտնվում եք vgmuseum թղթապանակում և կատարեք:

scrapy crawl nes

Պատկերների թղթապանակը ավտոմատ կերպով կստեղծվի, և նկարները կսկսեն հայտնվել այնտեղ: Բացի այդ, լավ գաղափար է settings.py-ում ավելացնել DOWNLOAD_DELAY փոփոխական: Սա կարող է խանգարել ձեզ արգելք ստանալ կայքում:

Սկզբնապես հրապարակվել է https://makspostument.com-ում 2019 թվականի հուլիսի 2-ին: