前一篇http://www.cnblogs.com/liyinggang/p/6094338.html 使用了爬虫爬取hdu 的代码,今天实现了将数据向hdu 提交的功能,接下来就是需要将两个功能合并了.
这里感谢綦大神的博客, 不仅ACM玩得厉害,而且还精通各种语言.我辈楷模,我从他这里学会了怎么使用 chrome 抓包.按 F12,然後去找到NetWork就行了.然后就可以看到各种信息.
比如在hdu的登录界面我们就可以看到如下信息:
然后可以根据这些信息确定这个网页是需要Post方法还是GET方法,还有header的信息,以及发送数据的格式等等.
我们总共是有三个网页需要进行解析:
登录
网页:http://acm.hdu.edu.cn/userloginex.php?action=login 数据: username=用户名&userpass=密码&login=Sign+In
提交:
网页:http://acm.hdu.edu.cn/submit.php?action=submit 数据:problemid=pid&language=lang&usercode=code&check=1
然后获取状态的页面,下载好了然后再用正则表达式去匹配.这里对于每个网页的下载,特别是这个 status 页面,我用自己写的Download 函数下不下来,可能是HDU做了什么防爬虫的手段...这里关于传输数据,下载在网上参考了别人写的代码才搞定,但是它的正则表达式是有问题的...说说这个正则表达式吧,真的弄了我好久,因为我一直想很贪心的把自己的提交记录一下子就给匹配到,这样反而做不好 (反正我是弄不好一句话去匹配,总是匹配多了 = =) 后来我直接先把所有的 <tr ** > </tr> 标签弄出来,然后到每个里面找我的提交记录,这样分开处理要好多了,然后找状态就很简单了.这里网页里面如果有 \n 符用 .*? 是匹配不到的,因为 . 是不包括换行符的所有字符,所以要用 [\s\S]或者 [\d\D]这种.
/**这一段是更新,不看也无妨**/
/*************更新*******************************/ 这里的话有另一种的方法可以得到我们所需的表单提交时所需的信息,我们能够利用 lxml.html 的 cssselect 进行解析。 /*********************************************/ #coding:utf-8 import urllib2 import lxml.html __author__ = 'liyinggang' def getInputFromForm(html): '''This method is to use all the input tags of the form ''' tree = lxml.html.fromstring(html) data = {} for e in tree.cssselect('form input'): #使用css选择器遍历表单所有 input标签 if e.get('name'): data[e.get('name')] = e.get('value') return data if __name__ == '__main__': url = 'http://acm.hdu.edu.cn/userloginex.php' html = urllib2.urlopen(url).read() getInputFromForm(html)