मुझे स्क्रैपी डेटा को संरचित करने में परेशानी हो रही है जैसा मैं चाहता हूं। माई स्पाइडर को एक पेज से कुछ डेटा मिलता है, फिर इस अगले पेज का लिंक पाने के लिए उस पेज पर लिंक्स की लिस्ट फॉलो करता है।

    def parse_page(self, response):
 
        links = response.css(LINK_SELECTOR).extract()

        data = {
            'name': response.css(NAME_SELECTOR).extract_first(),
            'date': response.css(DATE_SELECTOR).extract(),
        }

        for link in links:
            next_link = response.urljoin(link)
            yield scrapy.Request(next_link, callback=self.parse_url, meta={'data': data})

    def parse_url(self, response):
        data = response.meta['data']
        data['url'] = response.css(a::attr(href)').get()
        yield data

मैं निम्नलिखित संरचना के साथ डेटा प्राप्त करना चाहता हूं:

{'name': name, 'date': date, 'url': [url1, url2, url3, url4]}

के बजाए

{'name': name, 'date': date, 'url': url1}
{'name': name, 'date': date, 'url': url2}
{'name': name, 'date': date, 'url': url3}
{'name': name, 'date': date, 'url': url4}

मैंने वस्तुओं का उपयोग करने की कोशिश की है, लेकिन मुझे नहीं पता कि parse_url से parse_page फ़ंक्शन में डेटा कैसे पास किया जाए। मुझे यह कैसे करना है?

अग्रिम में धन्यवाद।

1
David Goldfarb 3 नवम्बर 2020, 06:27

2 जवाब

सबसे बढ़िया उत्तर

इसे आसानी से करने के लिए आप स्क्रैपी के coroutine support का उपयोग कर सकते हैं।

कोड कुछ इस तरह दिखेगा:

async def parse_page(self, response):
    ...
    for link in links:
        request = response.follow(link)
        response = await self.crawler.engine.download(request, self)
        urls.append(response.css('a::attr(href)').get())
1
stranac 3 नवम्बर 2020, 11:13

निम्नलिखित तरीकों में से एक है कि आप इसे कैसे प्राप्त कर सकते हैं। एक पुस्तकालय है inline_requests जो आपको अपेक्षित आउटपुट प्राप्त करने में मदद करेगा।

import scrapy
from scrapy.crawler import CrawlerProcess
from inline_requests import inline_requests

class YellowpagesSpider(scrapy.Spider):
    name = "yellowpages"
    start_urls = ["https://www.yellowpages.com/san-francisco-ca/mip/honey-honey-cafe-crepery-4752771"]

    @inline_requests
    def parse(self, response):
        data = {
            'name':response.css(".sales-info > h1::text").get(),
            'phone':response.css(".contact > p.phone::text").get(),
            'target_link':[]
        }
        for item_link in response.css(".review-info > a.author[href]::attr(href)").getall():
            resp = yield scrapy.Request(response.urljoin(item_link), meta={'handle_httpstatus_all': True})
            target_link = resp.css("a.review-business-name::attr(href)").get()
            data['target_link'].append(target_link)

        print(data)

if __name__ == "__main__":
    c = CrawlerProcess({
        'USER_AGENT':'Mozilla/5.0',
        'LOG_LEVEL':'ERROR',
    })
    c.crawl(YellowpagesSpider)
    c.start()

यह उत्पादन करता है:

{'name': 'Honey Honey Cafe & Crepery', 'phone': '(415) 351-2423', 'target_link': ['/san-francisco-ca/mip/honey-honey-cafe-crepery-4752771', '/walnut-ca/mip/akasaka-japanese-cuisine-455476824', '/san-francisco-ca/mip/honey-honey-cafe-crepery-4752771']}
0
SIM 3 नवम्बर 2020, 13:19