আমি কোনও ব্যবহারকারীর সংজ্ঞায়িত যুক্তিটি কোনও স্ক্রাপির মাকড়সার কাছে পৌঁছে দেওয়ার চেষ্টা করছি। কেউ কীভাবে এটি করার পরামর্শ দিতে পারে?
আমি -aকোথাও একটি প্যারামিটার সম্পর্কে পড়েছি তবে কীভাবে এটি ব্যবহার করতে হবে তার কোনও ধারণা নেই।
আমি কোনও ব্যবহারকারীর সংজ্ঞায়িত যুক্তিটি কোনও স্ক্রাপির মাকড়সার কাছে পৌঁছে দেওয়ার চেষ্টা করছি। কেউ কীভাবে এটি করার পরামর্শ দিতে পারে?
আমি -aকোথাও একটি প্যারামিটার সম্পর্কে পড়েছি তবে কীভাবে এটি ব্যবহার করতে হবে তার কোনও ধারণা নেই।
উত্তর:
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 উল্লেখ করেছে , মাকড়সাগুলি বৈশিষ্ট্য হিসাবে যুক্তিগুলি অ্যাক্সেস করতে পারে
self.domainকরি তবে আমি এখনও __init__পদ্ধতির বাইরে এটি অ্যাক্সেস করতে পারছি না । পাইথন একটি সংজ্ঞায়িত ত্রুটি নিক্ষেপ করে। বিটিডাব্লু, আপনি superকলটি বাদ দিয়েছেন কেন ? পুনশ্চ. আমি ক্রলস্পাইডার শ্রেণিতে কাজ করছি
__init__একটি পদ্ধতি । এর প্রয়োগটি মাকড়সাটিকে কোনও কম শক্তিশালী করে না এবং আপনি কীওয়ার্ড আর্গুমেন্টগুলির জন্য ডিফল্ট ঘোষণা করতে পারেন তবে আপনি যেমন বলেছিলেন এটি optionচ্ছিক বলে এটির উত্তরের অন্তর্ভুক্ত রয়েছে। গত বছর আমরা যেভাবে উল্লেখ করেছি যে আপনি ব্যবহার করার দরকার নেই আপনি getattrকেবল গুণাবলী হিসাবে যুক্তি অ্যাক্সেস করতে পারেন, যেমন self.categoryবা আমরা self.domain
পূর্ববর্তী উত্তরগুলি সঠিক ছিল, তবে __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
এবং এটা ঠিক কাজ করে।
ক্রল কমান্ডের সাথে যুক্তিগুলি পাস করার জন্য
স্কেরাপি ক্রল মাইস্পাইডার -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','')
-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]
#
...
এটি কাজ করবে :)
বিকল্পভাবে আমরা স্ক্র্যাপিডি ব্যবহার করতে পারি যা এমন একটি 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 এপিআই ডকুমেন্টেশন আরো বিস্তারিত জানার জন্য