10行代码爬取网页
功能的可行性:从http协议到tcp协议,相信大家做过计算机网络的FTP大实验对protocol 这个术语有了更加深刻的了解了。所以我们只要遵循相应的协议,获取一个网页上的内容就是很容易的了, 所谓的DOS(denial-of-service)攻击也不过是这样么,我们如果有用户名和密码,他不让我们登录才不科学呢。知道了这点,突然心潮澎湃,只要他是个网页注定要对我们打开大门,但是能光能入门还不行,还得知道人家的规矩,不然人家还是会拒客的,就像到餐馆吃饭,他得让你进去,不让你进去就是侵犯人权,闹大了还的上美国法院或许都能得到天价赔偿,但是你如果在门口张牙舞爪,不符合规矩,保安叔叔还是会请您回避的~所以下面我们还得老老实实看如何遵循服务器的要求进行爬取网页。
首先, 如果这个网页不需要登录,把你的url拷贝到服务器上就能加载下来网页,那样就比较简单了。使用python 一句话:
content = urllib2.urlopen(url).read()
content就是我们要访问的网页了。
如果需要登录呢?也很简单把表单填好就可以了。这次有些复杂,不过还是可以写成一句话:
urllib2.urlopen(urllib2.Request(url, urllib.urlencode(params))).read()
其中params是你要提交的表单数据。
哈哈,太简单了,赶紧启动个python gui去爬info.tsinghua.edu.cn吧, 忙碌一番发现,搞不定啊,进不去,哭泣。。。。。。。。。。。。
只见info大喝一声,info重地,岂容尔等小儿放肆!
遭遇当头一喝的我们赶紧检查我们的过程出现了什么问题?怎么才能登录info呢?还是看看我们通过浏览器登录的时候出现了都上缴了什么买路钱吧。
果然info还是留了一手,在你的提交表单中多了2项,x,y, x,y有什么用处,没发现,人就这么着了,你怎么滴吧。
ok,发现了这个小问题知道怎么搞了吧,把你的参数多加一项啊。改好之后,怀着忐忑的心情,应该是这样了吧,然后。。。唉,下载下来的不是你登录后的页面,还是登录之前的页面。
好吧,还有什么问题呢?Cookie。这是防止非法登录的另一个手段。这个问题好复杂啊,所以一句话搞不定了,好吧,牺牲一下,3句话搞定吧。
spider = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookielib.LWPCookieJar()))
urllib2.install_opener(spider)
content = spider.open(urllib2.Request(url, params)).read()
获得了网页代码之后怎么解析网页呢?推荐一个利器中的利器——pyquery.使用python封装了一遍jquery的所有操作。好吧,我服了,写一个网页并解析一共用了不到10行代码。。。这真实我们程序猿的福音啊!
-----------------------------
Xu Wang
School of Software, Tsinghua.
Mobile:+8618810456160
Mails: xu-wang11@mails.tsinghua.edu.cn