কীভাবে কোনও স্ক্রিপি স্পাইডারে কোনও ব্যবহারকারী নির্ধারিত যুক্তিটি পাস করবেন


102

আমি কোনও ব্যবহারকারীর সংজ্ঞায়িত যুক্তিটি কোনও স্ক্রাপির মাকড়সার কাছে পৌঁছে দেওয়ার চেষ্টা করছি। কেউ কীভাবে এটি করার পরামর্শ দিতে পারে?

আমি -aকোথাও একটি প্যারামিটার সম্পর্কে পড়েছি তবে কীভাবে এটি ব্যবহার করতে হবে তার কোনও ধারণা নেই।

উত্তর:


192

crawlকমান্ডটিতে -aঅপশনটি ব্যবহার করে স্পাইডার আর্গুমেন্টগুলি পাস করা হয় । উদাহরণ স্বরূপ:

scrapy crawl myspider -a category=electronics -a domain=system

মাকড়সা গুণাবলী হিসাবে যুক্তি অ্যাক্সেস করতে পারেন:

class MySpider(scrapy.Spider):
    name = 'myspider'

    def __init__(self, category='', **kwargs):
        self.start_urls = [f'http://www.example.com/{category}']  # py36
        super().__init__(**kwargs)  # python3

    def parse(self, response)
        self.log(self.domain)  # system

স্কেরাপি ডক থেকে নেওয়া: http://doc.scrap.org/en/latest/topics/spider.html#spider-arguments

আপডেট 2013 : দ্বিতীয় যুক্তি যুক্ত করুন

আপডেট 2015 : শব্দটি সামঞ্জস্য করুন

আপডেট 2016 : নতুন বেস ক্লাসটি ব্যবহার করুন এবং সুপার যোগ করুন, ধন্যবাদ @ বিরলা

আপডেট 2017 : পাইথন 3 সুপার ব্যবহার করুন

# previously
super(MySpider, self).__init__(**kwargs)  # python2

আপডেট 2018 : যেমন @eLRuLL উল্লেখ করেছে , মাকড়সাগুলি বৈশিষ্ট্য হিসাবে যুক্তিগুলি অ্যাক্সেস করতে পারে


4
স্কেরাপি ক্রল মাইস্পাইডার -a বিভাগ = ইলেকট্রনিক্স -a ডোমেন = সিস্টেম
স্টিভেন অ্যালারমথ

4
উপরের কোডটি কেবলমাত্র আমার জন্য কাজ করছে। যেমন যেমন যদি আমি ব্যবহার করে ডোমেনটি সংজ্ঞায়িত self.domainকরি তবে আমি এখনও __init__পদ্ধতির বাইরে এটি অ্যাক্সেস করতে পারছি না । পাইথন একটি সংজ্ঞায়িত ত্রুটি নিক্ষেপ করে। বিটিডাব্লু, আপনি superকলটি বাদ দিয়েছেন কেন ? পুনশ্চ. আমি ক্রলস্পাইডার শ্রেণিতে কাজ করছি
বিরলা

4
@ ফ্লাইংআটম দয়া করে আমাকে ভুল বুঝে থাকলে আমাকে সংশোধন করুন, তবে এই প্রতিটি সংকেত কলটি মাকড়সার বিভিন্ন উদাহরণ হবে, তাই না?
এল Lawliet

4
@ বিড়লা, ক্লাস স্কোপ ভেরিয়েবলটি স্থাপন করতে কনস্ট্রাক্টরে সেল.ডোমেন = ডোমেন ব্যবহার করুন।
হাসান রাজা

4
@nealmcb মাকড়সা শ্রেণীর __init__একটি পদ্ধতি । এর প্রয়োগটি মাকড়সাটিকে কোনও কম শক্তিশালী করে না এবং আপনি কীওয়ার্ড আর্গুমেন্টগুলির জন্য ডিফল্ট ঘোষণা করতে পারেন তবে আপনি যেমন বলেছিলেন এটি optionচ্ছিক বলে এটির উত্তরের অন্তর্ভুক্ত রয়েছে। গত বছর আমরা যেভাবে উল্লেখ করেছি যে আপনি ব্যবহার করার দরকার নেই আপনি getattrকেবল গুণাবলী হিসাবে যুক্তি অ্যাক্সেস করতে পারেন, যেমন self.categoryবা আমরা self.domain
উত্তরটিতে

34

পূর্ববর্তী উত্তরগুলি সঠিক ছিল, তবে __init__প্রতিবার কোনও স্ক্রাপির স্পাইডার কোড করতে চাইলে আপনাকে কনস্ট্রাক্টর ( ) ঘোষণা করতে হবে না , আপনি ঠিক আগের মতো প্যারামিটারগুলি নির্দিষ্ট করতে পারবেন:

scrapy crawl myspider -a parameter1=value1 -a parameter2=value2

এবং আপনার মাকড়সার কোডে আপনি এগুলি কেবল মাকড়সা যুক্তি হিসাবে ব্যবহার করতে পারেন:

class MySpider(Spider):
    name = 'myspider'
    ...
    def parse(self, response):
        ...
        if self.parameter1 == value1:
            # this is True

        # or also
        if getattr(self, parameter2) == value2:
            # this is also True

এবং এটা ঠিক কাজ করে।


4
সত্য। অজগরটির অন্ধকার দিকটি প্রবেশ করান।
বার্নি

14

ক্রল কমান্ডের সাথে যুক্তিগুলি পাস করার জন্য

স্কেরাপি ক্রল মাইস্পাইডার -a বিভাগ = 'মাইক্যাটোগ্রাফি' -a ডোমেন = 'উদাহরণ.com'

Scrapyd চালানোর প্রতিস্থাপন আর্গুমেন্ট প্রেরণ করার জন্য -a সঙ্গে -d

কার্ল http://your.ip.address.here:port/schedule.json -d মাকড়সা = myspider -d বিভাগ = 'মাইকিগ্রাফি' -ড ডোমেন = 'উদাহরণ.com'

মাকড়সা এর নির্মাতায় আর্গুমেন্ট গ্রহণ করবে।


class MySpider(Spider):
    name="myspider"
    def __init__(self,category='',domain='', *args,**kwargs):
        super(MySpider, self).__init__(*args, **kwargs)
        self.category = category
        self.domain = domain

স্কেরাপি সমস্ত আর্গুমেন্টকে মাকড়সা বৈশিষ্ট্য হিসাবে রাখে এবং আপনি init পদ্ধতিটি পুরোপুরি এড়িয়ে যেতে পারেন । সাবধান ব্যবহার getattr তাই আপনার কোড ভাঙে না সেই বৈশিষ্ট্যাবলী পাবার জন্য পদ্ধতি।


class MySpider(Spider):
    name="myspider"
    start_urls = ('https://httpbin.org/ip',)

    def parse(self,response):
        print getattr(self,'category','')
        print getattr(self,'domain','')


সুচিন্ত, দৃust় এবং নমনীয়!
nealmcb

8

-A বিকল্পটি ব্যবহার করে ক্রল কমান্ড চালানোর সময় স্পাইডার আর্গুমেন্টগুলি পাস করা হয়। উদাহরণস্বরূপ যদি আমি আমার স্পাইডারের কাছে যুক্তি হিসাবে কোনও ডোমেন নামটি পাস করতে চাই তবে আমি এটি করব-

স্কেরাপি ক্রল মাইস্পাইডার -a ডোমেন = "http://www.example.com"

এবং মাকড়সার নির্মাতাদের মধ্যে যুক্তি গ্রহণ করুন:

class MySpider(BaseSpider):
    name = 'myspider'
    def __init__(self, domain='', *args, **kwargs):
        super(MySpider, self).__init__(*args, **kwargs)
        self.start_urls = [domain]
        #

...

এটি কাজ করবে :)


0

বিকল্পভাবে আমরা স্ক্র্যাপিডি ব্যবহার করতে পারি যা এমন একটি API প্রকাশ করে যেখানে আমরা স্টার্ট_আরল এবং মাকড়সার নামটি পাস করতে পারি। স্ক্র্যাপিডি বন্ধ করতে / স্টার্ট / স্ট্যাটাস / মাকড়সার তালিকা তৈরি করতে এপিআই রয়েছে।

pip install scrapyd scrapyd-deploy
scrapyd
scrapyd-deploy local -p default

scrapyd-deployডিমের আকারে মাকড়সাটিকে ডিম আকারে স্থাপন করবে এবং এটি মাকড়সার সংস্করণ বজায় রাখবে। মাকড়সা শুরু করার সময় আপনি মাকড়সার কোন সংস্করণ ব্যবহার করবেন তা উল্লেখ করতে পারেন।

class MySpider(CrawlSpider):

    def __init__(self, start_urls, *args, **kwargs):
        self.start_urls = start_urls.split('|')
        super().__init__(*args, **kwargs)
    name = testspider

curl http://localhost:6800/schedule.json -d project=default -d spider=testspider -d start_urls="https://www.anyurl...|https://www.anyurl2"

যুক্ত সুবিধাটি হ'ল ব্যবহারকারীর কাছ থেকে ইউআরএল এবং অন্যান্য প্যারাম গ্রহণ করতে আপনি নিজের ইউআই তৈরি করতে পারেন এবং উপরোক্ত স্ক্রাইডিড শিডিউল এপিআই ব্যবহার করে কোনও কার্য নির্ধারণ করতে পারেন

পড়ুন scrapyd এপিআই ডকুমেন্টেশন আরো বিস্তারিত জানার জন্য

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.