網頁

2010年2月8日 星期一

使用 python + curl 取得網頁內容(1)

為了讓機器人能從網路上搜尋資訊第一步就是讓機器人程式取得網頁的內容,我們可以利用 curl 這個函式庫來幫我們處理取得網頁,事實上 curl 能做的事情很多它能做 HTTP、HTTPS 細部設定並且支援多種協定如 Telnet、FTP、SCP 以及 LDAP 等,是很方便的工具。

以下是一段 python 程式,它的功能是用來取得 http://robotexp.blogspot.com/ 也就是本站的內容

#! /usr/bin/env python
import pycurl

class GetPage:
    def __init__ (self, url):
        self.contents = ''
        self.url = url

    def read_page (self, buf):
        self.contents = self.contents + buf

    def show_page (self):
        print self.contents

mypage = GetPage("http://robotexp.blogspot.com/")
testcurl = pycurl.Curl()
testcurl.setopt(testcurl.URL, mypage.url)
testcurl.setopt(testcurl.WRITEFUNCTION, mypage.read_page)
testcurl.perform()
testcurl.close()
mypage.show_page()

執行這支程式時會將整個頁面 html 下載並顯示在終端機上,然而我們希望 curl 讀取網頁時它的行為能更像一般瀏覽器,首先我們希望它向網站發出 Request 時做一些偽裝。
以下為利用 wireshark 擷取 pycurl 預設的 GET Request:
GET / HTTP/1.1
User-Agent: PycURL/7.19.5
Host: robotexp.blogspot.com
Accept: */*

實際上網頁伺服器會紀錄這些 Request 訊息,伺服器管理者可以從這段訊息的 User-Agent 得知使用者以哪種瀏覽器瀏覽網頁,而 User-Agent: PycURL/7.19.5 很明顯暴露使用者不是以瀏覽器來瀏覽網頁,因此必須修改 curl 的 User-Agent 設定使它看起來像一般瀏覽器,以下我們就讓 curl 偽裝成 Opera 吧!
 
將先前的程式碼修改如下,即可將 User-Agent 訊息置換成 Opera:

#! /usr/bin/env python
import pycurl

class GetPage:
    def __init__ (self, url):
        self.contents = ''
        self.url = url

    def read_page (self, buf):
        self.contents = self.contents + buf

    def show_page (self):
        print self.contents

class GetPageByFakeBrowser(GetPage):
    def __init__ (self, url, ua):
        self.contents = ''
        self.url = url
        self.ua = ua

mypage = GetPageByFakeBrowser( \
"http://robotexp.blogspot.com/", \
"Opera/9.80 (Windows NT 5.1; U; cs) Presto/2.2.15 Version/10.00")
testcurl = pycurl.Curl()
testcurl.setopt(testcurl.URL, mypage.url)
testcurl.setopt(testcurl.USERAGENT, mypage.ua)
testcurl.setopt(testcurl.WRITEFUNCTION, mypage.read_page)
testcurl.perform()
testcurl.close()
mypage.show_page()

沒有留言:

張貼留言