用python抓取网站数据

淘宝网站有一个后台,记录了和卖家进行交易过的所有买家信息,现在需要把它们抓下来,得到用户名与消费额度。这个还有点意思,整好继续锻炼python。

首先到客户管理页面一看,比我想象中的要复杂一些,不是比如通过get方式在url里指定开始的页数之类。不能被吓到恩,分析了一下下一页的按钮,发现 href 为 javascript:navigate(‘customerListform’,2,425); 。继续,navigate干了什么呢?有意义的只有两步:document.getElementById(‘__CUR_PAGE’).value=page; gotoPageNew(formname); 后面的formname就是customerListform,继续gotoPageNew,也是两件事:document.getElementById(‘__IS_REPLY_SELECT_COUNT’).value=”N”; document.getElementById(formname).submit();

那回头看名为customerListform的form,里面有很多input,根据名字猜测一下含义,大概有第几页,每页多少之类。于是我来了个暴力的,直接把每页改成4200行(总共4147),提交,结果服务端真的没有判断的,于是整个页面就卡在那里了,慢慢开。我汗一下,并且服务端记下了每个用户的设置,也就是说我再打开,还是每页4200的。幸好一直很悲剧的网络现在比较争气,吃了个饭回来居然打开了,赶紧改掉,然后网页保存下来,其实现在就可以开始提取数据了,但这样完全达不到要求啊,每次要手动改网页里的东西,网速慢还可能打不开。

有个保底的了,就可以慢慢研究了,现在的情况就是要构造一个POST了,LiveHttpHeader看了下,然后又搜了搜python构造http请求,最后用了下面的方法:

raw_dict = {"name" : "test", "pwd" : "test"}
args = urllib.urlencode(raw_dict)
con2 = httplib.HTTPConnection("eshop.alisoft.com")
con2.request("POST", "/qbuilder/c2cCustomer!customerList.jspa", args, headers)
r2 = con2.getresponse()
while 1:
    ttt = r2.read(2048)
    if not ttt:
        break;
    temp += ttt
con2.close()

发送的数据的话本来是准备自己构造的,就是把那些input全都发送了,但返回总是500错误。= =这个我也无法调试了,谁知道服务器内部发生了什么,以为是自己参数发少了,又把所有的input全发送了,但还是这个问题。后来干脆将LiveHTTPHeader里的所有数据全拷过来了,再加上所有的Headers,果然200了。

数据是有了,但还没处理,要分析html,用sax我是没想出来怎么办,minidom据说很慢,于是改用lxml,然后,悲剧的事出现了,又是字符编码问题,如果python没有这个问题的话真的是完美了,怎么也无法用etree生成一棵树,如果直接从string parser的话,不管是print 出来还是转换成utf-8后写入utf-8文件,永远有错误。最后放弃掉了,只好用re。还真是悲剧啊!
每一个用户的话都是一行,id都是9位数字加tr,还是比较好匹配的,再对每一行配置span和td,取得中间的内容就是用户名和钱了。

当然,一个程序写起来只占一小部分时间,debug才是要人命的地方。乱码又出现了,最后解决方案是在抓数据时decode成unicode,然后处理的时候先转换成utf8,最后连MySQL的时候,不要忘记了数据库、表都要是utf8的,并且要set names utf8。

完了吗?NO,还有问题,这次是网络问题了,如果每页40的话,总共有105页,而抓下来一个就处理的话,多了就会出现10060 socket错误,oh,这就是我悲剧的网络啊,没办法,每抓一个页面都sleep(1)。然后亲爱的MySQL也有问题了,取完数据马上insert,速度过快,会出现命令不同步的错误,我觉得不至于吧应该,这每秒才几十条语句啊,后来找到据说是因为MySQLdb模块太old了,= =|||。没办法,每次execute后都commit一下。最后还被网速卡了下,又是10060,没办法,上50m VPN吧,uu,我爱你!

可以改进的地方:用urllib2实例化一个cookie对象,然后可以要用户输入用户名密码,先连taobao的网站,取得cookie,再在接下来的请求里使用cookie这样就不用手动更改cookie了,但是由于最后的网站后台是在eshop.alisoft.com,我估计中间还有另外的setcookie之类的过程,应该有点麻烦,不过思路是很清晰的了。

发表评论?

1 条评论。

  1. 刚看了一点urllib2库的内容
    还是用urllib2好

发表评论


注意 - 你可以用以下 HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>