Python之路:爬蟲之urllib庫的基本使用和高級使用

關於爬蟲本身一直在看,因此時間太慢,這才第二更,有等不及的小夥伴能夠慢慢的品嚐了,在看下面的以前,建議先把上一章看一下。如下是關於python的Urllib的基礎和高級用法。php

一、如何扒下一個網站,用最短的時間css

每個網站都是根據url獲取頁面信息,頁面信息就是經過一段html代碼,加js、css。html是骨架,js是肌肉,css是衣服,一下寫一個簡單的實例:html

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函數

這就是一個簡單的爬蟲,保存運行一下看看都爬取了什麼。python

 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="0">
 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==0){millisecond=0};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==-1||name==""){return '';}var begin=inCookieSite+alen;var end=theCookie.indexOf(';',begin);if(end==-1){end=theCookie.length;}return decodeURI(theCookie.substring(begin,end));};
31 };
32 var gUrl;
33 if(isCkie()){
34         var ckie=0;
35         var sid='lpvt_f6461a705844d7177814f8a1aa45aaa5';
36         var skie=sCkie.get(sid);
37         if (skie!='')
38         {
39                 ckie=parseInt(skie);
40         }
41 
42         if(ckie<1){
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,'1',sCkie.expTime(30*60*1000),0,0,0);
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

沒錯,你沒看錯,這個就是簡單的百度頁面源碼,是否是很簡單。web

二、解析上例ubuntu

先看第一行導入庫服務器

import urllib2  #導入urllib2庫

urllib2是python的一個獲取urls的組件它以urlopen函數的形式提供了一個很是簡單的接口,也會根據urls的協議獲取能力,提供比較複雜的接口,例如:基礎驗證、cookies、代理和其它。更多詳情cookie

第二行代碼獲取urlapp

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

調用了urllib2庫裏的urlopen方法,傳入一個url,協議是http協議,也能夠換作ftp、file、https等等,只是表明了一種控制協議,urlopen通常接受三個參數,參數以下:dom

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方法,不然打印的就不是網頁的內容了。

三、構造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,服務器響應請求獲得應答,這樣顯得邏輯清晰明確。

四、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")  #獲取百度url    
print response.read()   #讀取url函數
相關文章
相關標籤/搜索