爬蟲——urllib.request庫的基本使用

所謂網頁抓取,就是把URL地址中指定的網絡資源從網絡流中讀取出來,保存到本地。在Python中有不少庫能夠用來抓取網頁,咱們先學習urllib.request。(在python2.x中爲urllib2)html

urlopen

咱們先閱讀如下代碼: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

Reuqest

在上面的例子裏,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

若是咱們但願咱們的爬蟲程序更像一個真實用戶,那們咱們第一步,就是須要假裝成一個被公認的瀏覽器。用不一樣的瀏覽器在發送請求的時候,會有不一樣的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)

添加更多的Header信息

在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)
相關文章
相關標籤/搜索