爬蟲學習一系列:urllib2抓取網頁內容
所謂網頁抓取,就是把URL地址中指定的網絡資源從網絡中讀取出來,保存到本地。我們平時在瀏覽器中通過網址瀏覽網頁,只不過我們看到的是解析過的頁面效果,而通過程序獲取的則是程序源代碼。我們通過使用Python中urllib2來獲取網頁的URL資源,最簡單方法就是調用urlopen 方法。
1 # coding : utf-8 2 import urllib2 3 import urllib 4 5 url = 'http://www.baidu.com' 6 res = urllib2.urlopen(url) 7 print res.read()
HTTP是基於請求和應答機制—客戶端提出請求,服務端提供應答。
urllib2用一個Request對象來映射你提出的HTTP請求,通過調用urlopen來傳入Request對象,將返回一個相關請求response對象,這個應答對象如同一個文件對象,所以我們可以在Response對象中調用read()方法來讀取。
1 # coding : utf-8 2 import urllib2 3 import urllib 4 5 url = 'http://www.baidu.com' 6 request = urllib2.Request(url) 7 res = urllib2.urlopen(request) 8 print res.read()
在HTTP請求時,我們還可以發送data表單數據。一般的HTML表單,data需要編碼成標准形成,然后作為data參數傳到Request對象。而相應的編碼工作就不能用urllib2來完成了,而是我們urllib組件。
1 import urllib 2 import urllib2 3 4 url = 'http://www.someserver.com/register.cgi' 5 6 values = {'name' : 'BaiYiShaoNian', 7 'localtion' : 'ChongQing', 8 'language' : 'Python', 9 } 10 11 data = urllib.urlencode(values) 12 req = urllib2.Request(url,data) 13 response = urllib2.urlopen(req) 14 the_page = response.read() 15 16 print the_page
但是我有一個疑問:就是這一份代碼並不能運行,我還不知道傳入數據表單的作用是什么,或者我們在抓cnblogs頁面時,傳入登錄的信息,是不是我們就可以登錄博客園了啊,所以在這里請教一下大牛,先感謝了。
通過正則表達式來獲取網頁部分信息
正則表達式,又稱為正則表示法、常規表示法。正則表達式使用單個字符串來描述、匹配一系列符號某個句法規則的字符串。通俗的說,正則表達式就是在程序中定義了字符串的某種規則,然后我們在網頁源代碼中找出符合這種規則的所有代碼語句,不符合的就淘汰不要。
關於正則表達式的很多具體用法,我后面會邊學邊為大家講解的,這里先略過。
我們可以通過Python爬蟲來獲取以下網頁中新聞標題和新聞的ID。
1 # -*- coding: utf-8 -*- 2 import urllib2 3 import re 4 5 # 1.獲取訪問頁面的HMTL 6 url = "http://www.nenu.edu.cn/newslist.php?cid=1" 7 8 response = urllib2.urlopen(url) 9 html = response.read() 10 # 2.根據正則表達式抓取特定內容 11 r = re.compile(r'<a href="intramural/content/news/(?P<ID>.{5}).*" target="_blank">(?P<Title>.+)</a>') 12 news = r.findall(html) 13 for i in range(len(news)): 14 ID = news[i][0] 15 title = news[i][1] 16 # data = data.decode('utf-8') 17 # title = title.decode('utf-8') 18 print title + " " + ID + " "
我們運行這一份代碼看看結果是什么樣的,是否已經成功獲取。
