python抓价记(3)

news/2024/7/19 11:32:15 标签: python, 爬虫, 比价

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

python">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等内容和网站进行交互,不然又要被重定向了。具体参见示例:

python">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)



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

相关文章

python抓价记(4)

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

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

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

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

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

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

Mysql默认root用户只能本地访问&#xff0c;不能远程连接管理&#xff1f;设置步骤如下&#xff1a;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,八成会搜到同一篇文章及其衍生版&#xff0c;大体思路是没问题的&#xff0c;但是操作起来就不是那么回事了。事故起因是博主装了Win10, 把之前安装过的Linux grub给覆盖掉了。解决步骤如下&#xff1a;(1). 得把启动…

mysql链式_mysql 链式复制

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

黄色的mysql_小黄的MySQL学习之路-02

在使用之前,需要先导入一个sql文件.文件如下:检索数据① 准备工作创建一个vendors表CREATE TABLE vendors(vend_id INT PRIMARY KEY AUTO_INCREMENT,vend_name CHAR(50),vend_address CHAR(50),vend_city CHAR(50),vend_state CHAR(50),vend_zip CHAR(50),vend_country CHAR(50…

SystemVerilog中的$cast()向下类型转换

在UVM中经常可以看到$cast的身影&#xff0c;这是SV的build-in task之一&#xff0c;当然它还有function的版本&#xff0c;这里不讨论。说到这&#xff0c;不得不提到“类型转换”这个术语&#xff0c;SV和很多其他语言一样&#xff0c;都支持特定类型间的相互转换。SV类型转换…