爬蟲入門-02-爬蟲模塊介紹

爬蟲入門-爬蟲模塊介紹

Python的urllib和urllib2模塊都做與請求URL相關的操作,但他們提供不同的功能。
他們兩個最顯着的差異如下:

  • urllib2可以接受一個Request對象,並以此可以來設置一個URL的headers,但是urllib只接收一個URL。
    這意味着,你不可以通過urllib模塊僞裝你的User Agent字符串等(僞裝瀏覽器)。
  • urllib2模塊比較優勢的地方是urlliburllib2.urlopen可以接受Request對象作爲參數,從而可以控制HTTP Request的header部。

  • urllib模塊可以提供進行urlencode的方法,該方法用於GET查詢字符串的生成,urllib2的不具有這樣的功能。

  • urllib.urlretrieve函數以及urllib.quote等一系列quote和unquote功能沒有被加入urllib2中,因此有時也需要urllib的輔助。

這就是urllib與urllib2經常在一起使用的原因。

Google調試:F12
爬蟲常用:
1) Sources (js源碼)
2) Elements(頁面元素)
3) Network(網絡請求)

  • user-agent 電腦打開微信網頁顯示無法打開,就是修改了user-agent參數
  • referer參數地址,是上一個頁面的地址鏈接,簡單反扒處理
  • cookie 服務器返回的cookie,保存一些參數,下一次請求會覆蓋舊的cookie

常用的方法

1) urllib2.urlopen(url[, data][, timeout])

  urlopen方法是urllib2模塊最常用也最簡單的方法,它打開URL網址,url參數可以是一個字符串url或者是一個Request對象。URL沒什麼可說的,Request對象和data在request類中說明,定義都是一樣的。

  對於可選的參數timeout,阻塞操作以秒爲單位

import urllib2
response = urllib2.urlopen('http://python.org/')
html = response.read()

urlopen方法也可通過建立了一個Request對象來明確指明想要獲取的url。調用urlopen函數對請求的url返回一個response對象。這個response類似於一個file對象,所以用.read()函數可以操作這個response對象,關於urlopen函數的返回值的使用,我們下面再詳細說。

import urllib2
req = urllib2.Request('http://python.org/')
response = urllib2.urlopen(req,data='abc')
the_page = response.read()

2) urllib2.Request(url[, data][, headers][, origin_req_host][, unverifiable])

Request類是一個抽象的URL請求。
這裏用到了urllib2.Request類,對於上例,我們只通過了URL實例化了Request類的對象,其實Request類還有其他的參數。
data是作爲參數請求,如果data不等於None,則該請求爲POST,否則爲GET

import urllib
import urllib2
url = 'http://www.baidu.com'
values = {'name' : 'test',
          'age' : 27,
          'id' :1}
data = urllib.urlencode(values)
req = urllib2.Request(url, data)
response = urllib2.urlopen(req)
the_page = response.read()

headers——是字典類型,頭字典可以作爲參數在request時直接傳入,也可以把每個鍵和值作爲參數調用add_header()方法來添加。作爲辨別瀏覽器身份的User-Agent header是經常被用來惡搞和僞裝的,因爲一些HTTP服務只允許某些請求來自常見的瀏覽器而不是腳本,或是針對不同的瀏覽器返回不同的版本。例如,Mozilla Firefox瀏覽器被識別爲“Mozilla/5.0 (X11; U; Linux i686) Gecko/20071127 Firefox/2.0.0.11”。默認情況下,urlib2把自己識別爲Python-urllib/x.y(這裏的xy是python發行版的主要或次要的版本號,如在Python 2.6中,urllib2的默認用戶代理字符串是“Python-urllib/2.6。下面的例子和上面的區別就是在請求時加了一個headers,模仿IE瀏覽器提交請求。

import urllib
import urllib2
url = 'http://www.baidu.com'
user_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36'
values = {'name' : 'test',
          'age' : 27,
          'id' :1}
headers = { 'User-Agent' : user_agent }
data = urllib.urlencode(values)
req = urllib2.Request(url, data, headers)
response = urllib2.urlopen(req)
the_page = response.read()

添加header也可以採用另一種方案

req.add_header('Referer', 'http://www.python.org/')

3)其他的一些常用方法
geturl() — 返回檢索的URL資源,這個是返回的真正url,通常是用來鑑定是否重定向的,如下面代碼4行url如果等於“http://www.python.org/ ”說明沒有被重定向。如果被重定向了,有可能這個被重定向的值是需要用的,比如下載的時候如果我們要獲取那個最終的下載地址
getcode() — 返回響應的HTTP狀態代碼,運行下面代碼可以得到code=200,具體各個code代表的意思請參見文後附錄。

4)HTTPCookieProcessor
很多網站的資源需要用戶登錄之後才能獲取。
我們一旦登錄後再訪問其他被保護的資源的時候,就不再需要再次輸入賬號、密碼。那麼網站是怎麼辦到的呢?
一般來說,用戶在登錄之後,服務器端會爲該用戶創建一個Session。Session相當於該用戶的檔案。該檔案就代表着該用戶。
那麼某一次訪問請求是屬於該用戶呢?登錄的時候服務器要求瀏覽器儲存了一個Session ID的Cookie值。每一個訪問都帶上了該Cookie。服務器將Cookie中的Session ID與服務器中的Session ID比對就知道該請求來自哪個用戶了。

opener
我們在調用urllib2.urlopen(url)的時候,其實urllib2在open函數內部創建了一個默認的opener對象。然後調用opener.open()函數。
但是默認的opener並不支持cookie。
那麼我們先新建一個支持cookie的opener。urllib2中供我們使用的是HTTPCookieProcessor。

創建HTTPCookieProcessor需要一個存放cookie的容器。
Python提供的存放cookie的容器位於cookielib,有以下幾個。
CookieJar -> FileCookieJar -> MozillaCookieJar / LWPCookieJar

import cookielib
import urllib2

cookies = cookielib.CookieJar()
cookieHandler = urllib2.HTTPCookieProcessor(cookiejar=cookies)
opener = urllib2.build_opener(cookieHandler)

request = urllib2.Request("http://www.baidu.com")
urllib2.urlopen(request)
for cookie in cookies:
    print cookie.name, cookie.value

上面的代碼顯示,urllib2的確幫我們把cookie從response中提取出來。但是如何保存在一個文件中呢?

urllib2.install_opener(opener)

會設置 urllib2 的全局 opener

最後來講解下這個json包
json.dumps 將 Python 對象編碼成 JSON 字符串
json.loads 將已編碼的 JSON 字符串解碼爲 Python 對象

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章