关于爬虫自己一直在看,所以时间太慢,这才第二更,有等不及的小伙伴可以慢慢的品尝了,在看下面的之前,建议先把上一章看一下。以下是关于python的Urllib的基础和高级用法。

1、如何扒下一个网站,用最短的时间

每一个网站都是根据url获取页面信息,页面信息就是通过一段html代码,加js、css。html是骨架,js是肌肉,css是衣服,一下写一个简单的实例:

  1. wolf@ubuntu-python:~/python$ sudo vi demo.py
  2. #!/usr/bin/python
  3. #coding:utf-8
  4. import urllib2 #导入urllib2库
  5.  
  6. response = urllib2.urlopen("http://www.baidu.com") #获取百度url
  7. print response.read() #读取url函数

这就是一个简单的爬虫,保存运行一下看看都爬取了什么。

  1. wolf@ubuntu-python:~/python$ python demo.py
  2. <html>
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  5. <META HTTP-EQUIV="Pragma" CONTENT="no-cache">
  6. <META HTTP-EQUIV="Cache-Control" CONTENT="no-cache">
  7. <META HTTP-EQUIV="Expires" CONTENT="">
  8. <title>百度一下,你就知道</title>
  9. </head>
  10. <body>
  11. <script>
  12. (function(d){
  13. function isCkie(){
  14. var isSupport=false;
  15. if(typeof(navigator.cookieEnabled)!='undefined'){
  16. isSupport=navigator.cookieEnabled;
  17. }
  18. return isSupport;
  19. }
  20.  
  21. //Cookie相关函数
  22. var sCkie=new function(){
  23. //过期时间
  24. this.expTime=function(millisecond){if(millisecond.length==){millisecond=};var exp=new Date();exp.setTime(exp.getTime()+parseInt(millisecond));return exp.toGMTString();};
  25. //创建cookie
  26. 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':'');};
  27. //删除cookie
  28. //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";}};
  29. //获取cookie
  30. this.get=function(name){var arg=name+"=";var alen=arg.length;var theCookie=''+d.cookie;var inCookieSite=theCookie.indexOf(arg);if(inCookieSite==-||name==""){return '';}var begin=inCookieSite+alen;var end=theCookie.indexOf(';',begin);if(end==-){end=theCookie.length;}return decodeURI(theCookie.substring(begin,end));};
  31. };
  32. var gUrl;
  33. if(isCkie()){
  34. var ckie=;
  35. var sid='lpvt_f6461a705844d7177814f8a1aa45aaa5';
  36. var skie=sCkie.get(sid);
  37. if (skie!='')
  38. {
  39. ckie=parseInt(skie);
  40. }
  41.  
  42. if(ckie<){
  43. var rand=Math.random();
  44. if(rand<1.8){
  45. gUrl="https://www.baidu.com/index.php?tn=01025065_7_pg";
  46. }else{
  47. gUrl="https://www.baidu.com/";
  48. }
  49. sCkie.add(sid,'',sCkie.expTime(**),,,);
  50. }else{
  51. gUrl="https://www.baidu.com/";
  52. }
  53. }else{
  54. gUrl="https://www.baidu.com/";
  55. }
  56. (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);
  57. })(document);
  58. </script>
  59. </body>
  60. </html>
  61.  
  62. wolf@ubuntu-python:~/python$

demo

没错,你没看错,这个就是简单的百度页面源码,是不是很简单。

2、解析上例

先看第一行导入库

  1. import urllib2 #导入urllib2库

urllib2是python的一个获取urls的组件它以urlopen函数的形式提供了一个非常简单的接口,也会根据urls的协议获取能力,提供比较复杂的接口,例如:基础验证、cookies、代理和其它。更多详情

第二行代码获取url

  1. response = urllib2.urlopen("http://www.baidu.com") #获取百度url

调用了urllib2库里的urlopen方法,传入一个url,协议是http协议,也可以换做ftp、file、https等等,只是代表了一种控制协议,urlopen一般接受三个参数,参数如下:

  1. urlopen(url, data, timeout)

第一个参数是url即为URL,第二个参数data是访问URL时要传送的数据,第三个timeout是超时时间。

后边的两个参数data、timeout是可以不传送的,data默认是空的,timeout默认为socket._GLOBAL_DEFAULT_TIMEOUT所以第一个参数是必须要传送的,上面的例子里传送里百度的url,执行urlopen方法之后,返回一个response对象,返回信息便保存在这里。

  1. print response.read() #读取url函数

response对象有一个read方法,可以获取页面的内容。

如果不加read直接打印会是什么?答案如下:

  1. wolf@ubuntu-python:~/python$ python demo.py
  2. <addinfourl at 139701058454736 whose fp = <socket._fileobject object at 0x7f0eb1e7b7d0>>

直接打印出的是对象的描述,所以一顶要加read方法,否则打印的就不是网页的内容了。

3、构造Requset

其实上面的urlopen参数可以传入一个request请求,它其实就是一个Requset类的实例,构造时需要传入url、Data等等等内容。所以上面的代码也可以这样写。

  1. wolf@ubuntu-python:~/python$ sudo vi demo.py
  2. #!/usr/bin/python
  3. #coding:utf-8
  4. import urllib2
  5.  
  6. request = urllib2.Request("http://www.baidu.com") #构建一个request对象
  7. response = urllib2.urlopen(request) #请求request对象的url
  8. print response.read() #读取request对象的url的函数

两者的运行结果是一样的,只是中间多了一个request对象,因为在构建请求时还需要加入好多内容,所以推荐大家这样写。通过构建一个request,服务器响应请求得到应答,这样显得逻辑清晰明确。

4、POST和GET数据传送

上面是最基本的网页抓取,不多对于大多数的动态网页,需要动态的传递参数给它,它做出对应的响应。所以,在访问时,需要传递数据给它。最常见的就是注册登录。

把数据用户名和密码传送到一个url,服务器得到处理之后到响应,后面如何处理,请继续往下看。

数据的传输分为POST和GET两个方式,至于两个方式的区别呢?下面为您揭晓。

最重要的是GET的方式是直接以链接的形式访问,链接  

  

  

  1. wolf@ubuntu-python:~/python$ sudo vi demo.py
  2. #!/usr/bin/python
  3. #coding:utf-
  4. import urllib2 #导入urllib2库
  5.  
  6. response = urllib2.urlopen("http://www.baidu.com") #获取百度url
  7. print response.read() #读取url函数

  

  

  

  

  

Python之路:爬虫之urllib库的基本使用和高级使用的更多相关文章

  1. python爬虫之urllib库(三)

    python爬虫之urllib库(三) urllib库 访问网页都是通过HTTP协议进行的,而HTTP协议是一种无状态的协议,即记不住来者何人.举个栗子,天猫上买东西,需要先登录天猫账号进入主页,再去 ...

  2. python爬虫之urllib库(二)

    python爬虫之urllib库(二) urllib库 超时设置 网页长时间无法响应的,系统会判断网页超时,无法打开网页.对于爬虫而言,我们作为网页的访问者,不能一直等着服务器给我们返回错误信息,耗费 ...

  3. python爬虫之urllib库(一)

    python爬虫之urllib库(一) urllib库 urllib库是python提供的一种用于操作URL的模块,python2中是urllib和urllib2两个库文件,python3中整合在了u ...

  4. python爬虫03 Urllib库

    Urllib   这可是 python 内置的库 在 Python 这个内置的 Urllib 库中 有这么 4 个模块 request request模块是我们用的比较多的 就是用它来发起请求 所以我 ...

  5. python 3.x 爬虫基础---Urllib详解

    python 3.x 爬虫基础 python 3.x 爬虫基础---http headers详解 python 3.x 爬虫基础---Urllib详解 前言 爬虫也了解了一段时间了希望在半个月的时间内 ...

  6. Python爬虫学习:Python内置的爬虫模块urllib库

    urllib库 urllib库是Python中一个最基本的网络请求的库.它可以模拟浏览器的行为发送请求(都是这样),从而获取返回的数据 urllib.request 在Python3的urllib库当 ...

  7. python爬虫之urllib库介绍

    一.urllib库 urllib是Python自带的一个用于爬虫的库,其主要作用就是可以通过代码模拟浏览器发送请求.其常被用到的子模块在Python3中的为urllib.request和urllib. ...

  8. python 爬虫之 urllib库

    文章更新于:2020-03-02 注:代码来自老师授课用样例. 一.初识 urllib 库 在 python2.x 版本,urllib 与urllib2 是两个库,在 python3.x 版本,二者合 ...

  9. Python 爬虫之urllib库的使用

    urllib库 urllib库是Python中一个最基本的网络请求库.可以模拟浏览器的行为,向指定的服务器发送一个请求,并可以保存服务器返回的数据. urlopen函数: 在Python3的urlli ...

随机推荐

  1. C#使用LitJson解析JSON(转)

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于JavaScript(Standard ECMA-262 3rd Edition - Decembe ...

  2. DEV TdxLayoutGroup设置tab

    TdxLayoutGroup 属性的 LayoutDirection :ldvertical,ldtabbed(显示tab页),ldhorizontal

  3. java 垃圾回收总结(可达性分析 引用分类

    java 垃圾回收总结(1)   以前看过很多次关于垃圾回收相关的文章,都只是看过就忘记了,没有好好的整理一下,发现写文章可以强化自己的记忆. java与C,c++有很大的不同就是java语言开发者不 ...

  4. 数据库出现1045 access denied for user 'root'@'localhost' using password yes (转)

    在mysql命令行中执行 SET PASSWORD FOR 'root'@'localhost' = PASSWORD('123456');  GRANT ALL PRIVILEGES ON *.*  ...

  5. HDU 1532 最大流入门

    1.HDU 1532 最大流入门,n个n条边,求第1点到第m点的最大流.只用EK做了一下. #include<bits/stdc++.h> using namespace std; #pr ...

  6. Java中的DateFormatter

    字母 日期或时间元素 表示 示例 G Era 标志符 Text AD y 年 Year 1996; 96 M 年中的月份 Month July; Jul;07 w 年中的周数 Number 27 W ...

  7. Java中自己实现枚举

    public class MyEnum { private final String name; public  static final MyEnum red = new MyEnum(" ...

  8. MVC5笔记【一】

    一.global.asax文件的作用:全局性配置文件 理解什么是路由? 有什么作用: 路由主要提供一个路由表 请求的时候被加载,请求url要去路由表当中去对照 规则 解析规则 控制器/动作放方法,转移 ...

  9. Java 反射 Class对象

    Java 反射 Class对象 @author ixenos 关键字:RTTI.动态绑定.动态加载.获得Class引用.泛型Class引用.newInstance的坑.JVM中的泛型类型信息 RTTI ...

  10. 2016弱校联盟十一专场10.2——Around the World

    题目链接:Around the World 题意: 给你n个点,有n-1条边,现在这n-1条边又多增加了ci*2-1条边,问你有多少条欧拉回路 题解: 套用best定理 Best Theorem:有向 ...