python根据京东商品url获取产品价格


Posted in Python onAugust 09, 2015

京东商品详细的请求处理,是先显示html,然后再ajax请求处理显示价格。
1.可以运行js,并解析之后得到的html
2.模拟js请求,得到价格

# -*- coding: utf-8 -*-
"""
根据京东url地址,获取商品价格
京东请求处理过程,先显示html页面,然后通过ajax get请求获取相应的商品价格
 
1.商品的具体数据在html中的格式,如下(示例)
# product: {
#     skuid: 1310118868,
#     name: '\u9999\u5f71\u77ed\u88d9\u4e24\u4ef6\u5957\u88c5\u5973\u0032\u0030\u0031\u0034\u51ac\u88c5\u65b0\u6b3e\u97e9\u7248\u957f\u8896\u0054\u6064\u4e0a\u8863\u8377\u53f6\u8fb9\u534a\u8eab\u88d9\u6f6e\u0020\u85cf\u9752\u0020\u004d',
#     skuidkey:'7781F505B71CE37A3AFBADA119D3587F',
#     href: 'http://item.jd.com/1310118868.html',
#     src: 'jfs/t385/197/414081450/336886/3070537b/541be890N2995990c.jpg',
#     cat: [1315,1343,1355],
#     brand: 18247,
#     nBrand: 18247,
#     tips: false,
#     type: 2,
#     venderId:38824,
#     shopId:'36786',
#     TJ:'0',
#     specialAttrs:["is7ToReturn-1"],
#     videoPath:'',
#     HM:'0'
#   }
 
2.ajax请求代码如下:
# // 获得数字价格
# var getPriceNum = function(skus, $wrap, perfix, callback) {
#   skus = typeof skus === 'string' ? [skus]: skus;
#   $wrap = $wrap || $('body');
#   perfix = perfix || 'J-p-';
#   $.ajax({
#     url: 'http://p.3.cn/prices/mgets?skuIds=J_' + skus.join(',J_') + '&type=1',
#     dataType: 'jsonp',
#     success: function (r) {
#       if (!r && !r.length) {
#         return false;
#       }
#       for (var i = 0; i < r.length; i++) {
#         var sku = r[i].id.replace('J_', '');
#         var price = parseFloat(r[i].p, 10);
#
#         if (price > 0) {
#           $wrap.find('.'+ perfix + sku).html('¥' + r[i].p + '');
#         } else {
#           $wrap.find('.'+ perfix + sku).html('暂无报价');
#         }
#
#         if ( typeof callback === 'function' ) {
#           callback(sku, price, r);
#         }
#       }
#     }
#   });
# };
"""
import urllib
import json
import re
 
 
class JdPrice(object):
  """
  对获取京东商品价格进行简单封装
  """
  def __init__(self, url):
    self.url = url
    self._response = urllib.urlopen(self.url)
    self.html = self._response.read()
 
  def get_product(self):
    """
    获取html中,商品的描述(未对数据进行详细处理,粗略的返回str类型)
    :return:
    """
    product_re = re.compile(r'compatible: true,(.*?)};', re.S)
    product_info = re.findall(product_re, self.html)[0]
    return product_info
 
  def get_product_skuid(self):
    """
    通过获取的商品信息,获取商品的skuid
    :return:
    """
    product_info = self.get_product()
    skuid_re = re.compile(r'skuid: (.*?),')
    skuid = re.findall(skuid_re, product_info)[0]
    return skuid
 
  def get_product_name(self):
    pass
 
  def get_product_price(self):
    """
    根据商品的skuid信息,请求获得商品price
    :return:
    """
    price = None
    skuid = self.get_product_skuid()
    url = 'http://p.3.cn/prices/mgets?skuIds=J_' + skuid + '&type=1'
    price_json = json.load(urllib.urlopen(url))[0]
    if price_json['p']:
      price = price_json['p']
    return price
 
 
# 测试代码
if __name__ == '__main__':
  url = 'http://item.jd.com/1310118868.html'
  url = 'http://item.jd.com/1044773.html'
  jp = JdPrice(url)
  print jp.get_product_price()
 
 
# htm.decode('gb2312', 'ignore').encode('utf-8')
# f = open('jjs.html', 'w')
# f.write(htm)
# f.close()

再给大家分享一个京东价格的爬虫:

fromcreepyimportCrawler
fromBeautifulSoupimportBeautifulSoup
importurllib2
importjson

classMyCrawler(Crawler):
defprocess_document(self,doc):
ifdoc.status==200:
print[%d]%s%(doc.status,doc.url)
try:
soup=BeautifulSoup(doc.text.decode(gb18030).encode(utf-8))
exceptExceptionase:
printe
soup=BeautifulSoup(doc.text)
printsoup.find(id="product-intro").div.h1.text
url_id=urllib2.unquote(doc.url).decode(utf8).split(/)[-1].split(.)[0]
f=urllib2.urlopen(http://p.3.cn/prices/get?skuid=J_+url_id,timeout=5)
price=json.loads(f.read())
f.close()
printprice[0][p]
else:
pass

crawler=MyCrawler()
crawler.set_follow_mode(Crawler.F_SAME_HOST)
crawler.set_concurrency_level(16)
crawler.add_url_filter(.(jpg|jpeg|gif|png|js|css|swf)$)
crawler.crawl(http://item.jd.com/982040.html)
Python 相关文章推荐
python刷投票的脚本实现代码
Nov 08 Python
使用Python发送邮件附件以定时备份MySQL的教程
Apr 25 Python
用matplotlib画等高线图详解
Dec 14 Python
Python迭代器与生成器基本用法分析
Jul 26 Python
django框架中间件原理与用法详解
Dec 10 Python
Python Tornado之跨域请求与Options请求方式
Mar 28 Python
使用Python对Dicom文件进行读取与写入的实现
Apr 20 Python
python实现126邮箱发送邮件
May 20 Python
python用opencv完成图像分割并进行目标物的提取
May 25 Python
Python中常见的导入方式总结
May 06 Python
Python超简单容易上手的画图工具库推荐
May 10 Python
python编程学习使用管道Pipe编写优化代码
Nov 20 Python
python制作一个桌面便签软件
Aug 09 #Python
Python 实现简单的电话本功能
Aug 09 #Python
python批量提取word内信息
Aug 09 #Python
python实现下载指定网址所有图片的方法
Aug 08 #Python
Python实现多线程抓取妹子图
Aug 08 #Python
通过Python来使用七牛云存储的方法详解
Aug 07 #Python
Python爬虫框架Scrapy实战之批量抓取招聘信息
Aug 07 #Python
You might like
php文件服务实现虚拟挂载其他目录示例
2014/04/17 PHP
为PHP安装imagick时出现Cannot locate header file MagickWand.h错误的解决方法
2014/11/03 PHP
关于php中的json_encode()和json_decode()函数的一些说明
2016/11/20 PHP
php获取'/'传参的值简单方法
2017/07/13 PHP
深入理解PHP的远程多会话调试
2017/09/21 PHP
Laravel如何实现自动加载类
2019/10/14 PHP
扩展String功能方法
2006/09/22 Javascript
用jQuery扩展自写的 UI导航
2010/01/13 Javascript
js Map List 遍历使用示例
2013/07/10 Javascript
asp.net刷新本页面的六种方法总结
2014/01/07 Javascript
Jquery倒计时源码分享
2014/05/16 Javascript
js父页面与子页面不同时显示的方法
2014/10/16 Javascript
node.js中的path.extname方法使用说明
2014/12/09 Javascript
Jquery实现鼠标移动放大图片功能实例
2015/03/25 Javascript
详解AngularJS中的作用域
2015/06/17 Javascript
Angular.js中上传指令ng-upload的基本使用教程
2017/07/30 Javascript
vue地址栏直接输入路由无效问题的解决
2018/11/15 Javascript
vue 进阶之实现父子组件间的传值
2019/04/26 Javascript
如何实现双向绑定mvvm的原理实现
2019/05/28 Javascript
vue里的data要用return返回的原因浅析
2019/05/28 Javascript
微信小程序可滑动月日历组件使用详解
2019/10/21 Javascript
[49:27]2018DOTA2亚洲邀请赛 4.4 淘汰赛 TNC vs VG 第一场
2018/04/05 DOTA
Numpy数组转置的两种实现方法
2018/04/17 Python
python单例模式获取IP代理的方法详解
2018/09/13 Python
详解python tkinter教程-事件绑定
2019/03/28 Python
将python2.7添加进64位系统的注册表方式
2019/11/20 Python
Python tkinter实现简单加法计算器代码实例
2020/05/13 Python
Python Matplotlib绘图基础知识代码解析
2020/08/31 Python
Python+Xlwings 删除Excel的行和列
2020/12/19 Python
发现世界上最好的珠宝设计师:JewelStreet
2017/12/17 全球购物
关于幼儿的自我评价
2013/12/18 职场文书
区长工作作风个人整改措施
2014/10/01 职场文书
焦裕禄纪念馆观后感
2015/06/09 职场文书
机关干部作风整顿心得体会
2016/01/22 职场文书
股东协议书范本2016
2016/03/21 职场文书
winserver2019安装软件一直卡在应用程序正在为首次使用做准备
2022/06/10 Servers