運維學python之爬蟲基礎篇(二)urllib模塊使用

1 何爲爬蟲

網絡爬蟲(又被稱爲網頁蜘蛛,網絡機器人,在FOAF社區中間,更經常的稱爲網頁追逐者),是一種按照一定的規則,自動地抓取萬維網信息的程序或者腳本。另外一些不常使用的名字還有螞蟻、自動索引、模擬程序或者蠕蟲。摘自百度百科

2 URL

2.1 URL含義

URL(Uniform/Universal Resource Locator的縮寫,統一資源定位符)是對可以從互聯網上得到的資源的位置和訪問方法的一種簡潔的表示,是互聯網上標準資源的地址。互聯網上的每個文件都有一個唯一的URL,它包含的信息指出文件的位置以及瀏覽器應該怎麼處理它。它最初是由蒂姆·伯納斯·李發明用來作爲萬維網的地址的。現在它已經被萬維網聯盟編制爲因特網標準RFC1738了。

2.2 URL格式

一個完整的URL包括訪問協議類型、主機地址、路徑和文件名。

  • 訪問協議類型:表示採用什麼協議訪問哪類資源,以便瀏覽器決定用什麼方法獲得資源
  • 主機地址:表示要訪問的主機的IP地址或域名地址(包括端口)
  • 路徑和文件名:表示信息在主機中的路徑和文件名,如果缺省文件路徑,則表示定位於Web服務器的主頁,其文件名通常是index.htm。

3 瀏覽器網頁過程

  • 輸入地址
  • 瀏覽器查找域名的 IP 地址
  • 這一步包括 DNS 具體的查找過程,包括:瀏覽器緩存->系統緩存->路由器緩存...
  • 瀏覽器向 web 服務器發送一個 HTTP 請求
  • 服務器處理請求
  • 服務器返回一個 HTTP 響應
  • 瀏覽器顯示 HTML
  • 瀏覽器發送請求獲取嵌入在 HTML 中的資源(如圖片、音頻、視頻、CSS、JS等等)
    用戶看到的實際就是HTML,爬蟲爬來的便是這些內容,通過分析和過濾這些 HTML 代碼,來獲取自己需要的資源,包括圖片、文字等。

4 urllib—URL處理模塊

4.1 如何使用urllib包來獲取Internet資源

例:

>>> import urllib.request   ①
>>> with urllib.request.urlopen('https://www.baidu.com') as f:  ②
...     print(f.read())
...
b'<html>\r\n<head>\r\n\t<script>\r\n\t\tlocation.replace(location.href.replace("https://","http://"));\r\n\t</script>\r\n</head>\r\n<body>\r\n\t<noscript><meta http-equiv="refresh" content="0;url=http://www.baidu.com/"></n  ③

① 導入模塊
② 用with語句來打開URL,urlopen一般常用的有三個參數,它的參數如下:urllib.requeset.urlopen(url,data,timeout),用f.read()方法來一次性讀取全部內容,可以加參數來確定讀取的字節數,如f.read(300)
③ 可以看到urlopen返回的是字節對象,如果確定html編碼格式,可以使用decode來解碼,如:f.read().decode('utf-8')

4.2 urlretrieve()

如果您希望通過URL檢索資源並將其存儲在一個臨時位置,您可以通過urlretrieve()函數來實現這一功能,

import urllib.request
local_filename, headers = urllib.request.urlretrieve('http://python.org/')
html = open(local_filename)

5 POST和GET數據傳送

5.1 通過GET方式發送

如果要想模擬瀏覽器發送GET請求,就需要使用Request對象,通過往Request對象add_header方法添加HTTP頭,我們就可以把請求僞裝成瀏覽器,上面的代碼可以修改爲下面這樣:

import urllib.request

req = urllib.request.Request(url='https://www.baidu.com') ①
req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.96 Safari/537.36') ②
with urllib.request.urlopen(req) as f:
    print(f.status)
    for k, v in f.getheaders(): ③ 
        print(k, v)

① 通過Request對象添加headers方式請求
②.add_header()方法添加頭信息
③ 打印頭信息

5.2 通過POST方式發送請求

只需要把參數data以bytes形式傳入,下面代碼是模擬的數據,做個例子使用:

from urllib import request, parse ①

login_data = bytes(parse.urlencode({'form_email': 'demo', 'form_password': '123456'}), encoding='utf-8')
print(login_data) ②

req = request.Request('http://httpbin.org/post') ③
req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:57.0) Gecko/20100101 Firefox/57.0')

response = request.urlopen(req, login_data)
print(response.read())

①導入request的parse模塊
②這裏就用到urllib.parse,通過bytes(urllib.parse.urlencode())可以將post數據進行轉換放到urllib.request.urlopen的data參數中。這樣就完成了一次post請求。如果我們添加data參數的時候就是以post請求方式請求,如果沒有data參數就是get請求方式
③這個網址不錯,可以作爲練習urllib的各種方式(此處借鑑了scrounger的個人博客
今天就到這裏,明天繼續urllib的高級用法。

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