क्या AJAX का उपयोग करने वाली वेबसाइटों से गतिशील सामग्री को स्क्रैप करने के लिए स्क्रैपी का उपयोग किया जा सकता है?


145

मैं हाल ही में पायथन सीख रहा हूं और एक वेब-स्क्रैपर के निर्माण में अपना हाथ डुबो रहा हूं। यह कुछ भी फैंसी नहीं है; इसका एकमात्र उद्देश्य सट्टेबाजी की वेबसाइट से डेटा प्राप्त करना और यह डेटा एक्सेल में डालना है।

अधिकांश मुद्दे हल हैं और मैं चारों ओर एक अच्छा सा गड़बड़ कर रहा हूं। हालांकि मैं एक मुद्दे पर भारी बाधा मार रहा हूं। यदि कोई साइट घोड़ों की एक तालिका लोड करती है और सट्टेबाजी की मौजूदा कीमतों को सूचीबद्ध करती है तो यह जानकारी किसी भी स्रोत फ़ाइल में नहीं है। सुराग यह है कि यह डेटा कभी-कभी लाइव होता है, कुछ दूरस्थ सर्वर से संख्या स्पष्ट रूप से अपडेट की जाती है। मेरे पीसी पर HTML में बस एक छेद होता है जहां उनके सर्वर उन सभी दिलचस्प डेटा के माध्यम से जोर दे रहे हैं जिनकी मुझे आवश्यकता है।

अब डायनामिक वेब कंटेंट के साथ मेरा अनुभव कम है, इसलिए यह चीज कुछ ऐसी है जिससे मुझे अपना सिर घुमाने में परेशानी हो रही है।

मुझे लगता है कि जावा या जावास्क्रिप्ट एक कुंजी है, यह अक्सर पॉप अप होता है।

खुरचनी बस एक तुलना इंजन है। कुछ साइटों में एपीआई हैं, लेकिन मुझे उन लोगों के लिए इसकी आवश्यकता है जो नहीं करते हैं। मैं पाइथन 2.7 के साथ स्क्रेपी लाइब्रेरी का उपयोग कर रहा हूं

अगर यह सवाल बहुत ज्यादा खुला है तो मैं माफी मांगता हूं। संक्षेप में, मेरा सवाल यह है: इस गतिशील डेटा को परिमार्जन करने के लिए कैसे स्क्रैप का उपयोग किया जा सकता है ताकि मैं इसका उपयोग कर सकूं? ताकि मैं वास्तविक समय में सट्टेबाजी के इस डेटा को मिटा सकूं?


1
मैं यह डेटा कैसे प्राप्त कर सकता हूं, जो डेटा गतिशील है और लाइव है?
यूसुफ

1
यदि आपके पृष्ठ में जावास्क्रिप्ट है, तो इसे आज़माएँ
पुनः घोषित

3
कुछ Firefoxएक्सटेंशन पर प्रयास करें जैसे कि httpFoxया liveHttpHeadersपेज को लोड करें जो अजाक्स अनुरोध का उपयोग कर रहा है। स्क्रेपी स्वचालित रूप से अजाक्स अनुरोधों की पहचान नहीं करता है, आपको मैन्युअल रूप से उपयुक्त अजाक्स URL की खोज करनी होगी और फिर उसके साथ अनुरोध करना होगा।
आमिर अदनान

चीयर्स, मैं फ़ायरफ़ॉक्स एक्सटेंशन को एक wizz दे दूँगा
यूसुफ

वहाँ खुला स्रोत समाधान की एक संख्या है। लेकिन अगर आप विशेष रूप से बड़े वर्कलोड के लिए ऐसा करने का आसान और त्वरित तरीका खोज रहे हैं, तो SnapSearch ( snapsearch.io ) देखें। यह जेएस, एचटीएमएल 5 और एसपीए साइटों के लिए बनाया गया था, जिन्हें खोज इंजन क्रॉलबिलिटी की आवश्यकता थी। डेमो की कोशिश करें (यदि कोई खाली सामग्री है, तो इसका मतलब है कि साइट वास्तव में कोई शरीर सामग्री नहीं लौटाती है, संभावित रूप से 301 रीडायरेक्ट का अर्थ है)।
CMCDragonkai

जवाबों:


74

वेबकिट आधारित ब्राउज़र (जैसे Google क्रोम या सफारी) में अंतर्निहित डेवलपर टूल हैं। क्रोम में आप इसे खोल सकते हैं Menu->Tools->Developer ToolsNetworkटैब आप हर अनुरोध और प्रतिक्रिया के बारे में सभी जानकारी को देखने के लिए अनुमति देता है:

यहाँ छवि विवरण दर्ज करें

तस्वीर के नीचे आप देख सकते हैं कि मैंने नीचे अनुरोध को फ़िल्टर किया है XHR- ये जावास्क्रिप्ट कोड द्वारा किए गए अनुरोध हैं।

युक्ति: हर बार जब आप पृष्ठ को लोड करते हैं, तो तस्वीर के निचले भाग पर लॉग साफ़ हो जाता है, ब्लैक डॉट बटन लॉग को संरक्षित करेगा।

अनुरोधों और प्रतिक्रियाओं का विश्लेषण करने के बाद आप अपने वेब-क्रॉलर से इन अनुरोधों का अनुकरण कर सकते हैं और मूल्यवान डेटा निकाल सकते हैं। कई मामलों में HTML को पार्स करने की तुलना में आपका डेटा प्राप्त करना आसान होगा, क्योंकि उस डेटा में प्रेजेंटेशन लॉजिक नहीं है और इसे जावास्क्रिप्ट कोड द्वारा एक्सेस करने के लिए फॉर्मेट किया गया है।

फ़ायरफ़ॉक्स में समान विस्तार है, इसे फायरबग कहा जाता है । कुछ लोग तर्क देंगे कि फायरबग और भी शक्तिशाली है लेकिन मुझे वेबकिट की सादगी पसंद है।


141
कैसे हो सकता है कि यह एक स्वीकृत उत्तर हो सकता है अगर इसमें 'स्क्रैपी' शब्द भी नहीं है ??
टूलकिट

यह काम करता है, और अजगर में json मॉड्यूल का उपयोग करके पार्स करना आसान है। इसका हल है! उस की तुलना में, सेलेनियम या अन्य सामान का उपयोग करने की कोशिश कर रहे लोग सुझाव दे रहे हैं, यह अधिक सिरदर्द है। यदि वैकल्पिक तरीका अधिक जटिल था, तो मैं आपको इसे दे दूंगा, लेकिन यह यहाँ नहीं है @ टूलकिट
Arion_Miles

1
यह वास्तव में प्रासंगिक नहीं है। सवाल था कि गतिशील वेब साइटों को खुरचने के लिए स्कार्पी का उपयोग कैसे किया जाए।
ई। इरफान

"यह एक स्वीकृत उत्तर कैसे हो सकता है" - क्योंकि व्यावहारिक उपयोग राजनीतिक-शुद्धता की धड़कन है। मनुष्य समझ में आता है।
एस्प्रेसो

98

यहां scrapyAJAX अनुरोध के साथ एक सरल उदाहरण दिया गया है। साइट rubin-kazan.ru देखें ।

सभी संदेश AJAX अनुरोध के साथ लोड किए गए हैं। मेरा लक्ष्य इन संदेशों को उनकी सभी विशेषताओं (लेखक, दिनांक, ...) के साथ लाना है:

यहाँ छवि विवरण दर्ज करें

जब मैं पृष्ठ के स्रोत कोड का विश्लेषण करता हूं तो मैं इन सभी संदेशों को नहीं देख सकता क्योंकि वेब पेज AJAX तकनीक का उपयोग करता है। लेकिन मैं वेब पेज पर संदेशों को उत्पन्न करने वाले HTTP अनुरोध का विश्लेषण करने के लिए मोज़िला फ़ायरफ़ॉक्स (या अन्य ब्राउज़रों में एक बराबर उपकरण) से फायरबग कर सकता हूं:

यहाँ छवि विवरण दर्ज करें

यह पूरे पृष्ठ को पुनः लोड नहीं करता है, लेकिन केवल पृष्ठ के कुछ हिस्सों में संदेश होते हैं। इस उद्देश्य के लिए मैं नीचे पृष्ठ पर एक मनमानी संख्या क्लिक करता हूं:

यहाँ छवि विवरण दर्ज करें

और मैं उस HTTP अनुरोध को देखता हूं जो संदेश निकाय के लिए जिम्मेदार है:

यहाँ छवि विवरण दर्ज करें

समाप्त होने के बाद, मैं अनुरोध के शीर्षलेखों का विश्लेषण करता हूं (मुझे यह उद्धरण देना होगा कि यह URL मैं स्रोत अनुभाग से स्रोत पृष्ठ से निकालूंगा, नीचे दिया गया कोड देखें:

यहाँ छवि विवरण दर्ज करें

और अनुरोध की डेटा सामग्री (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
यह निश्चित रूप से बेहतर है।

1
@polarise यह कोड reमॉड्यूल (नियमित अभिव्यक्ति) का उपयोग कर रहा है , यह स्ट्रिंग की खोज 'url_list_gb_messages="(.*)"'करता है और समान नाम के चर में कोष्ठक की सामग्री को अलग करता है। यह एक अच्छा परिचय है: guru99.com/python- अनियमित-expressions
MGP

42

कई बार रेंगते समय हम उन समस्याओं में भाग लेते हैं जहां पृष्ठ पर प्रदान की गई सामग्री जावास्क्रिप्ट के साथ उत्पन्न होती है और इसलिए स्क्रैपी इसके लिए क्रॉल करने में असमर्थ होती है (जैसे। ajax अनुरोध, jQuery पागलपन)।

हालाँकि, यदि आप वेब टेस्टिंग फ्रेमवर्क सेलेनियम के साथ-साथ स्क्रैपी का उपयोग करते हैं तो हम सामान्य वेब ब्राउज़र में प्रदर्शित कुछ भी क्रॉल करने में सक्षम हैं।

ध्यान देने योग्य कुछ बातें:

  • आपके पास काम करने के लिए सेलेनियम आरसी का पायथन संस्करण स्थापित होना चाहिए, और आपने सेलेनियम को ठीक से स्थापित किया होगा। इसके अलावा यह सिर्फ एक टेम्प्लेट क्रॉलर है। आप बहुत अधिक पागल हो सकते हैं और चीजों के साथ अधिक उन्नत हो सकते हैं लेकिन मैं सिर्फ मूल विचार दिखाना चाहता था। जैसा कि कोड अब खड़ा है आप किसी भी दिए गए यूआरएल के लिए दो अनुरोध करेंगे। एक अनुरोध स्क्रेपी द्वारा किया गया है और दूसरा सेलेनियम द्वारा किया गया है। मुझे यकीन है कि इसके चारों ओर तरीके हैं ताकि आप संभवतः सेलेनियम को केवल एक और केवल अनुरोध कर सकें लेकिन मैंने इसे लागू करने के लिए परेशान नहीं किया और दो अनुरोध करके आप पृष्ठ को क्रैपी के साथ भी क्रॉल कर सकते हैं।

  • यह काफी शक्तिशाली है क्योंकि अब आपके पास क्रॉल करने के लिए संपूर्ण रेंडर डोम उपलब्ध है और आप अभी भी स्क्रेपी में सभी अच्छी क्रॉलिंग सुविधाओं का उपयोग कर सकते हैं। यह निश्चित रूप से धीमी गति से रेंगने के लिए बना देगा, लेकिन आपको इस बात की आवश्यकता होगी कि आपको प्रदान किए गए DOM की कितनी आवश्यकता है यह प्रतीक्षा के लायक हो सकता है।

    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/


नीट समाधान! क्या आपके पास इस लिपि को फ़ायरफ़ॉक्स से जोड़ने का कोई सुझाव है? (OS लिनक्स मिंट है)। मुझे "[एरनो 111] कनेक्शन मिल रहा है"।
एंड्रयू

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_MIDDLEWAREके भीतर settings.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") 

वैकल्पिक एडऑन:
मैं अलग-अलग मकड़ियों को बताने की क्षमता चाहता था जो कि मिडलवेयर का उपयोग करें इसलिए मैंने इस आवरण को लागू किया:

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])

फायदा:
मकड़ी के बजाय इसे इस तरह से लागू करने का मुख्य लाभ यह है कि आप केवल एक अनुरोध करना समाप्त करते हैं। उदाहरण के लिए एटी के समाधान में: डाउनलोड हैंडलर अनुरोध को संसाधित करता है और फिर मकड़ी को प्रतिक्रिया देता है। मकड़ी तब parse_page फ़ंक्शन में एक नया अनुरोध करती है - यह एक ही सामग्री के लिए दो अनुरोध हैं।


हालांकि मुझे इसका जवाब देने में थोड़ी देर हो गई>>। <
rocktheartsm4l

@ rocktheartsm4l क्या सिर्फ उपयोग करते हुए, में गलत क्या है process_requests, if spider.name in ['spider1', 'spider2']डेकोरेटर के बजाय
पैड

@पैड इसमें कुछ भी गलत नहीं है। मैंने अभी-अभी अपने स्पाइडर क्लासेस के लिए मिडलवेयर नाम का एक सेट लिया है। इस तरह मैं किसी भी मकड़ी वर्ग को देख सकता था और देख सकता था कि इसके लिए कौन से बिचौलियों को मार दिया जाएगा। मेरी परियोजना में बहुत सारे मिडलवेयर लागू थे, जिससे यह समझ में आया।
19th:05 पर rocktheartsm4l

यह एक भयानक समाधान है। इतना ही नहीं यह scrapy से संबंधित नहीं है, लेकिन कोड में ही अत्यंत अकुशल साथ ही आम हार में पूरे दृष्टिकोण है अतुल्यकालिक वेब scraping रूपरेखा का पूरा उद्देश्य scrapy है कि
Granitosaurus

2
किसी भी अन्य समाधान की तुलना में यह अधिक कुशल है, जो मैंने एसओ पर डाउनलोडर मिडल वेयर के रूप में देखा है, इसलिए यह पेज के लिए केवल एक ही अनुरोध करता है .. यदि यह इतना भयानक है, तो आप बेहतर समाधान के साथ क्यों नहीं आते हैं और इसके बजाय साझा करें स्पष्ट रूप से एक पक्षीय दावे करना। "स्क्रैप से संबंधित नहीं" क्या आप कुछ धूम्रपान कर रहे हैं? कुछ पागल जटिल, मजबूत और कस्टम समाधान को लागू करने के अलावा यह वह तरीका है जो मैंने देखा है कि ज्यादातर लोग इसका उपयोग करते हैं। केवल अंतर यह है कि ज्यादातर मकड़ी में सेलेनियम भाग को लागू करते हैं जो कई अनुरोधों का कारण बनता है ...
14th पर 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()

मान लीजिए कि आपके स्क्रैपर को "स्क्रैपर" कहा जाता है। यदि आप "स्क्रेपर" फ़ोल्डर की जड़ में हैंडलरशो नामक फ़ाइल के अंदर उल्लिखित कोड डालते हैं, तो आप अपनी सेटिंग्स में जोड़ सकते हैं:

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

और voilà, JS ने पार्स किया डोम, स्क्रैपेड कैश, रिट्रीज़ आदि के साथ।


मुझे यह समाधान पसंद है!
रॉकथिएर्ट्सम 4 एल जू

अच्छा समाधान। क्या सेलेनियम ड्राइवर अभी भी एकमात्र विकल्प है?
मोटियस

महान समाधान। बहुत बहुत धन्यवाद।
CrazyGeek

4

इस गतिशील डेटा को परिमार्जन करने के लिए कैसे स्क्रैप किया जा सकता है ताकि मैं इसका उपयोग कर सकूं?

मुझे आश्चर्य है कि किसी ने केवल स्क्रेपी का उपयोग करके समाधान क्यों पोस्ट नहीं किया है।

स्क्रेपी टीम SCRAPING INFINITE SCROLLING PAGES की ब्लॉग पोस्ट देखें । उदाहरण http://spidyquotes.herokuapp.com/scroll को स्क्रैप करता है वेबसाइट को करता है जो अनंत स्क्रॉलिंग का उपयोग करता है।

विचार यह है कि आपके ब्राउज़र के डेवलपर टूल का उपयोग करें और AJAX अनुरोधों पर ध्यान दें, फिर उस जानकारी के आधार पर स्क्रैपी के लिए अनुरोध बनाएं

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)

हम फिर से उसी समस्या का सामना करते हैं: स्क्रैपी इस उद्देश्य के लिए नहीं बनाया गया है और यह वह जगह है जहां हम एक ही मुद्दे पर सामना करते हैं। PhantomJS पर जाएं या जैसा कि दूसरों ने सुझाव दिया है, अपना खुद का डाउनलोड मिडलवेयर बनाएं
rak007

@ rak007 PhantomJS बनाम क्रोम ड्राइवर। आप किसे सुझाव देंगे?
चंचल पाठक

2

हां, स्क्रेपी डायनामिक वेबसाइट, वेबसाइट को स्क्रैप कर सकती है, जो javaScript के माध्यम से प्रस्तुत की जाती हैं।

इस तरह की वेबसाइटों को स्क्रैप करने के लिए दो दृष्टिकोण हैं।

प्रथम,

आप splashजावास्क्रिप्ट कोड रेंडर करने के लिए उपयोग कर सकते हैं और फिर प्रदान किए गए HTML को पार्स कर सकते हैं । आप यहाँ डॉक्टर और परियोजना पा सकते हैं Scrapy splash, git

दूसरा,

जैसा कि हर कोई कह रहा है network calls, हां, आप मॉनिटर करके , आप डेटा प्राप्त करने वाले एप को कॉल कर सकते हैं और आपके स्क्रैप स्पाइडर में कॉल करने वाले नकली को वांछित डेटा प्राप्त करने में मदद कर सकते हैं।


1

मैं सेलेनियम और फ़ायरफ़ॉक्स वेब ड्राइवर का उपयोग करके अजाक्स अनुरोध को संभालता हूं। यह उतना तेज़ नहीं है अगर आपको क्रॉलर को डेमॉन की आवश्यकता है, लेकिन किसी भी मैनुअल समाधान की तुलना में बहुत बेहतर है। मैंने संदर्भ के लिए यहां एक छोटा ट्यूटोरियल लिखा है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.