অ্যাজেএক্স ব্যবহার করা ওয়েবসাইটগুলি থেকে গতিশীল সামগ্রীগুলি স্ক্র্যাপ করতে স্কেরাপির ব্যবহার করা যেতে পারে?


145

আমি সম্প্রতি পাইথন শিখছি এবং একটি ওয়েব-স্ক্র্যাপার তৈরিতে আমার হাত ডুবিয়ে দিচ্ছি। এটা মোটেই অভিনব কিছু নয়; এর একমাত্র উদ্দেশ্য হ'ল কোনও পণ ওয়েবসাইট থেকে ডেটা বন্ধ করা এবং এই ডেটাটি এক্সেলে রাখা।

বেশিরভাগ সমস্যা সমাধানযোগ্য এবং আমার চারপাশে খুব ভাল গণ্ডগোল হচ্ছে। তবে আমি একটি ইস্যুতে একটি বিশাল বাধা পেয়েছি। কোনও সাইট যদি ঘোড়ার একটি টেবিল লোড করে এবং বর্তমান বাজি দামগুলি তালিকা করে তবে এই তথ্য কোনও উত্স ফাইলে নেই। ক্লুটি হ'ল এই ডেটা কখনও কখনও লাইভ হয়, কিছু দূরবর্তী সার্ভার থেকে সংখ্যাগুলি স্পষ্টতই আপডেট হয়। আমার পিসির এইচটিএমএলটিতে কেবল একটি গর্ত রয়েছে যেখানে তাদের সার্ভারগুলি আমার প্রয়োজনীয় সমস্ত আকর্ষণীয় ডেটা দিয়ে চাপ দিচ্ছে।

ডায়নামিক ওয়েব সামগ্রীর সাথে আমার অভিজ্ঞতা এখন কম, সুতরাং এই জিনিসটি এমন কিছু যা আমার মাথা ঘিরে ধরে having

আমি মনে করি জাভা বা জাভাস্ক্রিপ্ট একটি কী, এটি প্রায়শই পপ আপ হয়।

স্ক্র্যাপারটি কেবল একটি বিজোড় তুলনা ইঞ্জিন। কিছু সাইটের এপিআই রয়েছে তবে তাদের জন্য আমার এটি দরকার। আমি পাইথন ২.7 দিয়ে স্কেরাপি গ্রন্থাগারটি ব্যবহার করছি

যদি এই প্রশ্নটি খুব উন্মুক্ত হয় তবে আমি ক্ষমা চাইছি। সংক্ষেপে, আমার প্রশ্ন: স্ক্রেরি কীভাবে এই গতিশীল ডেটা স্ক্র্যাপ করতে ব্যবহার করা যায় যাতে আমি এটি ব্যবহার করতে পারি? যাতে আমি রিয়েল-টাইমে এই পণের প্রতিকূলতার ডেটা স্ক্র্যাপ করতে পারি?


1
আমি এই ডেটা, গতিশীল এবং লাইভ যে ডেটা পেতে পারি?
জোসেফ

1
আপনার পেজটিকে জাভাস্ক্রিপ্ট-থাকে, তাহলে এই চেষ্টা
reclosedev

3
কিছু Firefoxএক্সটেনশান ব্যবহার করে দেখুন httpFoxবা liveHttpHeadersএমন একটি পৃষ্ঠা লোড করুন যা এজ্যাক্স অনুরোধ ব্যবহার করছে। স্কেরাপি স্বয়ংক্রিয়ভাবে এজাক্স অনুরোধগুলি সনাক্ত করে না, আপনাকে যথাযথ এজাক্স ইউআরএলটি ম্যানুয়ালি অনুসন্ধান করতে হবে এবং তারপরে অনুরোধ জানাতে হবে।
আমির আদনান

চিয়ার্স, আমি ফায়ারফক্স এক্সটেনশানগুলিকে উইজেড দেব
জোসেফ

বেশ কয়েকটি ওপেন সোর্স সমাধান রয়েছে। তবে আপনি যদি বিশেষত বড় কাজের চাপের জন্য এটি করার সহজ এবং দ্রুত উপায়ের সন্ধান করেন তবে স্ন্যাপ সন্ধান ( স্ন্যাপ সন্ধান.আইও ) দেখুন। এটি জেএস, এইচটিএমএল 5 এবং এসপিএ সাইটের জন্য অনুসন্ধান ইঞ্জিনের ক্রল্যাবিলিটি প্রয়োজন for ডেমোটি ব্যবহার করে দেখুন (যদি খালি সামগ্রী থাকে তবে এর অর্থ সাইটটি আসলে কোনও দেহের সামগ্রী সরবরাহ করবে না, সম্ভবত 301 টি পুনর্নির্দেশের অর্থ)।
সিএমসিডিগ্রাগনকাই

উত্তর:


74

ওয়েবকিট ভিত্তিক ব্রাউজারগুলি (যেমন গুগল ক্রোম বা সাফারি) এর অন্তর্নির্মিত বিকাশকারী সরঞ্জাম রয়েছে। Chrome এ আপনি এটি খুলতে পারেন Menu->Tools->Developer ToolsNetworkট্যাব আপনি প্রতি অনুরোধ এবং প্রতিক্রিয়া সম্পর্কে সব তথ্য দেখতে পারবেন:

এখানে চিত্র বর্ণনা লিখুন

ছবির নীচে আপনি দেখতে পাচ্ছেন যে আমি নিচে অনুরোধটি ফিল্টার করেছি XHR- এগুলি জাভাস্ক্রিপ্ট কোড দ্বারা করা অনুরোধগুলি।

টিপ: লগ সাফ হয়ে যায় আপনি যখনই কোনও পৃষ্ঠা লোড করবেন, ছবির নীচে কালো ডট বোতামটি লগ সংরক্ষণ করবে।

অনুরোধ এবং প্রতিক্রিয়াগুলি বিশ্লেষণ করার পরে আপনি আপনার ওয়েব ক্রলার থেকে এই অনুরোধগুলি অনুকরণ করতে এবং মূল্যবান ডেটা বের করতে পারেন। এইচটিএমএল পার্স করার চেয়ে অনেক ক্ষেত্রে আপনার ডেটা পাওয়া সহজ হবে, কারণ সেই ডেটাতে উপস্থাপনা যুক্তি নেই এবং জাভাস্ক্রিপ্ট কোড দ্বারা অ্যাক্সেস করার জন্য ফর্ম্যাট করা হয়েছে।

ফায়ারফক্সের একই রকম এক্সটেনশন রয়েছে, একে ফায়ারব্যাগ বলা হয় । কিছু তর্ক করবে যে ফায়ারব্যাগ আরও বেশি শক্তিশালী তবে আমি ওয়েবকিটের সরলতা পছন্দ করি।


141
এটিতে 'স্কেরাপি' শব্দটি না থাকলে কীভাবে হ্যাক এটি গ্রহণযোগ্য উত্তর হতে পারে ??
টুলকিট

এটি কাজ করে এবং পাইথনে জেসন মডিউল ব্যবহার করে পার্স করা সহজ। এটি একটি সমাধান! তার তুলনায়, সেলেনিয়াম বা অন্যান্য স্টাফ লোকেরা যে পরামর্শ দিচ্ছে ব্যবহার করার চেষ্টা করুন, এটি আরও মাথা ব্যাথা করছে। বিকল্প পদ্ধতিটি যদি আরও বিশৃঙ্খল হত তবে আমি এটি আপনাকে দিয়ে দিয়েছি, তবে এটি এখানে নয় @ টুলকিট
আরিয়ন_মাইলস

1
এটি আসলে প্রাসঙ্গিক নয়। প্রশ্নটি ছিল কীভাবে ডায়নামিক ওয়েব সাইটগুলি স্ক্র্যাপ করতে স্কার্পি ব্যবহার করবেন।
ই এরফান

"হ্যাক কীভাবে এটি একটি স্বীকৃত উত্তর হতে পারে" - কারণ ব্যবহারিক ব্যবহার রাজনৈতিক-নির্ভুলতার মারধর করে। মানুষ কন্টেক্সট বোঝে।
এস্প্রেসো

98

scrapyএকটি এজ্যাক্স অনুরোধ সহ একটি সাধারণ উদাহরণ এখানে । রুবিন-কাজান.রু সাইটটি দেখতে দিন ।

সমস্ত বার্তা একটি AJAX অনুরোধে লোড করা হয়। আমার লক্ষ্য হ'ল এই বার্তাগুলি তাদের সমস্ত বৈশিষ্ট্য (লেখক, তারিখ, ...) সহ নিয়ে আসা:

এখানে চিত্র বর্ণনা লিখুন

আমি যখন পৃষ্ঠার উত্স কোডটি বিশ্লেষণ করি তখন আমি এই সমস্ত বার্তাগুলি দেখতে পাচ্ছি না কারণ ওয়েব পৃষ্ঠাটি এজেএক্স প্রযুক্তি ব্যবহার করে। তবে ওয়েব পৃষ্ঠায় বার্তাগুলি উত্পন্ন করে এমন HTTP অনুরোধ বিশ্লেষণ করতে আমি মজিলা ফায়ারফক্স (বা অন্যান্য ব্রাউজারগুলির সমতুল্য সরঞ্জাম) এর ফায়ারব্যাগের সাহায্যে করতে পারি:

এখানে চিত্র বর্ণনা লিখুন

এটি পুরো পৃষ্ঠাটি পুনরায় লোড করে না তবে কেবলমাত্র পৃষ্ঠার অংশগুলিতে বার্তা রয়েছে। এই উদ্দেশ্যে আমি নীচে পৃষ্ঠার একটি স্বেচ্ছাসেবী সংখ্যা ক্লিক করুন:

এখানে চিত্র বর্ণনা লিখুন

এবং আমি এইচটিটিপি অনুরোধটি পর্যবেক্ষণ করি যা বার্তার বডিটির জন্য দায়ী:

এখানে চিত্র বর্ণনা লিখুন

সমাপ্তির পরে, আমি অনুরোধের শিরোনামগুলি বিশ্লেষণ করি (আমার অবশ্যই উদ্ধৃতি দিতে হবে যে এই URL টি আমি var বিভাগ থেকে উত্স পৃষ্ঠা থেকে বের করব, নীচের কোডটি দেখুন):

এখানে চিত্র বর্ণনা লিখুন

এবং অনুরোধের ফর্ম ডেটা সামগ্রী (HTTP পদ্ধতিটি "পোস্ট"):

এখানে চিত্র বর্ণনা লিখুন

এবং প্রতিক্রিয়ার সামগ্রী যা একটি JSON ফাইল:

এখানে চিত্র বর্ণনা লিখুন

যা আমি খুঁজছি সমস্ত তথ্য উপস্থাপন করে।

এখন থেকে, আমাকে অবশ্যই স্ক্রেরিতে এই সমস্ত জ্ঞানটি প্রয়োগ করতে হবে। আসুন এই উদ্দেশ্যে মাকড়সার সংজ্ঞা দিন:

class spider(BaseSpider):
    name = 'RubiGuesst'
    start_urls = ['http://www.rubin-kazan.ru/guestbook.html']

    def parse(self, response):
        url_list_gb_messages = re.search(r'url_list_gb_messages="(.*)"', response.body).group(1)
        yield FormRequest('http://www.rubin-kazan.ru' + url_list_gb_messages, callback=self.RubiGuessItem,
                          formdata={'page': str(page + 1), 'uid': ''})

    def RubiGuessItem(self, response):
        json_file = response.body

ইন parseফাংশন আমি প্রথম অনুরোধের জন্য প্রতিক্রিয়া আছে। ইন RubiGuessItemআমি সব তথ্য দিয়ে JSON ফাইল আছে।


6
ওহে. আপনি কি দয়া করে ব্যাখ্যা করতে পারেন যে 'url_list_gb_messages' কী? আমি এটা বুঝতে পারি না। ধন্যবাদ।
পোলারাইজ করুন

4
এটি অবশ্যই ভাল।
1a1a11a

1
@ পোলারাইজ এই কোডটি reমডিউলটি ব্যবহার করছে (নিয়মিত এক্সপ্রেশন), এটি স্ট্রিংটির সন্ধান করে 'url_list_gb_messages="(.*)"'এবং একই নামের ভেরিয়েবলের প্রথম বন্ধনীর বিষয়বস্তুকে পৃথক করে। এটি একটি দুর্দান্ত পরিচয়
এমজিপি

42

হামাগুড়ি দেওয়ার সময় আমরা যখন এমন সমস্যার মধ্যে চলে যাই যেখানে পৃষ্ঠায় রেন্ডার করা সামগ্রী জাভাস্ক্রিপ্টের সাহায্যে উত্পন্ন হয় এবং তাই স্কেরাপি এর জন্য ক্রল করতে অক্ষম হয় (যেমন, এজাক্স অনুরোধ, jQuery উন্মত্ততা)।

তবে, আপনি যদি ওয়েব টেস্টিং ফ্রেমওয়ার্ক সেলেনিয়ামের সাথে স্ক্র্যাপি ব্যবহার করেন তবে আমরা একটি সাধারণ ওয়েব ব্রাউজারে প্রদর্শিত যে কোনও কিছু ক্রল করতে সক্ষম।

কিছু বিষয় লক্ষণীয়:

  • এটি কাজ করার জন্য আপনার অবশ্যই সেলেনিয়াম আরসির পাইথন সংস্করণ ইনস্টল করা থাকতে হবে এবং আপনার অবশ্যই সেলেনিয়াম সঠিকভাবে সেট আপ করা উচিত। এছাড়াও এটি কেবল একটি টেম্পলেট ক্রলার। আপনি জিনিসগুলির সাথে আরও ক্রেজিয়ার এবং আরও উন্নত পেতে পারেন তবে আমি কেবল প্রাথমিক ধারণাটি দেখাতে চেয়েছিলাম। কোডটি এখন দাঁড়িয়ে হিসাবে আপনি যে কোনও ইউআরএল জন্য দুটি অনুরোধ করছেন doing একটি অনুরোধ স্কেরাপি দ্বারা এবং অন্যটি সেলেনিয়াম দ্বারা তৈরি করা হয়েছে। আমি নিশ্চিত যে এর আশেপাশের কয়েকটি উপায় রয়েছে যাতে আপনি সম্ভবত সেলেনিয়ামকে কেবল একটি করতে এবং কেবল অনুরোধ করতে পারেন তবে আমি এটি বাস্তবায়নের জন্য বিরক্ত করিনি এবং দুটি অনুরোধ করেও আপনি স্ক্র্যাপির মাধ্যমে পৃষ্ঠাটি ক্রল করতে পারেন।

  • এটি বেশ শক্তিশালী কারণ এখন ক্রল করার জন্য আপনার কাছে পুরো রেন্ডারডডম উপলব্ধ রয়েছে এবং আপনি এখনও স্ক্রাপির সমস্ত দুর্দান্ত ক্রলিং বৈশিষ্ট্য ব্যবহার করতে পারেন। এটি অবশ্যই ধীরে ধীরে ক্রলিংয়ের জন্য তৈরি করবে তবে আপনাকে রেন্ডারডোমটির কতটা প্রয়োজন তা নির্ভর করে এটি অপেক্ষা করার উপযুক্ত হতে পারে।

    from scrapy.contrib.spiders import CrawlSpider, Rule
    from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
    from scrapy.selector import HtmlXPathSelector
    from scrapy.http import Request
    
    from selenium import selenium
    
    class SeleniumSpider(CrawlSpider):
        name = "SeleniumSpider"
        start_urls = ["http://www.domain.com"]
    
        rules = (
            Rule(SgmlLinkExtractor(allow=('\.html', )), callback='parse_page',follow=True),
        )
    
        def __init__(self):
            CrawlSpider.__init__(self)
            self.verificationErrors = []
            self.selenium = selenium("localhost", 4444, "*chrome", "http://www.domain.com")
            self.selenium.start()
    
        def __del__(self):
            self.selenium.stop()
            print self.verificationErrors
            CrawlSpider.__del__(self)
    
        def parse_page(self, response):
            item = Item()
    
            hxs = HtmlXPathSelector(response)
            #Do some XPath selection with Scrapy
            hxs.select('//div').extract()
    
            sel = self.selenium
            sel.open(response.url)
    
            #Wait for javscript to load in Selenium
            time.sleep(2.5)
    
            #Do some crawling of javascript created content with Selenium
            sel.get_text("//div")
            yield item
    
    # Snippet imported from snippets.scrapy.org (which no longer works)
    # author: wynbennett
    # date  : Jun 21, 2011

তথ্যসূত্র: http://snipplr.com/view/66998/


ঝরঝরে সমাধান! আপনার এই স্ক্রিপ্টটি ফায়ারফক্সের সাথে সংযুক্ত করার কোনও পরামর্শ আছে? (ওএস লিনাক্স মিন্ট)। আমি "[এর্নো ১১১] সংযোগ প্রত্যাখ্যান করেছি"।
অ্যান্ড্রু

1
এই কোড আর জন্য কাজ করে selenium=3.3.1এবং python=2.7.10যখন সেলেনিয়াম থেকে সেলেনিয়াম আমদানি, ত্রুটি
benjaminz

1
সেলেনিয়ামের সেই সংস্করণে আপনার আমদানি বিবৃতিটি হ'ল: from selenium import webdriverবা chromedriverআপনি যা ব্যবহার করছেন তা হ'ল। ডক্স সম্পাদনা: ডকুমেন্টেশন রেফারেন্স যুক্ত করুন এবং আমার ভয়ঙ্কর ব্যাকরণ পরিবর্তন করুন!
নলট্রন

সেলেনিয়াম রিমোট কন্ট্রোল সেলেনিয়াম ওয়েবড্রাইভার দ্বারা প্রতিস্থাপন করা হয়েছে, তাদের ওয়েবসাইট
রেইনবউসরবেট

33

আর একটি সমাধান হ'ল ডাউনলোড হ্যান্ডলারটি প্রয়োগ করা বা হ্যান্ডলার মিডওয়্যার ডাউনলোড করা। ( ডাউনলোডার মিডলওয়্যারের বিষয়ে আরও তথ্যের জন্য চিকিত্সার ডক্স দেখুন) নীচে হেডলেস ফ্যান্টমজস ওয়েবড্রাইভার সহ সেলেনিয়াম ব্যবহার করে একটি উদাহরণ বর্গ:

1)middlewares.py স্ক্রিপ্টের মধ্যে শ্রেণি নির্ধারণ করুন ।

from selenium import webdriver
from scrapy.http import HtmlResponse

class JsDownload(object):

    @check_spider_middleware
    def process_request(self, request, spider):
        driver = webdriver.PhantomJS(executable_path='D:\phantomjs.exe')
        driver.get(request.url)
        return HtmlResponse(request.url, encoding='utf-8', body=driver.page_source.encode('utf-8'))

2) এর মধ্যে JsDownload()পরিবর্তনশীলতে শ্রেণি যুক্ত করুন :DOWNLOADER_MIDDLEWAREsettings.py

DOWNLOADER_MIDDLEWARES = {'MyProj.middleware.MiddleWareModule.MiddleWareClass': 500}

3) সংহত HTMLResponseমধ্যে your_spider.py। প্রতিক্রিয়া বডি ডিকোডিং আপনি পছন্দসই আউটপুট পাবেন।

class Spider(CrawlSpider):
    # define unique name of spider
    name = "spider"

    start_urls = ["https://www.url.de"] 

    def parse(self, response):
        # initialize items
        item = CrawlerItem()

        # store data as items
        item["js_enabled"] = response.body.decode("utf-8") 

Alচ্ছিক অ্যাডন:
আমি মিডলওয়্যারগুলি কোনটি ব্যবহার করতে হবে তা বিভিন্ন মাকড়সা বলার দক্ষতা চেয়েছিলাম তাই আমি এই মোড়কটি কার্যকর করেছি:

def check_spider_middleware(method):
@functools.wraps(method)
def wrapper(self, request, spider):
    msg = '%%s %s middleware step' % (self.__class__.__name__,)
    if self.__class__ in spider.middleware:
        spider.log(msg % 'executing', level=log.DEBUG)
        return method(self, request, spider)
    else:
        spider.log(msg % 'skipping', level=log.DEBUG)
        return None

return wrapper

মোড়কের কাজের জন্য সমস্ত মাকড়সা অবশ্যই কমপক্ষে থাকতে হবে:

middleware = set([])

একটি মিডওয়্যার অন্তর্ভুক্ত:

middleware = set([MyProj.middleware.ModuleName.ClassName])

সুবিধা:
মাকড়সার পরিবর্তে এইভাবে এটি প্রয়োগের মূল সুবিধাটি হ'ল আপনি কেবল একটি অনুরোধ করবেন। উদাহরণস্বরূপ এটিটির সমাধানে: ডাউনলোড হ্যান্ডলার অনুরোধটি প্রক্রিয়া করে এবং তারপরে মাকড়সার প্রতিক্রিয়া বন্ধ করে দেয়। মাকড়শাটি তার পার্স_পেজ ফাংশনে একেবারে নতুন অনুরোধ করে - এটি একই সামগ্রীর জন্য দুটি অনুরোধ।


দেরি এই যদিও> উত্তর দিতে বেশ একটু হয়েছে <।
rocktheartsm4l

@ rocktheartsm4l ঠিক কি ব্যবহার করে, সঙ্গে ভুল process_requests, if spider.name in ['spider1', 'spider2']প্রসাধক পরিবর্তে
প্যাড

@ প্যাড এতে কোনও ভুল নেই। আমি আমার স্পাইডার ক্লাসগুলির জন্য মিডওয়্যার নামের একটি সেট রাখার বিষয়টি আরও স্পষ্ট পেয়েছি। এইভাবে আমি যে কোনও মাকড়সার শ্রেণীর দিকে নজর রাখতে পারি এবং ঠিক দেখতে পাচ্ছিলাম যে এর জন্য মিডলওয়্যারগুলি কার্যকর করা হবে। আমার প্রকল্পে মিডলওয়্যার প্রচুর পরিমাণে প্রয়োগ হয়েছে তাই এটি বোধগম্য।
Rocktheartsm4l 19

এটি একটি ভয়ানক সমাধান। এটি কেবলমাত্র চিকিত্সার সাথে সম্পর্কিত নয়, কোড নিজেই অত্যন্ত অদক্ষ এবং একইসাথে পুরো পদ্ধতিটি অ্যাসিঙ্ক্রোনাস ওয়েব স্ক্র্যাপিং ফ্রেমওয়ার্কের পুরো উদ্দেশ্যকে পরাস্ত করে যা স্কেরাপি
গ্রানিটোসরাস

2
এটি ডাউনলোডের মধ্যম ওয়্যার ব্যবহার করে আমি অন্য যে কোনও সমাধানের চেয়ে অনেক বেশি দক্ষ তা পৃষ্ঠাটির জন্য কেবলমাত্র একটি অনুরোধ করা হয়েছে .. যদি এটি এতটা ভয়ঙ্কর হয় তবে কেন আপনি আরও ভাল সমাধান নিয়ে এসেছেন এবং পরিবর্তে ভাগ করুন স্পষ্টতই একতরফা দাবি করা। "থেরাপির সাথে সম্পর্কিত নয়" আপনি কি কিছু ধূমপান করছেন? কিছু ক্রেজি জটিল, দৃust় এবং কাস্টম সমাধান বাস্তবায়ন করা ছাড়াও এই পদ্ধতিটি আমি দেখেছি বেশিরভাগ লোকেরা ব্যবহার করে। কেবলমাত্র পার্থক্য হ'ল সর্বাধিক মাকড়সার সেলেনিয়াম অংশটি বাস্তবায়িত করে যা একাধিক অনুরোধ করার কারণ হতে পারে ...
Rocktheartsm4l

10

আমি একটি কাস্টম ডাউনলোডার মিডলওয়্যার ব্যবহার করছিলাম, তবে এতে খুব খুশি ছিলাম না, কারণ আমি ক্যাশে এটির সাথে কাজ করার ব্যবস্থা করিনি।

একটি কাস্টম ডাউনলোড হ্যান্ডলার বাস্তবায়ন করার চেয়ে আরও ভাল পদ্ধতির ছিল।

এখানে একটি কাজের উদাহরণ আছে । দেখে মনে হচ্ছে:

# encoding: utf-8
from __future__ import unicode_literals

from scrapy import signals
from scrapy.signalmanager import SignalManager
from scrapy.responsetypes import responsetypes
from scrapy.xlib.pydispatch import dispatcher
from selenium import webdriver
from six.moves import queue
from twisted.internet import defer, threads
from twisted.python.failure import Failure


class PhantomJSDownloadHandler(object):

    def __init__(self, settings):
        self.options = settings.get('PHANTOMJS_OPTIONS', {})

        max_run = settings.get('PHANTOMJS_MAXRUN', 10)
        self.sem = defer.DeferredSemaphore(max_run)
        self.queue = queue.LifoQueue(max_run)

        SignalManager(dispatcher.Any).connect(self._close, signal=signals.spider_closed)

    def download_request(self, request, spider):
        """use semaphore to guard a phantomjs pool"""
        return self.sem.run(self._wait_request, request, spider)

    def _wait_request(self, request, spider):
        try:
            driver = self.queue.get_nowait()
        except queue.Empty:
            driver = webdriver.PhantomJS(**self.options)

        driver.get(request.url)
        # ghostdriver won't response when switch window until page is loaded
        dfd = threads.deferToThread(lambda: driver.switch_to.window(driver.current_window_handle))
        dfd.addCallback(self._response, driver, spider)
        return dfd

    def _response(self, _, driver, spider):
        body = driver.execute_script("return document.documentElement.innerHTML")
        if body.startswith("<head></head>"):  # cannot access response header in Selenium
            body = driver.execute_script("return document.documentElement.textContent")
        url = driver.current_url
        respcls = responsetypes.from_args(url=url, body=body[:100].encode('utf8'))
        resp = respcls(url=url, body=body, encoding="utf-8")

        response_failed = getattr(spider, "response_failed", None)
        if response_failed and callable(response_failed) and response_failed(resp, driver):
            driver.close()
            return defer.fail(Failure())
        else:
            self.queue.put(driver)
            return defer.succeed(resp)

    def _close(self):
        while not self.queue.empty():
            driver = self.queue.get_nowait()
            driver.close()

মনে করুন আপনার স্ক্র্যাপারটিকে "স্ক্র্যাপার" বলা হয়। যদি আপনি উল্লিখিত কোডটিকে "স্ক্র্যাপার" ফোল্ডারের মূলটিতে হ্যান্ডলার.পি নামে একটি ফাইলের ভিতরে রাখেন তবে আপনি আপনার সেটিংসে যুক্ত করতে পারেন pypy:

DOWNLOAD_HANDLERS = {
    'http': 'scraper.handlers.PhantomJSDownloadHandler',
    'https': 'scraper.handlers.PhantomJSDownloadHandler',
}

এবং ভয়েলি, জেএস স্ক্রপি ক্যাশে, পুনরায় চেষ্টা ইত্যাদির সাহায্যে পার্সড ডোম etc.


আমি এই সমাধান পছন্দ!
Rocktheartsm4l

সুন্দর সমাধান। সেলেনিয়াম ড্রাইভার এখনও কি একমাত্র বিকল্প?
মথিউস

দুর্দান্ত সমাধান। অনেক ধন্যবাদ.
ক্রেজিজিক

4

এই গতিশীল ডেটা স্ক্র্যাপ করতে স্ক্র্যাপি কীভাবে ব্যবহার করা যায় যাতে আমি এটি ব্যবহার করতে পারি?

আমি অবাক হয়েছি কেন কেউ কেউ কেবল স্কেরাপি ব্যবহার করে সমাধান পোস্ট করেননি।

স্কেরাপি টিম স্ক্র্যাপিং ইনফিনিট স্ক্রোলিং পৃষ্ঠাগুলি থেকে ব্লগ পোস্টটি দেখুন । উদাহরণটি স্ক্র্যাপ http://spidyquotes.herokuapp.com/scrol ওয়েবসাইট যা অসীম স্ক্রোলিং ব্যবহার করে।

ধারণা করা হয় আপনার ব্রাউজারের বিকাশকারী সরঞ্জামসমূহ ব্যবহার এবং AJAX অনুরোধ তারপরে সেই তথ্যটি Scrapy জন্য অনুরোধ তৈরি উপর ভিত্তি করে লক্ষ্য

import json
import scrapy


class SpidyQuotesSpider(scrapy.Spider):
    name = 'spidyquotes'
    quotes_base_url = 'http://spidyquotes.herokuapp.com/api/quotes?page=%s'
    start_urls = [quotes_base_url % 1]
    download_delay = 1.5

    def parse(self, response):
        data = json.loads(response.body)
        for item in data.get('quotes', []):
            yield {
                'text': item.get('text'),
                'author': item.get('author', {}).get('name'),
                'tags': item.get('tags'),
            }
        if data['has_next']:
            next_page = data['page'] + 1
            yield scrapy.Request(self.quotes_base_url % next_page)

আমরা আবার একই সমস্যার মুখোমুখি হই: স্ক্র্যাপি এই উদ্দেশ্যে তৈরি হয় না এবং এটিই আমরা একই সমস্যার মুখোমুখি হই। ভুতোমজেএস এ যান বা অন্যদের পরামর্শ অনুসারে, আপনার নিজের ডাউনলোড মিডলওয়্যারটি তৈরি করুন
rak007

@ rak007 ফ্যান্টমজেএস বনাম ক্রোম ড্রাইভার। কোনটি আপনি পরামর্শ করবেন?
চাঁকি পাঠক

2

হ্যাঁ, স্কেরাপি জাভাস্ক্রিপ্টের মাধ্যমে রেন্ডার করা গতিশীল ওয়েবসাইটগুলি, ওয়েবসাইটগুলি স্ক্র্যাপ করতে পারে।

এই ধরণের ওয়েবসাইটগুলির স্ক্র্যাপির জন্য দুটি পন্থা রয়েছে।

প্রথমত,

আপনি splashজাভাস্ক্রিপ্ট কোড রেন্ডার করতে এবং তারপরে রেন্ডার করা এইচটিএমএলকে পার্স করতে পারেন । আপনি এখানে দস্তাবেজ এবং প্রকল্পের সন্ধান করতে পারবেন স্কেরিপি স্প্ল্যাশ, গিট

দ্বিতীয়ত,

সবাই যেমন পর্যবেক্ষণ করে বলেছে, network callsহ্যাঁ, আপনি অ্যাপি কলটি খুঁজে পেতে পারেন যা ডেটা আনবে এবং আপনার স্কেরাপির স্পাইডারে কলটি আপনাকে পছন্দসই ডেটা পেতে সহায়তা করতে পারে might


1

আমি সেলেনিয়াম এবং ফায়ারফক্স ওয়েব ড্রাইভার ব্যবহার করে এজ্যাক্স অনুরোধটি পরিচালনা করি। আপনার যদি ডেমন হিসাবে ক্রলারের প্রয়োজন হয় তবে এটি দ্রুত নয় তবে কোনও ম্যানুয়াল সমাধানের চেয়ে অনেক ভাল। আমি এখানে একটি সংক্ষিপ্ত টিউটোরিয়াল লিখেছি রেফারেন্সের জন্য

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