python抓价记(2)

news/2024/7/19 10:41:25 标签: python, 爬虫, 比价

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

python">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.提交到查询网址获取实际价格

python">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也是个贵的。




http://www.niftyadmin.cn/n/679977.html

相关文章

mysql id顺序为什么是乱的_MySQL:为什么按照ID按顺序比其他列的顺序慢?

我使用MySQL版本5.5.14从500万行的表中运行以下查询QUERY 1:SELECT P.ID, P.Type, P.Name, P.cty, X(P.latlng) as lat, Y(P.latlng) as lng, P.cur, P.ak, P.tn, P.St, P.Tm, P.flA, P.ldA, P.flN, P.lv, P.bd, P.bt, P.nb, P.ak * E.usD as usPFROM PIG PINNER JO…

python抓价记(3)

下面来玩点有难度的,试了一堆B2C,发现某宁还真是与众不同。用之前的方法: import urlliburl http://product.suning.com/102365475.html print urllib.urlopen(url).read()会发现这次不顶用了,会提示错误信息: HTTPEr…

python抓价记(4)

很长时间没有更新,这次算是最终BOSS了吧。这么说也不合适,毕竟遇到的问题不一样,且就那么过吧。最后的任务:某蛋。 某蛋比较特别的是使用了图片作为价格,这种方法某东还有别的网站有用过,但是放弃了。当初…

span字体加粗_认识div和span容器

div和span的使用这节我们来制作以下效果我们先把四个段落的文字都写出来,分别包含在p标签里现在看到的效果如下我们来一点一点给它加入样式首先,来使文字水平居中并且加背景色但是这样显示的效果有一些问题,直接加入文字背景会显示背景顶着两…

那些没有root权限的岁月:一分钟解决mutt No mailbox

最近被公司的mutt整的很头疼,总是提示No mailbox, 其实原因在于没有root权限,/var/spool/mail/USER_NAME这个文件夹不存在又建立不了。之前思路不对,在度娘搜索mutt no mailbox毛都搜不到。其实解决办法很简单: 在用户的home目录…

linux开启mysql远程连接的设置步骤_Linux开启mysql远程连接的设置步骤

Mysql默认root用户只能本地访问,不能远程连接管理?设置步骤如下:1、GRANT命令创建远程连接mysql授权用户itloggermysql -u root -pmysql>GRANT ALL PRIVILEGES ON *.* TO itloggerlocalhost IDENTIFIED BY ‘www.itlogger.com’ WITH GRAN…

安装Windows后恢复CentOS 7 grub2启动项

如果在度娘上搜装windows恢复grub,或者再加一个关键字rescue,八成会搜到同一篇文章及其衍生版,大体思路是没问题的,但是操作起来就不是那么回事了。事故起因是博主装了Win10, 把之前安装过的Linux grub给覆盖掉了。解决步骤如下:(1). 得把启动…

mysql链式_mysql 链式复制

最近项目中有用到双主双从结构的mysql 配置。按平常默认配置, 测试数据不一致。 查资料链式数制需要开启log-slave-updates 选项 ,即通常情况,从服务器从主服务器接收到的更新不记入它的二进制日志,开户log-slave-updates选项从服…