如何使用Scrapy跟踪url路径(在线评论)

2024-04-26 07:27:15 发布

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

对于我的副业我正在为一家咨询公司建立一个网络爬虫,这样他们就可以帮助客户根据从网上零售商那里收集的数据进行预测。最重要的数据当然是评论,但价格、功能、替代品等也是收集数据的一部分。 我对Scrapy和编程完全陌生,但到目前为止,我已经成功地创建了一个似乎可以部分工作的代码。 因为Scrapy项目不适合我,所以我使用了YouTube上的Scrapinghub教程(https://www.youtube.com/watch?v=qPvPiMbPSTE&list=PLZyvi_9gamL-EE3zQJbU5N3nzJcfNeFHU&index=2)。在

第一部分工作得很好:Scrapy跟踪各个产品的url并从中获取信息。但是,一部分评论是隐藏的,需要一个AJAX调用来显示它们。由于我没有足够的经验在Scrapy中使用AJAX,而且由于这是我的最后一个星期,所以我决定尝试按照url找到所有评论都可见的页面。 这个url是从网页上抓取的,如下所示:“/webapp/wcs/stores/servlet/MultiChannelReviewListAjax?storeId=10259&langId=-11&catEntryId=3744085&mode=tail“

到目前为止,以下链接在单独的代码中工作,但在下面的代码中不起作用。这可能是我的缩进错误,也可能是因为它仍然在链接中使用AJAX,但我已经尝试了很多次,似乎找不到解决方案。 有没有人知道我如何做到这一点,或者改进单独的代码,因为它会给我一些页面的“DEBUG crawled(200)”错误,而对其他页面来说工作正常?

非常感谢!在

import scrapy
from time import gmtime, strftime


class MediamarktSpider(scrapy.Spider):
    name = "MediaMarkt_NL"
    allowed_domains = ["www.mediamarkt.nl"]
    download_delay = 2
    cookies_enabled = False
    user_agent = "Googlebot/2.1"
    start_urls = ['http://www.mediamarkt.nl/nl/category/_koptelefoons-450727.html']

    # scrape individual product page
    def parse(self, response):
        urls = response.xpath("//*[@class='product-wrapper']//h2/a/@href").extract()
        for url in urls:
            url = response.urljoin(url)
            yield scrapy.Request(url=url, callback=self.parse_details)

        # follow pagination link
        next_page_url =  response.xpath("//*[@class='pagination-next']//a/@href").extract_first()
        if next_page_url:
            next_page_url = response.urljoin(next_page_url)
            yield scrapy.Request(url=next_page_url, callback=self.parse)

    def parse_details(self, response):
        # make sure something is returned    
        def casenull(xpathstring, pos=0):
            try:
                return xpathstring[pos]
            except IndexError:
                return 'none'        

        yield { 
        'Name': response.xpath('.//*[@itemprop="name"]//text()').extract(),
        'Time': strftime("%Y-%m-%d %H:%M:%S"),
        'Price': response.xpath('.//*[@itemprop="price"]/@content').extract(),
        'Currency': response.xpath('.//*[@itemprop="priceCurrency"]/@content').extract(),
        'Total_Ratings': casenull(response.xpath('.//*[@itemprop="reviewCount"]/@content').extract()),
        'Average_Rating': casenull(response.xpath('.//*[@class="text-above"]//text()').extract(), 0),
        'Five_Star_Ratings': casenull(response.xpath('.//*[@class="rc-votes"]//text()').extract(), 1),
        'Four_Star_Rating': casenull(response.xpath('.//*[@class="rc-votes"]//text()').extract(), 2),  
        'Three_Star_Rating': casenull(response.xpath('.//*[@class="rc-votes"]//text()').extract(), 3),
        'Two': casenull(response.xpath('.//*[@class="rc-votes"]//text()').extract(), 4),
        'One_Star_Rating': casenull(response.xpath('.//*[@class="rc-votes"]//text()').extract(), 5),
        'Recommendation': casenull(response.xpath('.//*[@class="recommendation"]//text()').extract()),
        'Features': casenull(list(zip(response.xpath('//*[@class="specification"]/dt/text()').extract(), response.xpath('//*[@class="specification"]/dd/text()').extract()))),
        'Pros': casenull([item.strip('\r\t\n') for item in response.xpath('//*[@class="review-features review-pros"]/text()[2]').extract()]),
        'Cons': casenull([item.strip('\r\t\n') for item in response.xpath('//*[@class="review-features review-cons"]/text()[2]').extract()]),
        'Alternatives': casenull(response.xpath('.//*[@class="prodrel-desc"]/h3/a//text()').extract()),
        'Review_Title': casenull([item.strip('\r\t\n') for item in response.xpath('.//li/article/h3//text()').extract()]),
        'Review_Text': casenull([item.strip('\r\t\n') for item in response.xpath('//*[@class="reviews-content js-product-reviews-first"]//article//p[2]//text()').extract()]),
        }

    # follow review url
    for url in urls:
        review_url = response.xpath('.//*[@class="reviews-content reviews-content-remaining js-product-reviews-remaining state-hidden"]//@data-href').extract_first()
        if review_url:
            review_url = response.urljoin(review_url)
            yield scrapy.Request(url=review_url, callback=self.parse)    

    def parse_details(self, response):
        yield {
        'Review_Titel': [item.strip() for item in response.xpath('//h3//text()').extract()]
        }

Tags: textinselfurlforparseresponsepage