所謂網頁抓取,就是把URL地址中指定的網絡資源從網絡流中讀取出來,保存到本地。在Python中有不少庫能夠用來抓取網頁,咱們先學習urllib.request。(在python2.x中爲urllib2)html
咱們先閱讀如下代碼:python
#!/usr/bin/python3 # -*- coding:utf-8 -*- __author__ = 'mayi' # 導入urllib.request庫 import urllib.request # 向指定的url發送請求,並返回服務器響應的類文件對象 response = urllib.request.urlopen("http://www.baidu.com/") # 類文件對象支持 文件對象的操做方法,如read()方法讀取文件所有內容,返回字符串 html = response.read() # 打印字符串 print(html)
實際上,若是咱們在瀏覽器上打開百度主頁,右鍵選擇「查看源代碼」,你會發現,跟咱們執行上面的程序輸出的結果是如出一轍的。也就是說,上面的幾行代碼就已經幫咱們把百度的主頁的所有代碼爬了下來。chrome
在上面的例子裏,urlopen()的參數就是一個url地址。瀏覽器
可是若是須要執行更復雜的操做,好比增長HTTP報頭,則必須建立一個Request實例來做爲urlopen()的參數,而須要訪問的url地址則做爲Request實例的參數。服務器
#!/usr/bin/python3 # -*- coding:utf-8 -*- __author__ = 'mayi' # 導入urllib.request庫 import urllib.request # url 做爲Request()方法的參數,構造並返回一個Request對象 request = urllib.request.Request("http://www.baidu.com/") # 向服務器發送這個請求 response = urllib.request.urlopen(request) html = response.read() print(html)
運行結果是徹底同樣的:網絡
新建的Request實例,除了必需要有url參數以外,還能夠設置另外兩個參數:post
1.data(默認爲空):是伴隨url提交的數據(好比post的數據),同時HTTP請求將從「GET」方式改成「POST」方式。學習
2.headers(默認爲空):是一個字典,包含了須要發送的HTTP報頭的鍵值對。url
若是咱們但願咱們的爬蟲程序更像一個真實用戶,那們咱們第一步,就是須要假裝成一個被公認的瀏覽器。用不一樣的瀏覽器在發送請求的時候,會有不一樣的User-Agent頭。urllib.request默認的User-Agent頭爲:Python-urllib/x.y(x和y是Python主版本和次版本號,例如Python-urllib/3.5)htm
#!/usr/bin/python3 # -*- coding:utf-8 -*- __author__ = 'mayi' # 導入urllib.request庫 import urllib.request # chrome 的 User-Agent,包含在 header裏 header = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36'} # url 連同 headers,一塊兒構造Request請求,這個請求將附帶 chrome 瀏覽器的User-Agent request = urllib.request.Request("http://www.baidu.com/", headers = header) # 向服務器發送這個請求 response = urllib.request.urlopen(request) html = response.read() print(html)
在HTTP Request中加入特定的Header,來構造一個完整的HTTP請求消息。
能夠經過調用Request.add_header() 添加/修改一個特定的header 也能夠經過調用Request.get_header()來查看已有的header。
添加一個特定的header
#!/usr/bin/python3 # -*- coding:utf-8 -*- __author__ = 'mayi' # 導入urllib.request庫 import urllib.request # chrome 的 User-Agent,包含在 header裏 header = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36'} # url 連同 headers,一塊兒構造Request請求,這個請求將附帶 chrome 瀏覽器的User-Agent request = urllib.request.Request("http://www.baidu.com/", headers = header) # 也能夠經過調用Request.add_header() 添加/修改一個特定的header request.add_header("Connection", "keep-alive") # 向服務器發送這個請求 response = urllib.request.urlopen(request) html = response.read() print(html)