python抓价记(2)

昨天抓的太简单,今天来个稍微复杂点的:某东.为什么说难度要稍微大一点呢?首先还是做尝试,用一段很简单的代码看看能用脚本得到些什么.

import urllib

url = 'http://item.jd.com/592891.html'
print urllib.urlopen(url).read()

把HTML抓出来了,回到网页看看:



博主想抓取的价格在“京东价”之后,右边有个“降价通知”,而下面还有个“促销信息”。回到之前抓取到的网页源代码看看:



本来应该显示价格的地方毛都没有,这种情况一般是网页用JS或者向别的网页查询得到价格数据。这时候你需要有个firefox,再把httpfox插件装好。然后进入这个页面,打开插件,出来一堆信息,哪个才是想要的呢?

用关键字搜索吧,price,只留下四条记录了,而且四条都是GET方法获取数据的。一条一条的看,用一开始的那段代码一试便知。结果发现下面会出一堆信息,而短网址只会出现三个信息,这是一个JSON格式的数据,在httpfox上的type一栏也写的很清楚,把得到的数据拿回和网页一对便知,id后面跟的一串数字和网页上的“商品编号”一致,p后面的数字就是博主希望得到的价格,和网页上的京东价,而另一个m后的,博主猜是京东认定的所谓原价,你懂的。

所以查询网址是重点,如果只想抓这一款,那么把网址截下来就够了,但是如果想要做个重用的东西,那就得分析一下这段网址了。

http://p.3.cn/prices/get?skuid=J_592891&type=1&area=1_72_2799&callback=cnp
多抓取几个商品总结一下规律可以知道,skuid=J_后面跟的是商品代码,后面的一串都不变,area是配送区域有没有都可以,后面调用的callback函数更可以没有。现在思路很清楚了:

1.找到skuid

2.提交到查询网址获取实际价格

import re
import urllib

def jd_get_id(url):
    h = urllib.urlopen(url).readlines()
    pattern = re.compile(r'skuid:\s*(\d+)')
    return re.findall(pattern, str(h))[0]

def jd_parse(url):
    price_url = 'http://p.3.cn/prices/get?skuid=J_%s' %str(jd_get_id(url))
    struct = urllib.urlopen(price_url).read()
    struct = struct.replace('[', '').replace(']', '')
    price = eval(struct)['p']
    return price

if __name__ == '__main__':
    url = 'http://item.jd.com/592891.html'
    print 'JD 5D: %s' %jd_parse(url)

稍微解释一下,get_id函数是正则表达式的用法上一篇简单说明过了,重点在于parse函数。其第三行,把'['和']'替换掉了,是因为返回的字符串是[{xxxxx}]的json串,去掉中括号以后就是一个标准的dict结构了,很容易查询p对应的值是多少。


JD也是个贵的。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值