python - स्कैपी में दोनों आइटम और कॉलबैक अनुरोध पैदा करते हैं



callback scrapy (1)

अस्वीकरण: मैं दोनों पायथन और स्क्रेपी के लिए बहुत नया हूँ।

मैं अपने स्पाइडर को यूआरएल को यूआरएल को इकट्ठा करने की कोशिश कर रहा हूं, जो इकट्ठे हुए यूआरएल और दोनों का पालन करें:

  1. विशिष्ट आइटम के लिए अगले पृष्ठ को परिमार्जन करें (और अंततः उन्हें वापस लौटाएं)
  2. अगले पृष्ठ से अधिक विशिष्ट यूआरएल इकट्ठा करें और इन यूआरएल का पालन करें।

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

class VSSpider(scrapy.Spider):
    name = "vs5"
    allowed_domains = ["votesmart.org"]
    start_urls = [
                  "https://votesmart.org/officials/WA/L/washington-state-legislative#.V8M4p5MrKRv",
                  ]

    def parse(self, response):
        sel = Selector(response)
        #this gathers links to the individual legislator pages, it works
        for href in response.xpath('//h5/a/@href'): 
            url = response.urljoin(href.extract())
            yield scrapy.Request(url, callback=self.parse1)

    def parse1(self, response):
        sel = Selector(response)
        items = []
        #these xpaths are on the next page that the spider should follow, when it first visits an individual legislator page
        for sel in response.xpath('//*[@id="main"]/section/div/div/div'):
            item = LegislatorsItems()
            item['current_office'] = sel.xpath('//tr[1]/td/text()').extract()
            item['running_for'] = sel.xpath('//tr[2]/td/text()').extract()
            items.append(item)
        #this is the xpath to the biography of the legislator, which it should follow and scrape next
        for href in response.xpath('//*[@id="folder-bio"]/@href'):
            url = response.urljoin(href.extract())
            yield scrapy.Request(url, callback=self.parse2, meta={'items': items})

    def parse2(self, response):
        sel = Selector(response)
        items = response.meta['items']
        #this is an xpath on the biography page
        for sel in response.xpath('//*[@id="main"]/section/div[2]/div/div[3]/div/'):
            item = LegislatorsItems()
            item['tester'] = sel.xpath('//div[2]/div[2]/ul/li[3]').extract()
            items.append(item)
            return items

धन्यवाद!


आपकी समस्या के 2 स्तर हैं

1. जैव असमर्थ के साथ जैव यूआरएल उपलब्ध नहीं है। अपने ब्राउज़र में जेएस बंद करें और इस पृष्ठ की जांच करें: https://votesmart.org/candidate/126288/derek-stanford

आपको टिप्पणी के तहत खाली href और सही यूआरएल के साथ टैग को देखना चाहिए।

<a href="#" class="folder" id="folder-bio">
<!--<a href='/candidate/biography/126288/derek-stanford' itemprop="url" class='more'>
           See Full Biographical and Contact Information</a>-->

बायो यूआरएल निकालने के लिए, आप एक्सपैथ चयनकर्ता "/ टिप्पणी ()" के साथ इस टिप्पणी को प्राप्त कर सकते हैं, और फिर regexp के साथ यूआरएल निकाल सकते हैं।

या, अगर यूआरएल संरचना सभी पृष्ठों के लिए आम है, तो यूआरएल को स्वयं बनाएं: "/ उम्मीदवार /" / "/ उम्मीदवार / जीवनी /" के साथ लिंक में बदलें।

नायब! अगर आपको अनपेक्षित मुद्दों का सामना करना पड़ता है, तो पहले क्रियाओं में से एक - जेएस को अक्षम करें और पृष्ठ को देखें, जैसे कि इसे देखिए। सभी चयनकर्ताओं का परीक्षण करें

2. आइटम का आपका उपयोग बहुत जटिल है। यदि "एक आइटम = एक व्यक्ति", तो आपको "पैरासेस्पेनर" में एक आइटम को परिभाषित करना चाहिए और इसे "पार्स_बिओ" में देना होगा

अपडेटेड कोड पर एक नज़र डालें इस मुद्दे को खोजने के दौरान मैंने कुछ हिस्सों को फिर से लिखा। टिप्पणियाँ:

  • आपको "आइटम" सूची बनाने और इसके लिए आइटम जोड़ने के लिए (अधिकांश मामलों में) की आवश्यकता नहीं है। Scrapy वस्तुओं के साथ ही प्रबंधन करता है
  • "सेल = चयनकर्ता (प्रतिक्रिया)" का आपके कोड में कोई मतलब नहीं है, आप इसे फेंक सकते हैं

इस कोड को स्क्रेपी 1.0 और पायथन 3.5 के साथ परीक्षण किया गया है, हालांकि पहले संस्करणों के साथ भी काम करना चाहिए।

from scrapy import Spider, Request

class VSSpider(Spider):
    name = "vs5"
    allowed_domains = ["votesmart.org"]
    start_urls = ["https://votesmart.org/officials/WA/L/washington-state-legislative"]

    def parse(self, response):
        for href in response.css('h5 a::attr(href)').extract():
            person_url = response.urljoin(href)
            yield Request(person_url, callback=self.parse_person)

    def parse_person(self, response):  # former "parse1"
        # define item, one for both parse_person and bio function
        item = LegislatorsItems()

        # extract text from left menu table and populate to item
        desc_rows = response.css('.span-abbreviated td::text').extract()
        if desc_rows:
            item['current_office'] = desc_rows[0]
            item['running_for'] = desc_rows[1] if len(desc_rows) > 1 else None

        # create right bio url and pass item to it
        bio_url = response.url.replace('votesmart.org/candidate/', 
                                       'votesmart.org/candidate/biography/')
        return Request(bio_url, callback=self.parse_bio, meta={'item': item})

    def parse_bio(self, response):  # former "parse2"
        # get item from meta, add "tester" data and return
        item = response.meta['item']
        item['tester'] = response.css('.item.first').xpath('//li[3]').extract()
        print(item)   # for python 2: print item 
        return item




scrapy