Python中urllib+urllib2+cookielib模块编写爬虫实战
超文本传输协议http构成了万维网的基础,它利用URI(统一资源标识符)来识别Internet上的数据,而指定文档地址的URI被称为URL(既统一资源定位符),常见的URL指向文件、目录或者执行复杂任务的对象(如数据库查找,internet搜索),而爬虫实质上正是通过对这些url进行访问、操作,从而获取我们想要的内容。对于没有商业需求的我们而言,想要编写爬虫的话,使用urllib,urllib2与cookielib三个模块便可以完成很多需求了。 import urllib2 connect= urllib2.Request('http://www.baidu.com') url1 = urllib2.urlopen(connect) print url.read() 短短4行在运行之后,就会显示出百度页面的源代码。它的机理是什么呢? import urllib2 url1="http://bbs.tianya.cn/post-16-835537-" url3=".shtml#ty_vip_look[%E6%8B%89%E9%A3%8E%E7%86%8A%E7%8C%AB" for i in range(1,481): a=urllib2.Request(url1+str(i)+url3) b=urllib2.urlopen(a) path=str("D:/noval/天眼传人"+str(i)+".html") c=open(path,"w+") code=b.read() c.write(code) c.close print "当前下载页数:",i 事实上,上面的代码使用urlopen就可以达到相同的效果了: import urllib2 url1="http://bbs.tianya.cn/post-16-835537-" url3=".shtml#ty_vip_look[%E6%8B%89%E9%A3%8E%E7%86%8A%E7%8C%AB" for i in range(1,481): #a=urllib2.Request(url1+str(i)+url3) b=urllib2.urlopen((url1+str(i)+url3) path=str("D:/noval/天眼传人"+str(i)+".html") c=open(path,i 为什么我们还需要先对url进行request处理呢?这里需要引入opener的概念,当我们使用urllib处理url的时候,实际上是通过urllib2.OpenerDirector实例进行工作,他会自己调用资源进行各种操作如通过协议、打开url、处理cookie等。而urlopen方法使用的是默认的opener来处理问题,也就是说,相当的简单粗暴~对于我们post数据、设置header、设置代理等需求完全满足不了。 而对于一些没有特别要求的网站,仅仅使用urllib的2个模块其实就可以获取到我们想要的信息了,但是一些需要模拟登陆或者需要权限的网站,就需要我们处理cookies后才能顺利抓取上面的信息,这时候就需要Cookielib模块了。cookielib 模块就是专门用来处理cookie相关了,其中比较常用的方法就是能够自动处理cookie的CookieJar()了,它可以自动存储HTTP请求生成的cookie,并向传出HTTP的请求中自动添加cookie。正如我前文所提到的,想要使用它的话,需要创建一个新的opener: import cookielib,urllib2 cj = cookielib.CookieJar() opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj)) 经过这样的处理后,cookie的问题就解决了~ 抓取豆瓣同城、登陆图书馆查询图书归还 (一)抓取豆瓣网站同城活动 豆瓣北京同城活动 该链接指向豆瓣同城活动的列表,向该链接发起request: # encoding=utf-8 import urllib import urllib2 import cookielib import re cj=cookielib.CookieJar() opener=urllib2.build_opener(urllib2.HTTPCookieProcessor(cj)) url="http://beijing.douban.com/events/future-all?start=0" req=urllib2.Request(url) event=urllib2.urlopen(req) str1=event.read() 我们会发现返回的html代码中,除了我们需要的信息之外,还夹杂了大量的页面布局代码: 如上图所示,我们只需要中间那些关于活动的信息。而为了提取信息,我们就需要正则表达式了~ 这里我使用捕获分组,将活动四要素(名称,时间,地点,费用)为标准进行分组,得到的表达式如下: 复制代码 代码如下: regex=re.compile(r'summary">([dD]*?)</span>[dD]*?class="hidden-xs">([dD]*?)<time[dD]*?<li title="([dD]*?)">[dD]*?strong>([dD]*?)</strong>') 这样就可以将几个部分提取出来了。
总体代码如下: # -*- coding: utf-8 -*- #--------------------------------------- # program:豆瓣同城爬虫 # author:GisLu # data:2014-02-08 #--------------------------------------- import urllib import urllib2 import cookielib import re cj=cookielib.CookieJar() opener=urllib2.build_opener(urllib2.HTTPCookieProcessor(cj)) #正则提取 def search(str1): regex=re.compile(r'summary">([dD]*?)</span>[dD]*?class="hidden-xs">([dD]*?)<time[dD]*?<li title="([dD]*?)">[dD]*?strong>([dD]*?)</strong>') for i in regex.finditer(str1): print "活动名称:",i.group(1) a=i.group(2) b=a.replace('</span>','') print b.replace('n','') print '活动地点:',i.group(3) c=i.group(4).decode('utf-8') print '费用:',c #获取url for i in range(0,5): url="http://beijing.douban.com/events/future-all?start=" url=url+str(i*10) req=urllib2.Request(url) event=urllib2.urlopen(req) str1=event.read() search(str1) 在这里需要注意一下编码的问题,因为我使用的版本还是python2.X,所以在内部汉字字符串传递的时候需要来回转换,比如在最后打印“费用“这一项的时候,必须使用 最后得到的结果如下,大功告成~ (二)模拟登陆图书馆系统查询书籍归还情况 既然我们能够通过python向指定网站发出请求获取信息,那么自然也能通过python模拟浏览器进行登陆等操作~ 这里就以本人学校的图书馆系统为例子~ 我们可以通过模拟登陆,最后进入图书管理系统查询我们借阅的图书归还情况。首先要进行抓包分析我们需要发送哪些信息才能成功模拟浏览器进行登陆操作。 我使用的是chrome浏览器,在登陆页面按F12调出chrome自带的开发工具,选择network项就可以输入学号密码选择登陆了。 分析这个post指令后,可以确认其就是发送登陆信息(账号、密码等)的关键命令。 现在postdata 跟headers的格式我们全部知道了~模拟登陆就很简单了: import urllib #--------------------------------------- # @program:图书借阅查询 # @author:GisLu # @data:2014-02-08 #--------------------------------------- import urllib2 import cookielib import re cj=cookielib.CookieJar() opener=urllib2.build_opener(urllib2.HTTPCookieProcessor(cj)) opener.addheaders = [('User-agent','Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)')] urllib2.install_opener(opener) #登陆获取cookies postdata=urllib.urlencode({ 'user':'X1234564','pw':'demacialalala','imageField.x':'0','imageField.y':'0'}) rep=urllib2.Request( url='http://210.45.210.6/dzjs/login.asp',data=postdata ) result=urllib2.urlopen(rep) print result.geturl()
import urllib #--------------------------------------- # @program:图书借阅查询 # @author:GisLu # @data:2014-02-08 #--------------------------------------- import urllib2 import cookielib import re cj=cookielib.CookieJar() opener=urllib2.build_opener(urllib2.HTTPCookieProcessor(cj)) opener.addheaders = [('User-agent','Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)')] urllib2.install_opener(opener) #登陆获取cookies postdata=urllib.urlencode({ 'user':'X11134564',data=postdata ) result=urllib2.urlopen(rep) print result.geturl() #获取账目表 Postdata=urllib.urlencode({ 'nCxfs':'1','submit1':'检索'}) aa=urllib2.Request( url='http://210.45.210.6/dzjs/jhcx.asp',data=Postdata ) bb=urllib2.urlopen(aa) cc=bb.read() zhangmu=re.findall('tdborder4 >(.*?)</td>',cc) for i in zhangmu: i=i.decode('gb2312') i=i.encode('gb2312') print i.strip(' ') 下面是程序运行结果~ (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- python – 我可以使用bazaar提交一个大文件,还是有更好的方
- python – 在os.startfile()中运行时隐藏控制台?
- python – 给出两个整数列表,我们怎样才能从另一个列表中找
- Django-pipeline’compressed’不是一个有效的标记库:Impo
- Python3实现从文件中读取指定行的方法
- python3下使用cv2.imwrite存储带有中文路径图片的方法
- 无法用Python拆分String
- python – Django 1.9:在`django.setup()`中我应该避免导入
- python – 使用numba JIT加速函数的麻烦
- Python开发的实用计算器完整实例