Python 刮泥机问题

Python 刮泥机问题,python,ajax,json,web-scraping,scrapy,Python,Ajax,Json,Web Scraping,Scrapy,我正试着用刮痧来刮-。该网站使用AJAX请求,以XHR的形式显示搜索结果 我设法找到了XHR,AJAX响应类似于JSON,但实际上不是JSON 这是其中一个XHR请求的链接-。如果正确查看URL,则参数-page_count-负责显示不同页面的结果,而参数-userQuery-负责传递给网站的搜索查询 现在,如果您看到正确的响应。它实际上不是JSON,只是看起来类似于JSON(我在上面对它进行了静脉注射)。我想用SCRAPY来处理这个问题(SCRAPY只是因为它是一个框架,比使用其他库(如Bea

我正试着用刮痧来刮-。该网站使用AJAX请求,以XHR的形式显示搜索结果

我设法找到了XHR,AJAX响应类似于JSON,但实际上不是JSON

这是其中一个XHR请求的链接-。如果正确查看URL,则参数-page_count-负责显示不同页面的结果,而参数-userQuery-负责传递给网站的搜索查询

现在,如果您看到正确的响应。它实际上不是JSON,只是看起来类似于JSON(我在上面对它进行了静脉注射)。我想用SCRAPY来处理这个问题(SCRAPY只是因为它是一个框架,比使用其他库(如BeautifulSoup)要快,因为用它们来创建一个以如此高的速度进行处理的scraper需要花费大量的精力,这是我想用SCRAPY的唯一原因)

现在,这是我的代码片段,用于从URL-提取JSON响应:

    jsonresponse = json.loads(response.body_as_unicode())
    print json.dumps(jsonresponse, indent=4, sort_keys=True)
在执行代码时,它向我抛出一个错误,声明-:

2015-07-05 12:13:23 [scrapy] INFO: Scrapy 1.0.0 started (bot: scrapybot)
2015-07-05 12:13:23 [scrapy] INFO: Optional features available: ssl, http11
2015-07-05 12:13:23 [scrapy] INFO: Overridden settings: {'DEPTH_PRIORITY': 1, 'SCHEDULER_MEMORY_QUEUE': 'scrapy.squeues.FifoMemoryQueue', 'SCHEDULER_DISK_QUEUE': 'scrapy.squeues.PickleFifoDiskQueue', 'CONCURRENT_REQUESTS': 100}
2015-07-05 12:13:23 [scrapy] INFO: Enabled extensions: CloseSpider, TelnetConsole, LogStats, CoreStats, SpiderState
2015-07-05 12:13:23 [scrapy] INFO: Enabled downloader middlewares: HttpAuthMiddleware, DownloadTimeoutMiddleware, UserAgentMiddleware, RetryMiddleware, DefaultHeadersMiddleware, MetaRefreshMiddleware, HttpCompressionMiddleware, RedirectMiddleware, CookiesMiddleware, ChunkedTransferMiddleware, DownloaderStats
2015-07-05 12:13:23 [scrapy] INFO: Enabled spider middlewares: HttpErrorMiddleware, OffsiteMiddleware, RefererMiddleware, UrlLengthMiddleware, DepthMiddleware
2015-07-05 12:13:23 [scrapy] INFO: Enabled item pipelines: 
2015-07-05 12:13:23 [scrapy] INFO: Spider opened
2015-07-05 12:13:23 [scrapy] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)
2015-07-05 12:13:23 [scrapy] DEBUG: Telnet console listening on 127.0.0.1:6023
2015-07-05 12:13:24 [scrapy] DEBUG: Crawled (200) <GET https://search.paytm.com/search/?page_count=2&userQuery=tv&items_per_page=30&resolution=960x720&quality=high&q=tv&cat_tree=1&callback=angular.callbacks._6> (referer: None)
2015-07-05 12:13:24 [scrapy] ERROR: Spider error processing <GET https://search.paytm.com/search/?page_count=2&userQuery=tv&items_per_page=30&resolution=960x720&quality=high&q=tv&cat_tree=1&callback=angular.callbacks._6> (referer: None)
Traceback (most recent call last):
  File "/usr/lib/python2.7/dist-packages/twisted/internet/defer.py", line 577, in _runCallbacks
    current.result = callback(current.result, *args, **kw)
  File "Startup App/SCRAPERS/paytmscraper_scrapy/paytmspiderscript.py", line 111, in parse
    jsonresponse = json.loads(response.body_as_unicode())
  File "/usr/lib/python2.7/json/__init__.py", line 338, in loads
    return _default_decoder.decode(s)
  File "/usr/lib/python2.7/json/decoder.py", line 366, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/usr/lib/python2.7/json/decoder.py", line 384, in raw_decode
    raise ValueError("No JSON object could be decoded")
ValueError: No JSON object could be decoded
2015-07-05 12:13:24 [scrapy] INFO: Closing spider (finished)
2015-07-05 12:13:24 [scrapy] INFO: Dumping Scrapy stats:
{'downloader/request_bytes': 343,
 'downloader/request_count': 1,
 'downloader/request_method_count/GET': 1,
 'downloader/response_bytes': 6483,
 'downloader/response_count': 1,
 'downloader/response_status_count/200': 1,
 'finish_reason': 'finished',
 'finish_time': datetime.datetime(2015, 7, 5, 6, 43, 24, 733187),
 'log_count/DEBUG': 2,
 'log_count/ERROR': 1,
 'log_count/INFO': 7,
 'response_received_count': 1,
 'scheduler/dequeued': 1,
 'scheduler/dequeued/memory': 1,
 'scheduler/enqueued': 1,
 'scheduler/enqueued/memory': 1,
 'spider_exceptions/ValueError': 1,
 'start_time': datetime.datetime(2015, 7, 5, 6, 43, 23, 908135)}
2015-07-05 12:13:24 [scrapy] INFO: Spider closed (finished)
2015-07-05 12:13:23[scrapy]信息:scrapy 1.0.0已启动(bot:scrapybot)
2015-07-05 12:13:23[scrapy]信息:可选功能:ssl、http11
2015-07-05 12:13:23[scrapy]信息:覆盖的设置:{'DEPTH_PRIORITY':1,“调度程序内存队列”:'scrapy.sques.FifoMemoryQueue','SCHEDULER_DISK_QUEUE':'scrapy.sques.picklefiodiskqueue','CONCURRENT_REQUESTS':100}
2015-07-05 12:13:23[scrapy]信息:启用的扩展:CloseSpider、TelnetConsole、LogStats、CoreStats、SpiderState
2015-07-05 12:13:23[scrapy]信息:启用的下载中间件:HttpAuthMiddleware、DownloadTimeoutMiddleware、UserAgentMiddleware、RetryMiddleware、DefaultHeadersMiddleware、MetaRefreshMiddleware、HttpCompressionMiddleware、RedirectMiddleware、Cookies Middleware、ChunkedTransferMiddleware、DownloadersStats
2015-07-05 12:13:23[scrapy]信息:启用的蜘蛛中间件:HttpErrorMiddleware、OffItemIDdleware、RefererMiddleware、UrlLengthMiddleware、DepthMiddleware
2015-07-05 12:13:23[scrapy]信息:启用的项目管道:
2015-07-05 12:13:23[刮擦]信息:蜘蛛打开了
2015-07-05 12:13:23[抓取]信息:抓取0页(0页/分钟),抓取0项(0项/分钟)
2015-07-05 12:13:23[scrapy]调试:Telnet控制台监听127.0.0.1:6023
2015-07-05 12:13:24[scrapy]调试:爬网(200)(参考:无)
2015-07-05 12:13:24[scrapy]错误:蜘蛛错误处理(参考:无)
回溯(最近一次呼叫最后一次):
文件“/usr/lib/python2.7/dist packages/twisted/internet/defer.py”,第577行,在runCallbacks中
current.result=回调(current.result,*args,**kw)
文件“Startup App/SCRAPERS/paytmscraper_scrapy/paytmspiderscript.py”,第111行,解析
jsonresponse=json.loads(response.body_为_unicode())
文件“/usr/lib/python2.7/json/_init__.py”,第338行,加载
返回\u默认\u解码器。解码
文件“/usr/lib/python2.7/json/decoder.py”,第366行,在decode中
obj,end=self.raw\u decode(s,idx=\u w(s,0.end())
原始解码中的文件“/usr/lib/python2.7/json/decoder.py”,第384行
raise VALUERROR(“无法解码JSON对象”)
ValueError:无法解码任何JSON对象
2015-07-05 12:13:24[scrapy]信息:关闭卡盘(已完成)
2015-07-05 12:13:24[scrapy]信息:倾销scrapy统计数据:
{'downloader/request_bytes':343,
“下载程序/请求计数”:1,
“downloader/request\u method\u count/GET”:1,
“downloader/response_字节”:6483,
“下载程序/响应计数”:1,
“下载程序/响应状态\计数/200”:1,
“完成原因”:“完成”,
“完成时间”:datetime.datetime(2015,7,5,6,43,24733187),
“日志计数/调试”:2,
“日志计数/错误”:1,
“日志计数/信息”:7,
“响应\u已接收\u计数”:1,
“调度程序/出列”:1,
“调度程序/出列/内存”:1,
“调度程序/排队”:1,
“调度程序/排队/内存”:1,
“spider_异常/ValueError”:1,
“开始时间”:datetime.datetime(2015,7,5,6,43,23908135)}
2015-07-05 12:13:24[scrapy]信息:十字轴关闭(完成)
现在,我的问题是,如何使用Scrapy刮取这样的响应?如果需要任何其他代码,请随时在注释中询问。我愿意给你

请提供与此相关的完整代码。非常感谢!也许对JSON响应的一些操作(来自python)(类似于字符串比较)对我也有用,如果它能帮我解决这个问题的话


注:我不能每次都手工修改JSON响应,因为这是网站给出的响应。因此,请建议一种编程(pythonic)方法来实现这一点。我最好使用Scrapy作为我的框架

如果查看not JSON结果,很明显它包含一个JSON

如果从响应中删除angular.callbacks的
类型。\u 6==“函数”和&angular.callbacks.\u 6(
初始部分和
最后得到一个有效的JSON,可以使用JSONLint进行验证


最终的解决方案是在响应中分别找到第一个和最后一个出现的
{
}
,并提取其中的文本(包括那些花括号)并将其与
json一起使用。加载
而不是整个结果。

如果查看非json结果,很明显它包含一个json

如果从响应中删除angular.callbacks的
类型。\u 6==“函数”和&angular.callbacks.\u 6(
初始部分和
最后得到一个有效的JSON,可以使用JSONLint进行验证

最终,解决方案是在响应中分别找到第一个和最后一个出现的
{
}
,并提取其中的文本(包括那些花括号),并将其与
json一起使用。加载
而不是整个结果。

更改:

https://search.paytm.com/search/?page_count=2&userQuery=tv&items_per_page=30&resolution=960x720&quality=high&q=tv&cat_tree=1&callback=angular.callbacks._6
致:

。。还有JSON。

更改:

https://search.paytm.com/search/?page_count=2&userQuery=tv&items_per_page=30&resolution=960x720&quality=high&q=tv&cat_tree=1&callback=angular.callbacks._6
致:

。。还有JSON。

Paytm提供JSON数据