python根据京东商品url获取产品价格
京东商品详细的请求处理,是先显示html,然后再ajax请求处理显示价格。
1.可以运行js,并解析之后得到的html
2.模拟js请求,得到价格
#-*-coding:utf-8-*- """ 根据京东url地址,获取商品价格 京东请求处理过程,先显示html页面,然后通过ajaxget请求获取相应的商品价格 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请求代码如下: #//获得数字价格 #vargetPriceNum=function(skus,$wrap,perfix,callback){ #skus=typeofskus==='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){ #returnfalse; #} #for(vari=0;i<r.length;i++){ #varsku=r[i].id.replace('J_',''); #varprice=parseFloat(r[i].p,10); # #if(price>0){ #$wrap.find('.'+perfix+sku).html('¥'+r[i].p+''); #}else{ #$wrap.find('.'+perfix+sku).html('暂无报价'); #} # #if(typeofcallback==='function'){ #callback(sku,price,r); #} #} #} #}); #}; """ importurllib importjson importre classJdPrice(object): """ 对获取京东商品价格进行简单封装 """ def__init__(self,url): self.url=url self._response=urllib.urlopen(self.url) self.html=self._response.read() defget_product(self): """ 获取html中,商品的描述(未对数据进行详细处理,粗略的返回str类型) :return: """ product_re=re.compile(r'compatible:true,(.*?)};',re.S) product_info=re.findall(product_re,self.html)[0] returnproduct_info defget_product_skuid(self): """ 通过获取的商品信息,获取商品的skuid :return: """ product_info=self.get_product() skuid_re=re.compile(r'skuid:(.*?),') skuid=re.findall(skuid_re,product_info)[0] returnskuid defget_product_name(self): pass defget_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] ifprice_json['p']: price=price_json['p'] returnprice #测试代码 if__name__=='__main__': url='http://item.jd.com/1310118868.html' url='http://item.jd.com/1044773.html' jp=JdPrice(url) printjp.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)