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

1 何爲爬蟲

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

2 URL

2.1 URL含義

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

2.2 URL格式

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

  • 訪問協議類型:表示採用什麼協議訪問哪類資源,以便瀏覽器決定用什麼方法得到資源
  • 主機地址:表示要訪問的主機的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()方法添加頭信息
③ 打印頭信息ide

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的高級用法。post

相關文章
相關標籤/搜索