【问题标题】:Firstcry.com Scraper IssuesFirstcry.com 刮板问题
【发布时间】:2023-04-02 03:01:02
【问题描述】:

我正在尝试抓取以下站点 - www.firstcry.com。该网站使用 AJAX(以 XHR 的形式)来显示其搜索结果。

现在,如果您看到我的代码,jsonresponse 变量包含网站的 json 输出。现在,当我尝试打印它时,它包含许多 \(反斜杠)

现在,如果您在 jsonresponse 变量下方正确地看到了我的代码,我已经注释了几行。这些是我的尝试(在阅读了几个类似的问题后,我尝试在 Stack Overflow 上)删除所有 反斜杠 以及这些 - u',它们也存在于那里.

但是,在所有这些尝试之后,我无法删除 ALL 反斜杠u'

现在,如果我不删除所有这些,我将无法使用它的键访问 jsonresponse,因此,删除所有这些对我来说非常重要。

请帮我解决这个问题。如果您提供代码,尤其是针对我的案例(问题),而不是一般代码,那就更好了!

我的代码在这里-:

from twisted.internet import reactor
from scrapy.crawler import CrawlerProcess, CrawlerRunner
import scrapy
from scrapy.utils.log import configure_logging
from scrapy.utils.project import get_project_settings
from scrapy.settings import Settings
import datetime
from multiprocessing import Process, Queue
import os
from scrapy.http import Request
from scrapy import signals
from scrapy.xlib.pydispatch import dispatcher
from scrapy.signalmanager import SignalManager
import json , simplejson , ujson

#query=raw_input("Enter a product to search for= ")
query='bag'
query1=query.replace(" ", "+")  


class DmozItem(scrapy.Item):

    productname = scrapy.Field()
    product_link = scrapy.Field()
    current_price = scrapy.Field()
    mrp = scrapy.Field()
    offer = scrapy.Field()
    imageurl = scrapy.Field()
    outofstock_status = scrapy.Field()

class DmozSpider(scrapy.Spider):
    name = "dmoz"
    allowed_domains = ["http://www.firstcry.com"]


    def start_requests(self):

        task_urls = [
        ]
        i=1
        for i in range(1,2):
            temp = "http://www.firstcry.com/svcs/search.svc/GetSearchPagingProducts_new?PageNo=" + str(i) + "&PageSize=20&SortExpression=Relevance&SubCatId=&BrandId=&Price=&OUTOFSTOCK=&DISCOUNT=&Q=" + query1 + "&rating="
            task_urls.append(temp)
            i=i+1

        start_urls = (task_urls)
        p=len(task_urls)
        return [ Request(url = start_url) for start_url in start_urls ]


    def parse(self, response):
        print response

        items = []
        jsonresponse = dict(ujson.loads(response.body_as_unicode()))
#       jsonresponse = jsonresponse.replace("\\","")
#       jsonresponse = jsonresponse.decode('string_escape')
#       jsonresponse = ("%r" % json.loads(response.body_as_unicode()))
#       d= jsonresponse.json()
        #jsonresponse = jsonresponse.strip("/")
#       print jsonresponse
#       print d
#       print json.dumps("%r" % jsonresponse, indent=4, sort_keys=True)
#       a = simplejson.dumps(simplejson.loads(response.body_as_unicode()).replace("u\'","\'"), indent=4, sort_keys=True)
        #a= json.dumps(json.JSONDecoder().decode(jsonresponse))
        #a = ujson.dumps((ujson.loads(response.body_as_unicode())) , indent=4 )
        a=json.dumps(jsonresponse, indent=4)
        a=a.decode('string_escape')
        a=(a.decode('string_escape'))
#       a.gsub('\\', '')
        #a = a.strip('/')
        #print (jsonresponse)
        print a
        #print "%r" % a
#       print "%r" % json.loads(response.body_as_unicode())

        p=(jsonresponse["hits"])["hit"]
#       print p
#       raw_input()
        for x in p:
            item = DmozItem()
            item['productname'] = str(x['title'])
            item['product_link'] = "http://www.yepme.com/Deals1.aspx?CampId="+str(x["uniqueId"])
            item['current_price']='Rs. ' + str(x["price"])

            try:            
                p=x["marketprice"]
                item['mrp'] = 'Rs. ' + str(p)

            except:
                item['mrp'] = item['current_price']

            try:            
                item['offer'] = str(x["promotionalMsg"])
            except:
                item['offer'] = str('No additional offer available')

            item['imageurl'] = "http://staticaky.yepme.com/newcampaign/"+str(x["uniqueId"])[:-1]+"/"+str(x["smallimage"])
            item['outofstock_status'] = str('In Stock')
            items.append(item)

        print (items)

spider1 = DmozSpider()
settings = Settings()
settings.set("PROJECT", "dmoz")
settings.set("CONCURRENT_REQUESTS" , 100)
#)
settings.set( "DEPTH_PRIORITY" , 1)
settings.set("SCHEDULER_DISK_QUEUE" , "scrapy.squeues.PickleFifoDiskQueue")
settings.set( "SCHEDULER_MEMORY_QUEUE" , "scrapy.squeues.FifoMemoryQueue")
crawler = CrawlerProcess(settings)
crawler.crawl(spider1)
crawler.start()

【问题讨论】:

    标签: ajax web-scraping xmlhttprequest scrapy scrapy-spider


    【解决方案1】:

    无需复杂化。不要使用ujsonresponse.body_as_unicode(),然后将其转换为dict,只需使用常规jsonresponse.body

    $ scrapy shell "http://www.firstcry.com/svcs/search.svc/GetSearchPagingProducts_new?PageNo=1&PageSize=20&SortExpression=Relevence&SubCatId=&BrandId=&Price=&OUTOFSTOCK=&DISCOUNT=&Q=bag&rating="
    ...
    >>> jsonresponse = json.loads(response.body)
    >>> jsonresponse.keys()
    [u'ProductResponse']
    

    你的例子对我来说效果很好。看起来您对“四处寻找答案”模式有点深入;)

    我会注意到这一行...

    p=(jsonresponse["hits"])["hit"]
    

    ... 在您的代码中不起作用。解析 JSON 后,jsonresponse 中唯一可用的键是“ProductResponse”。该键包含另一个 JSON 对象,然后您可以像这样访问它:

    >>> product_response = json.loads(jsonresponse['ProductResponse'])
    >>> product_response['hits']['hit']
    [{u'fields': {u'_score': u'56.258633',
        u'bname': u'My Milestones',
        u'brandid': u'450',
    ...
    

    我认为这将为您提供您希望在 p 变量中获得的内容。

    【讨论】:

    • 哈哈!也许你说的对,我想达成一个解决方案!只是一个简单的疑问,product_response['hits']['hit'] 的所有键中存在的“u'”,当我想访问它们时,它们不会对我造成问题,即(product_response ["hits"]["hit")["fields"] 不行吗?这就是我想删除所有“u”的原因!所以,请帮我把它们也删掉!
    • “u”只是表示该字符串是一个Unicode字符串。那些你实际上不会出现在任何地方。字符串中唯一代表内容的部分用引号括起来。您是否有特定原因要删除 u's?
    • 不。实际上,如果你在场,我虽然无法访问密钥。但就您的解释而言,这不是问题!所以这对我来说太好了!我会在我的程序中尝试一次,然后我会标记你的答案!感谢您对@JoeLinux 的所有帮助! :) :D
    • 附带说明,由于您不了解 u,我猜您在开发 Python 时一定会遇到 Unicode 错误,所以请看一下这个演示文稿:farmdev.com/talks/unicode。这将帮助您弄清楚如何在 Python 中正确导航 Unicode 字符串。我不喜欢幻灯片,但那个链接很好。
    • 太棒了!非常感谢!顺便说一句,你能帮我解决这个问题吗?stackoverflow.com/questions/31309631/…。如果你也帮我解决这个问题,那你就太好了!非常感谢! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-09
    • 2022-01-02
    相关资源
    最近更新 更多