Python之路:爬虫之urllib库的基本使用和高级使用
2016-07-25 23:06
781 查看
关于爬虫自己一直在看,所以时间太慢,这才第二更,有等不及的小伙伴可以慢慢的品尝了,在看下面的之前,建议先把上一章看一下。以下是关于python的Urllib的基础和高级用法。
1、如何扒下一个网站,用最短的时间
每一个网站都是根据url获取页面信息,页面信息就是通过一段html代码,加js、css。html是骨架,js是肌肉,css是衣服,一下写一个简单的实例:
这就是一个简单的爬虫,保存运行一下看看都爬取了什么。
demo
没错,你没看错,这个就是简单的百度页面源码,是不是很简单。
2、解析上例
先看第一行导入库
urllib2是python的一个获取urls的组件它以urlopen函数的形式提供了一个非常简单的接口,也会根据urls的协议获取能力,提供比较复杂的接口,例如:基础验证、cookies、代理和其它。更多详情。
第二行代码获取url
调用了urllib2库里的urlopen方法,传入一个url,协议是http协议,也可以换做ftp、file、https等等,只是代表了一种控制协议,urlopen一般接受三个参数,参数如下:
第一个参数是url即为URL,第二个参数data是访问URL时要传送的数据,第三个timeout是超时时间。
后边的两个参数data、timeout是可以不传送的,data默认是空的,timeout默认为socket._GLOBAL_DEFAULT_TIMEOUT所以第一个参数是必须要传送的,上面的例子里传送里百度的url,执行urlopen方法之后,返回一个response对象,返回信息便保存在这里。
response对象有一个read方法,可以获取页面的内容。
如果不加read直接打印会是什么?答案如下:
直接打印出的是对象的描述,所以一顶要加read方法,否则打印的就不是网页的内容了。
3、构造Requset
其实上面的urlopen参数可以传入一个request请求,它其实就是一个Requset类的实例,构造时需要传入url、Data等等等内容。所以上面的代码也可以这样写。
两者的运行结果是一样的,只是中间多了一个request对象,因为在构建请求时还需要加入好多内容,所以推荐大家这样写。通过构建一个request,服务器响应请求得到应答,这样显得逻辑清晰明确。
4、POST和GET数据传送
上面是最基本的网页抓取,不多对于大多数的动态网页,需要动态的传递参数给它,它做出对应的响应。所以,在访问时,需要传递数据给它。最常见的就是注册登录。
把数据用户名和密码传送到一个url,服务器得到处理之后到响应,后面如何处理,请继续往下看。
数据的传输分为POST和GET两个方式,至于两个方式的区别呢?下面为您揭晓。
最重要的是GET的方式是直接以链接的形式访问,链接
1、如何扒下一个网站,用最短的时间
每一个网站都是根据url获取页面信息,页面信息就是通过一段html代码,加js、css。html是骨架,js是肌肉,css是衣服,一下写一个简单的实例:
wolf@ubuntu-python:~/python$ sudo vi demo.py #!/usr/bin/python #coding:utf-8 import urllib2 #导入urllib2库 response = urllib2.urlopen("http://www.baidu.com") #获取百度url print response.read() #读取url函数
这就是一个简单的爬虫,保存运行一下看看都爬取了什么。
wolf@ubuntu-python:~/python$ python demo.py <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <META HTTP-EQUIV="Pragma" CONTENT="no-cache"> <META HTTP-EQUIV="Cache-Control" CONTENT="no-cache"> <META HTTP-EQUIV="Expires" CONTENT="0"> <title>百度一下,你就知道</title> </head> <body> <script> (function(d){ function isCkie(){ var isSupport=false; if(typeof(navigator.cookieEnabled)!='undefined'){ isSupport=navigator.cookieEnabled; } return isSupport; } //Cookie相关函数 var sCkie=new function(){ //过期时间 this.expTime=function(millisecond){if(millisecond.length==0){millisecond=0};var exp=new Date();exp.setTime(exp.getTime()+parseInt(millisecond));return exp.toGMTString();}; //创建cookie this.add=function(name,value,expires,path,domain,secure){d.cookie=name+"="+encodeURI(value)+(expires?(';expires='+expires):'')+(path?(';path='+path):'')+(domain?(';domain='+domain):'')+((secure)?';secure':'');}; //删除cookie //this.del=function(name,path,domain){if(getCookie(name)){document.cookie=name+"="+((path)?(";path="+path):'')+((domain)?(";domain="+domain):'')+";expires=Mon,01-Jan-2006 00:00:01 GMT";}}; //获取cookie this.get=function(name){var arg=name+"=";var alen=arg.length;var theCookie=''+d.cookie;var inCookieSite=theCookie.indexOf(arg);if(inCookieSite==-1||name==""){return '';}var begin=inCookieSite+alen;var end=theCookie.indexOf(';',begin);if(end==-1){end=theCookie.length;}return decodeURI(theCookie.substring(begin,end));}; }; var gUrl; if(isCkie()){ var ckie=0; var sid='lpvt_f6461a705844d7177814f8a1aa45aaa5'; var skie=sCkie.get(sid); if (skie!='') { ckie=parseInt(skie); } if(ckie<1){ var rand=Math.random(); if(rand<1.8){ gUrl="https://www.baidu.com/index.php?tn=01025065_7_pg"; }else{ gUrl="https://www.baidu.com/"; } sCkie.add(sid,'1',sCkie.expTime(30*60*1000),0,0,0); }else{ gUrl="https://www.baidu.com/"; } }else{ gUrl="https://www.baidu.com/"; } (function(u){if(window.navigate&&typeof navigate=='function')navigate(u);var ua=navigator.userAgent;if(ua.match(/applewebkit/i)){var h = document.createElement('a');h.rel='noreferrer';h.href=u;document.body.appendChild(h);var evt=document.createEvent('MouseEvents');evt.initEvent('click', true,true);h.dispatchEvent(evt);}else{document.write('<meta http-equiv="Refresh" Content="0; Url='+u+'" >');}})(gUrl); })(document); </script> </body> </html> wolf@ubuntu-python:~/python$
demo
没错,你没看错,这个就是简单的百度页面源码,是不是很简单。
2、解析上例
先看第一行导入库
import urllib2 #导入urllib2库
urllib2是python的一个获取urls的组件它以urlopen函数的形式提供了一个非常简单的接口,也会根据urls的协议获取能力,提供比较复杂的接口,例如:基础验证、cookies、代理和其它。更多详情。
第二行代码获取url
response = urllib2.urlopen("http://www.baidu.com") #获取百度url
调用了urllib2库里的urlopen方法,传入一个url,协议是http协议,也可以换做ftp、file、https等等,只是代表了一种控制协议,urlopen一般接受三个参数,参数如下:
urlopen(url, data, timeout)
第一个参数是url即为URL,第二个参数data是访问URL时要传送的数据,第三个timeout是超时时间。
后边的两个参数data、timeout是可以不传送的,data默认是空的,timeout默认为socket._GLOBAL_DEFAULT_TIMEOUT所以第一个参数是必须要传送的,上面的例子里传送里百度的url,执行urlopen方法之后,返回一个response对象,返回信息便保存在这里。
print response.read() #读取url函数
response对象有一个read方法,可以获取页面的内容。
如果不加read直接打印会是什么?答案如下:
wolf@ubuntu-python:~/python$ python demo.py <addinfourl at 139701058454736 whose fp = <socket._fileobject object at 0x7f0eb1e7b7d0>>
直接打印出的是对象的描述,所以一顶要加read方法,否则打印的就不是网页的内容了。
3、构造Requset
其实上面的urlopen参数可以传入一个request请求,它其实就是一个Requset类的实例,构造时需要传入url、Data等等等内容。所以上面的代码也可以这样写。
wolf@ubuntu-python:~/python$ sudo vi demo.py #!/usr/bin/python #coding:utf-8 import urllib2 request = urllib2.Request("http://www.baidu.com") #构建一个request对象 response = urllib2.urlopen(request) #请求request对象的url print response.read() #读取request对象的url的函数
两者的运行结果是一样的,只是中间多了一个request对象,因为在构建请求时还需要加入好多内容,所以推荐大家这样写。通过构建一个request,服务器响应请求得到应答,这样显得逻辑清晰明确。
4、POST和GET数据传送
上面是最基本的网页抓取,不多对于大多数的动态网页,需要动态的传递参数给它,它做出对应的响应。所以,在访问时,需要传递数据给它。最常见的就是注册登录。
把数据用户名和密码传送到一个url,服务器得到处理之后到响应,后面如何处理,请继续往下看。
数据的传输分为POST和GET两个方式,至于两个方式的区别呢?下面为您揭晓。
最重要的是GET的方式是直接以链接的形式访问,链接
wolf@ubuntu-python:~/python$ sudo vi demo.py
#!/usr/bin/python
#coding:utf-8
import urllib2 #导入urllib2库
response = urllib2.urlopen("http://www.baidu.com") #获取百度urlprint response.read() #读取url函数
相关文章推荐
- Python爬虫学习系列教程-----------爬虫系列 你值的收藏
- python脚本爬取今日百度热点新闻
- python中静态方法和类方法的区别
- BeautifulSoup4的初步使用
- 解决python读取中文文件乱码问题
- python
- python 学习 (七) 循环嵌套
- python(二) N的阶乘对M取余
- Python中的分片
- python笔记---需求文件requirements.txt的创建及使用
- python基础 - 文件读写
- windows64 配置numpy,scipy,theano
- python函数式编程
- Python 添加自定义模块
- Python 添加自定义模块
- python——基本数据类型+常用操作符+循环
- Python语言_思维导图
- 【python】choice函数
- 看python和莫名其妙学做网页。。。。
- Python画柱状统计图