python抓价记(3)

原创 2015年07月11日 00:17:53

下面来玩点有难度的,试了一堆B2C,发现某宁还真是与众不同。用之前的方法:

import urllib

url = 'http://product.suning.com/102365475.html'
print urllib.urlopen(url).read()
会发现这次不顶用了,会提示错误信息:

HTTPError: HTTP Error 302: The HTTP server returned a redirect error that would lead to an infinite loop.

这回可不像之前那么容易,想要搞定这个问题,需要有一点点的HTTP知识。再次打开httpfox, 在运行之前把cookie清空,以免然并卵。运行httpfox, 显示完价格就可以停了。博主对HTTP也不熟,所以跟踪信息就一条一条看吧。可以通过查看content知道捕获到的内容。经过简单的分析可以知道res.xxx的网址都是获取样式表,js脚本等资源的,imgxxx是获取网页里的图片与图标的,这些不是我们关注的。慢慢找会发现这么一条内容:

showSaleStatus({"cacheMinute":600,"saleInfo":[{"accountPlace":"","deptNo":"0001","factorySendFlag":"0","govPrice":"","invStatus":"1","juId":"","manageInvFlag":"0","netPrice":"15999.00","ownerPlace":"D017","partNumber":"000000000102365475","priceType":"0","promotionPrice":"15999.00","refPrice":"20624.00","salesOrg":"1900","sendAvalidTime":1436367973160,"sendCityId":"9254","vendor":"0010016172","vendorCode":"","vendorType":""}]});

promotionPrice和网页看到的价格一致,就是你了。提示一下虽然这里看到netPrice和promotionPrice价格一致,为什么博主认定是promotionPrice呢?原因在于多对比,就会发现实际的价格是促销价了。另外有一点,现在网站都喜欢用结构化的数据,因此type是json, xml, javascript的部分可以多留心。有时候可能content里会出现Error loading content (NS_ERROR_DOCUMENT_NOT_CACHED)的报错信息,这个时候把网址复制出来浏览器上一打,看看里面的真正内容是什么即可。

以上信息来至url:http://www.suning.com/webapp/wcs/stores/ItemPrice/000000000125695848__xxxx_xxxxx_1.html 试了一下其实这个网址是可以直接访问的,但是为了灵活起见,还是往前追一下这三串数字怎么来的。慢慢分析会发现,000000000125695848真正的名称叫curPartNumber,只要一开始的网页可以正常的request就可以找到,剩下两串数字是定位用的,你在哪个城市,哪个区,这些信息是通过http://ipservice.suning.com/ipQuery.do进行查询的。

经过这样逆向的分析就可以想办法得到完整的网址了,这一次的访问需要模拟浏览器的行为,需要有header, cookie等内容和网站进行交互,不然又要被重定向了。具体参见示例:

import urllib2
import cookielib
import re


def get_part_number(url):
    #httpHandler = urllib2.HTTPHandler()
    cookie = cookielib.CookieJar();
    opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie));
    response = opener.open(url)

    m = re.search(r'<input type="hidden" id="curPartNumber" value="(\d+)"/>', response.read())
    return m.group(1)


def get_price_url(part_number):
    location = urllib2.urlopen('http://ipservice.suning.com/ipQuery.do').read()
    loc_code_dict = eval(location)

    price_url = 'http://www.suning.com/webapp/wcs/stores/ItemPrice/%s__%s_%s_%s.html' %(part_number, loc_code_dict['cityCommerceId'], loc_code_dict['districtCommerceId'], loc_code_dict['districtLESId'].strip('0'))
    return price_url


def sn_parse(url):
    price_url = get_price_url(get_part_number(url))
    
    #httpHandler = urllib2.HTTPHandler()
    cookie = cookielib.CookieJar();
    opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie));
    response = opener.open(price_url)

    m = re.search(r'"saleInfo":\[(.+)\]', response.read())
    price_dict = eval(m.group(1))
    price = price_dict['promotionPrice']
    return price


if __name__ == '__main__':
    url = 'http://product.suning.com/102365475.html'
    print 'SN 5D: %s' %sn_parse(url)


python抓价记(4)

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

python抓价记(1)

其实很简单,打开盒子比价网,然后把要搜的东西弄进去搜,当然也可以自己填参数,然后把网址拷出来: html = urllib.urlopen('http://www.boxz.com/go3c/...
  • seabeam
  • seabeam
  • 2015年07月02日 00:07
  • 922

python抓价记(2)

昨天抓的太简单,今天来个稍微复杂点的:某东.为什么说难度要稍微大一点呢?首先还是做尝试,用一段很简单的代码看看能用脚本得到些什么. import urllib url = 'http://item....
  • seabeam
  • seabeam
  • 2015年07月02日 21:55
  • 559

开始自己的周记,学习总结

0608-0613 本周主要在公司重装了产品,将case测完了,才发现最开始发给intern的文档是多么的重要。 学习内容主要是Python,Python的两大优势:一是学习起来不难,二是解释性脚本语...
  • qq_18989901
  • qq_18989901
  • 2015年06月13日 22:11
  • 917

用Python做个网络抓包工具之为Winpcapy写个过滤器filter

用Python做个网络抓包工具之为Winpcapy写个过滤器filter http://www.cnblogs.com/tt-0411/archive/2011/12/01/2270676.html...
  • oMingZi12345678
  • oMingZi12345678
  • 2014年01月05日 22:21
  • 2655

python+scapy 抓包与解析

python scapy 抓包 解析
  • B0rn_T0_W1n
  • B0rn_T0_W1n
  • 2016年05月09日 09:13
  • 21653

python调用tcpdump抓包过滤

之前在linux用python脚本写一个抓包分析小工具,是在不想用什么libpcap、pypcap所以,简单来了个tcpdump加grep搞定。基本思路是分别起tcpdump和grep两个进程,进程直...
  • wangqiuyun
  • wangqiuyun
  • 2015年07月20日 13:06
  • 11597

Python编写网络抓包脚本

Python编写网络抓包脚本 2009-03-13 22:29:17 http://blog.chinaunix.net/uid-16865301-id-97371.html ...
  • oMingZi12345678
  • oMingZi12345678
  • 2014年01月05日 22:13
  • 4228

使用Python来分离或者直接抓取pcap抓包文件中的HTTP流

Python是世界上最好的语言!它使用不可见的制表键作为其语法的一部分!Vim和Emacs的区别在于,它可以帮助乌干达的儿童...不讨论哲学,不看第一印象,也没有KPI相逼,但是Python真的做到了...
  • dog250
  • dog250
  • 2016年08月06日 08:05
  • 9690

Python实现抓取访问特定URL的数据包

这篇文章紧接着《使用Python来分离或者直接抓取pcap抓包文件中的HTTP流》展开,那篇文章是昨天写的,今天早上突然又想实现一个直接抓包的程序,于是天没亮就又爬起来了...        Pyth...
  • dog250
  • dog250
  • 2016年08月07日 10:46
  • 7612
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:python抓价记(3)
举报原因:
原因补充:

(最多只允许输入30个字)