【Python入門】30.常用內置模塊之 HTTP請求庫urllib & 實現簡單爬蟲 和 自動登錄微博

摘要:教你如何快速爬取一個網頁信息;urllib模塊中常用的方法介紹;通過修改頭信息來偽裝成瀏覽器訪問頁面;Get請求和Post請求的介紹


*寫在前面:為了更好的學習python,博主記錄下自己的學習路程。本學習筆記基于廖雪峰的Python教程,如有侵權,請告知刪除。歡迎與博主一起學習Pythonヽ( ̄▽ ̄)? *


目錄

常用內置模塊
urllib
簡單爬蟲
urlopen
urllib的常用方法
模擬瀏覽器
Get請求(百度搜索關鍵字)
Post請求(登錄新浪微博)
小結

常用內置模塊

urllib

Urllib是Python內置的HTTP請求庫,或者說,就是用來操作URL的。在爬蟲的時候常用到這個庫。

簡單爬蟲

要爬取網頁信息,首先我們要引入urllib.request模塊,這是一個請求模塊。

然后通過urllib.requesturlopen( )方法來打開一個網頁。

最后使用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,datatimeout。

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表示什么呢?

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吧( ̄▽ ̄)~*

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容