摘要:教你如何快速爬取一個網頁信息;urllib模塊中常用的方法介紹;通過修改頭信息來偽裝成瀏覽器訪問頁面;Get請求和Post請求的介紹
*寫在前面:為了更好的學習python,博主記錄下自己的學習路程。本學習筆記基于廖雪峰的Python教程,如有侵權,請告知刪除。歡迎與博主一起學習Pythonヽ( ̄▽ ̄)? *
目錄
常用內置模塊
urllib
簡單爬蟲
urlopen
urllib的常用方法
模擬瀏覽器
Get請求(百度搜索關鍵字)
Post請求(登錄新浪微博)
小結
常用內置模塊
urllib
Urllib是Python內置的HTTP請求庫,或者說,就是用來操作URL的。在爬蟲的時候常用到這個庫。
簡單爬蟲
要爬取網頁信息,首先我們要引入urllib.request模塊,這是一個請求模塊。
然后通過urllib.request的urlopen( )方法來打開一個網頁。
最后使用read( )方法來獲取網頁信息。
我們以百度http://www.baidu.com為例
import urllib.request
f = urllib.request.urlopen ('http://www.baidu.com')
data = f.read()
這樣我們就獲取了該網頁的內容,此外,我們還要把它保存下來。
添加一個html文件,然后把data寫進去:
import urllib.request
f = urllib.request.urlopen ('http://www.baidu.com')
data = f.read()
with open('./1.html','wb') as fh:
fh.write(date)
此時,我們打開指定目錄下的1.html,就能看到我們爬取的網頁了。(是不是炒雞簡單(* ̄︶ ̄))
urlopen
我們都知道urlopen()函數是用來打開url的,實際上它參數不止url一個。
urllib.request.urlopen()函數參數介紹:
urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)
常用的參數是前三個:url,data,timeout。
url 是需要打開的網址;
data 是需要傳入的數據,一般在get請求方式使用;
timeout 是超時時間,當網絡請求過慢,超過timeout設置的時間,就會給出異常,而不是一直等待結果。
urllib的常用方法
下面看一些簡單常用的urllib用法。
| 方法 | 作用 |
|---|---|
| info() | 返回網頁的當前環(huán)境有關信息 |
| getcode() | 返回網頁狀態(tài)碼,若為200則正確,若為其他則錯誤 |
| geturl() | 返回網頁的url |
| urllib.request.quote() | 對網址進行編碼 |
| urllib.request.unquote() | 對網址進行解碼 |
例子:
>>>import urllib.request
>>>f = urllib.request.urlopen ('http://www.baidu.com')
>>>f.info()
Bdpagetype: 1
Bdqid: 0x8915e4020002cb95
...
Transfer-Encoding: chunked
>>>f.getcode()
200
>>>f.geturl()
http://www.baidu.com
>>>urllib.request.quote('http://www.baidu.com')
http%3A//www.baidu.com
>>>urllib.request.unquote('http%3A//www.baidu.com')
http://www.baidu.com
模擬瀏覽器
有時候,我們爬取網頁的時候會出現錯誤,這是因為這些網頁為防止惡意獲取信息進行了反爬蟲設置。
為避免這種情況,一般而言我們會模擬成瀏覽器去訪問網頁。
要模擬成瀏覽器,就需要添加Headers信息,即頭信息。通過設置User-Agent可以讓爬蟲模擬成瀏覽器。
如何添加Headers信息呢?這里需要用到urllib模塊中的urllib.request.Requset()函數。
調用urllib.request.Requset()函數可以創(chuàng)建一個request對象,調用時傳入三個參數,第一個為url即網址信息,第二個為數據,默認為0,第三個為headers,即需要添加的頭信息,要以dict類型傳入,默認為不傳頭部。
隨后,調用urllib.request.urlopen()打開request對象,就能實現模擬成瀏覽器訪問網頁了。
看一下具體的代碼:
import urllib.request
url='http://www.baidu.com' # 設置url的值
header={ # 設置header的值
'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.98 Safari/537.36'
}
request = urllib.request.Request(url, headers = header) # 調用Request函數
data = urllib.request.urlopen(request).read() # 訪問網頁
with open('./1.html', 'wb') as fh: # 創(chuàng)建html文件并把數據保存下來
fh.write(data)
還有個問題是怎么得到這個User-Agent的信息呢?
有個簡單的方法:使用瀏覽器打開任意一個網頁,按F12,在彈出的界面的上方找到Network,點擊后會出現一些文件,點擊其中的一個,點擊右邊的header,在里面就有User-Agent信息。
(參考下圖進行操作(`?ω?′))

那么User-Agent表示什么呢?
User Agent中文名為用戶代理,簡稱 UA,它是一個特殊字符串頭,使得服務器能夠識別客戶使用的操作系統(tǒng)及版本、CPU 類型、瀏覽器及版本、瀏覽器渲染引擎、瀏覽器語言、瀏覽器插件等。
標準格式為: 瀏覽器標識 (操作系統(tǒng)標識; 加密等級標識; 瀏覽器語言) 渲染引擎標識 版本信息
——百度百科
Get請求(百度搜索關鍵字)
如果要進行客戶端與服務器端之間的消息傳遞,我們可以使用HTTP協(xié)議請求進行。
在本節(jié)內容中介紹兩種常用的請求:Get和Post。先來看一下Get請求。
Get請求,通過URL網址傳遞信息。我們可以把數據直接放在URL中,從而得到想要的信息。
以百度搜索為例子。
當我們用百度搜索Python時,仔細觀察url會發(fā)現,其中有wd=Python的字段。
事實上,wd字段就是表示搜索的關鍵字,那么通過Get請求,就可以實現用爬蟲自動使用百度搜索了:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import urllib.request
url='http://www.baidu.com/s?wd='
key=urllib.request.quote('三貝的博客') # 由于URL含有中文,需要編碼
url_all=url+key
header={ # 頭部信息
'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.98 Safari/537.36'
}
request = urllib.request.Request(url_all, headers=header)
data = urllib.request.urlopen(request).read()
with open('./search三貝的博客.html', 'wb') as f: # 寫入文件中
f.write(data)
打開指定目錄下的html文件,顯示的就是搜索指定關鍵字的頁面啦( ̄▽ ̄)~*。

Post請求(登錄新浪微博)
Post請求即向服務器發(fā)送數據,然后請求執(zhí)行相應的操作。比如登錄用戶。
我們只要把需要發(fā)送的數據放進data里面,然后傳進urlopen的data參數即可。
下面以登錄新浪微博為例(以下代碼除注釋轉自廖雪峰官網):
from urllib import request, parse
print('Login to weibo.cn...')
email = input('Email: ') # 用戶輸入登錄的郵箱名
passwd = input('Password: ') # 用戶輸入登錄的密碼
login_data = parse.urlencode([ # 登錄數據,用dict類型儲存,parse.urlencode將dict轉為url參數
('username', email),
('password', passwd),
('entry', 'mweibo'),
('client_id', ''),
('savestate', '1'),
('ec', ''),
('pagerefer', 'https://passport.weibo.cn/signin/welcome?entry=mweibo&r=http%3A%2F%2Fm.weibo.cn%2F')
])
req = request.Request('https://passport.weibo.cn/sso/login')
req.add_header('Origin', 'https://passport.weibo.cn')
req.add_header('User-Agent', 'Mozilla/6.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/8.0 Mobile/10A5376e Safari/8536.25')
req.add_header('Referer', 'https://passport.weibo.cn/signin/login?entry=mweibo&res=wel&wm=3349&r=http%3A%2F%2Fm.weibo.cn%2F')
with request.urlopen(req, data=login_data.encode('utf-8')) as f:
print('Status:', f.status, f.reason) # 返回頁面執(zhí)行的狀態(tài)
for k, v in f.getheaders(): # 得到HTTP相應的頭和JSON數據
print('%s: %s' % (k, v))
print('Data:', f.read().decode('utf-8')) # 得到頁面信息
如果登錄成功( ̄▽ ̄)/,我們獲得的響應如下:
Status: 200 OK
Server: nginx/1.6.1
...
Set-Cookie: SSOLoginState=1535461471; path=/; domain=weibo.cn
...
Data: {"retcode":20000000,"msg":"","data":{...,"uid":"2237339025"}}
如果登錄失敗(T▽T)/,我們獲得的響應如下:
...
Data: {"retcode":50011015,"msg":"\u7528\u6237\u540d\u6216\u5bc6\u7801\u9519\u8bef","data":{"username":"aaa@python.org","errline":665}}
小結
urllib提供的功能就是利用程序去執(zhí)行各種HTTP請求。
關于Python爬蟲的知識點還有很多,本節(jié)只是對urllib模塊進行簡單的介紹,供想Python入門的人兒學習,往后會有更詳細的內容介紹ヾ(o?ω?)?。
以上就是本節(jié)的全部內容,感謝你的閱讀。
下一節(jié)內容:常用內置模塊之 XML
有任何問題與想法,歡迎評論與吐槽。
和博主一起學習Python吧( ̄▽ ̄)~*