突然心血来潮想抓一个京东的商品价格,突然发现网页的源码里没有价格这一项,只有商品的编号,网上说是显示的同事js从数据库里取出商品价格,放在页面上,那么我只能模拟请求了。哇咔咔,记得去你给京东投简历之后就没有然后了,难道就因为我也叫京东,你这也太浮夸了,给我幼小心灵造成创伤了。
原本要写一下creepy这个模块来抓取了,但今天时间不够了,明天还要上班。。。。明天再写那个模块吧,据说是台湾大牛开发的,超级给力。
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类型)
"""
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
"""
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):
"""
通过获取的商品信息,获取商品的name
"""
#'\u4e2d\u6587'.decode('unicode-escape') (你可能需要print它才能看到结果)
product_info = self.get_product()
#源码中名称左右有两个',所以过滤的时候应该去掉
name_re = re.compile(r"name: '(.*?)',")
name = re.findall(name_re, product_info)[0]
return name.decode('unicode-escape')#将其转换为中文
def get_product_price(self):
"""
根据商品的skuid信息,请求获得商品price
:return:
"""
price = None
#得到产品的序号和名称,取价格的时候会用得到
skuid = self.get_product_skuid()
name = self.get_product_name()
print name
#通过httpfox检测得知,每次网页都会访问这个网页去提取价格嵌入到html中
url = 'http://p.3.cn/prices/mgets?skuIds=J_' + skuid + '&type=1'
#json调整格式,并将其转化为utf-8,列表中只有一个字典元素所以取出第一个元素就转化为字典
price_json = json.load(urllib.urlopen(url))[0]
#p对应的价格是我们想要的
if price_json['p']:
price = price_json['p']
return price
if __name__ == '__main__':
print "+"*20+"welcome to 京东放养的爬虫"+"+"*20
url = 'http://item.jd.com/1217524.html'
jp = JdPrice(url)
print jp.get_product_price()
print "+"*20+"welcome to 京东放养的爬虫"+"+"*20
原文地址:http://blog.csdn.net/djd1234567/article/details/45353265