如何为每个项目调用Parse\u page2方法

2024-09-30 10:36:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试为每个项调用parse_page2方法。但是每次我运行这个spider时,每页只能得到一个项目,所以如何为每个项目调用parse_page2方法。你知道吗

from scrapy.http import Request
from eScraper.items import EscraperItem
from scrapy.selector import HtmlXPathSelector
from scrapy.contrib.spiders import CrawlSpider

#------------------------------------------------------------------------------ 

class ESpider(CrawlSpider):
    name = "atisundarSpider"

    allowed_domains = ["atisundar.com"]

    URLSList = []

    for n in range (1,20):

        URLSList.append('http://atisundar.com/collections/sarees?page=' + str(n))
        URLSList.append('http://atisundar.com/collections/salwar-suits?page=' + str(n))

    start_urls = URLSList

    def parse(self, response):

        item = EscraperItem()
        hxs = HtmlXPathSelector(response)
        sites = hxs.select('//div[@class="block product size-medium"]')
        items = []

        for site in sites:
            item = EscraperItem()
            item['productDesc'] = "" 
            item['productSite'] = ["http://atisundar.com/"]
            item['productTitle'] = site.select('.//div[@class="main"]/a/@title').extract()
            item['productURL'] = ["http://atisundar.com" + site.select('.//div[@class="main"]/a/@href').extract()[0].encode('utf-8')]
            item['productPrice'] = site.select('.//p[@class="pricearea"]//span[@class="was-price"]/text()').extract() + site.select('.//p[@class="pricearea"]//span[@class="price"]/text()').extract() 
            item['productImage'] = [site.select('.//div[@class="main"]/a/img/@src').extract()[0].split('?')[0]] + [site.select('.//div[@class="main"]/a/img/@src').extract()[0].split('?')[0].replace("medium","grande")]
            item['image_urls'] = item['productImage']
            items.append(item)

            secondURL = "http://admin.atisundar.com/store/skuDetails?product_id=" + site.select('.//div[@class="main"]/a/text()').extract()[1].strip().split("#")[-1]

            request = Request(secondURL,
                      callback=self.parse_page2)
            request.meta['item'] = item 

            return request

    def parse_page2(self, response):

        item = response.meta['item']
        #item['other_url'] = response.url
        return item

Tags: fromimportdivcomhttpparsemainresponse
1条回答
网友
1楼 · 发布于 2024-09-30 10:36:18

1)您没有使用CrawlSpider功能,我建议您从BaseSpider继承spider

2)在for循环中

for site in sites:

使用yield而不是return,否则会在第一次迭代中中断循环。你知道吗

yield request

3)在parse_page2中,从response.request.meta获取item,而不是从response.meta

item = response.request.meta['item']

现在应该可以了。你知道吗

from scrapy.http import Request
from eScraper.items import EscraperItem
from scrapy.selector import HtmlXPathSelector

#                                        
from scrapy.spider import BaseSpider


class ESpider(BaseSpider):
    name = "atisundarSpider"

    allowed_domains = ["atisundar.com"]

    URLSList = []

    for n in range (1,20):

        URLSList.append('http://atisundar.com/collections/sarees?page=' + str(n))
        URLSList.append('http://atisundar.com/collections/salwar-suits?page=' + str(n))

    start_urls = URLSList

def parse(self, response):
    item = EscraperItem()
    hxs = HtmlXPathSelector(response)
    sites = hxs.select('//div[@class="block product size-medium"]')
    for site in sites:
        item = EscraperItem()
        item['productDesc'] = "" 
        item['productSite'] = ["http://atisundar.com/"]
        item['productTitle'] = site.select('.//div[@class="main"]/a/@title').extract()
        item['productURL'] = ["http://atisundar.com" + site.select('.//div[@class="main"]/a/@href').extract()[0].encode('utf-8')]
        item['productPrice'] = site.select('.//p[@class="pricearea"]//span[@class="was-price"]/text()').extract() + site.select('.//p[@class="pricearea"]//span[@class="price"]/text()').extract() 
        item['productImage'] = [site.select('.//div[@class="main"]/a/img/@src').extract()[0].split('?')[0]] + [site.select('.//div[@class="main"]/a/img/@src').extract()[0].split('?')[0].replace("medium","grande")]
        item['image_urls'] = item['productImage']
        secondURL = "http://admin.atisundar.com/store/skuDetails?product_id=" + site.select('.//div[@class="main"]/a/text()').extract()[1].strip().split("#")[-1]
        request = Request(secondURL,
                  callback=self.parse_page2)
        request.meta['item'] = item 
        yield request

def parse_page2(self, response):

    item = response.request.meta['item']
    #item['other_url'] = response.url
    return item

相关问题 更多 >

    热门问题