摘要:教你如何快速爬取一個(gè)網(wǎng)頁信息卡乾;urllib模塊中常用的方法介紹;通過修改頭信息來偽裝成瀏覽器訪問頁面信卡;Get請(qǐng)求和Post請(qǐng)求的介紹
*寫在前面:為了更好的學(xué)習(xí)python隔缀,博主記錄下自己的學(xué)習(xí)路程。本學(xué)習(xí)筆記基于廖雪峰的Python教程傍菇,如有侵權(quán)猾瘸,請(qǐng)告知?jiǎng)h除。歡迎與博主一起學(xué)習(xí)Pythonヽ( ̄▽ ̄)? *
目錄
常用內(nèi)置模塊
urllib
簡(jiǎn)單爬蟲
urlopen
urllib的常用方法
模擬瀏覽器
Get請(qǐng)求(百度搜索關(guān)鍵字)
Post請(qǐng)求(登錄新浪微博)
小結(jié)
常用內(nèi)置模塊
urllib
Urllib是Python內(nèi)置的HTTP請(qǐng)求庫丢习,或者說牵触,就是用來操作URL的。在爬蟲的時(shí)候常用到這個(gè)庫咐低。
簡(jiǎn)單爬蟲
要爬取網(wǎng)頁信息揽思,首先我們要引入urllib.request
模塊,這是一個(gè)請(qǐng)求模塊见擦。
然后通過urllib.request
的urlopen( )方法來打開一個(gè)網(wǎng)頁钉汗。
最后使用read( )方法來獲取網(wǎng)頁信息。
我們以百度http://www.baidu.com
為例
import urllib.request
f = urllib.request.urlopen ('http://www.baidu.com')
data = f.read()
這樣我們就獲取了該網(wǎng)頁的內(nèi)容鲤屡,此外损痰,我們還要把它保存下來。
添加一個(gè)html文件酒来,然后把data
寫進(jìn)去:
import urllib.request
f = urllib.request.urlopen ('http://www.baidu.com')
data = f.read()
with open('./1.html','wb') as fh:
fh.write(date)
此時(shí)卢未,我們打開指定目錄下的1.html
,就能看到我們爬取的網(wǎng)頁了堰汉。(是不是炒雞簡(jiǎn)單(* ̄︶ ̄))
urlopen
我們都知道urlopen()函數(shù)是用來打開url的辽社,實(shí)際上它參數(shù)不止url一個(gè)。
urllib.request.urlopen()函數(shù)參數(shù)介紹:
urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)
常用的參數(shù)是前三個(gè):url
衡奥,data
爹袁,timeout
远荠。
url 是需要打開的網(wǎng)址矮固;
data 是需要傳入的數(shù)據(jù),一般在get請(qǐng)求方式使用譬淳;
timeout 是超時(shí)時(shí)間档址,當(dāng)網(wǎng)絡(luò)請(qǐng)求過慢,超過timeout設(shè)置的時(shí)間邻梆,就會(huì)給出異常守伸,而不是一直等待結(jié)果。
urllib的常用方法
下面看一些簡(jiǎn)單常用的urllib用法浦妄。
方法 | 作用 |
---|---|
info() | 返回網(wǎng)頁的當(dāng)前環(huán)境有關(guān)信息 |
getcode() | 返回網(wǎng)頁狀態(tài)碼尼摹,若為200則正確见芹,若為其他則錯(cuò)誤 |
geturl() | 返回網(wǎng)頁的url |
urllib.request.quote() | 對(duì)網(wǎng)址進(jìn)行編碼 |
urllib.request.unquote() | 對(duì)網(wǎng)址進(jìn)行解碼 |
例子:
>>>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
模擬瀏覽器
有時(shí)候,我們爬取網(wǎng)頁的時(shí)候會(huì)出現(xiàn)錯(cuò)誤蠢涝,這是因?yàn)檫@些網(wǎng)頁為防止惡意獲取信息進(jìn)行了反爬蟲設(shè)置玄呛。
為避免這種情況,一般而言我們會(huì)模擬成瀏覽器去訪問網(wǎng)頁和二。
要模擬成瀏覽器徘铝,就需要添加Headers信息,即頭信息惯吕。通過設(shè)置User-Agent可以讓爬蟲模擬成瀏覽器惕它。
如何添加Headers信息呢?這里需要用到urllib模塊中的urllib.request.Requset()函數(shù)废登。
調(diào)用urllib.request.Requset()函數(shù)可以創(chuàng)建一個(gè)request
對(duì)象淹魄,調(diào)用時(shí)傳入三個(gè)參數(shù),第一個(gè)為url
即網(wǎng)址信息钳宪,第二個(gè)為數(shù)據(jù)揭北,默認(rèn)為0,第三個(gè)為headers
吏颖,即需要添加的頭信息搔体,要以dict
類型傳入,默認(rèn)為不傳頭部半醉。
隨后疚俱,調(diào)用urllib.request.urlopen()
打開request
對(duì)象,就能實(shí)現(xiàn)模擬成瀏覽器訪問網(wǎng)頁了缩多。
看一下具體的代碼:
import urllib.request
url='http://www.baidu.com' # 設(shè)置url的值
header={ # 設(shè)置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) # 調(diào)用Request函數(shù)
data = urllib.request.urlopen(request).read() # 訪問網(wǎng)頁
with open('./1.html', 'wb') as fh: # 創(chuàng)建html文件并把數(shù)據(jù)保存下來
fh.write(data)
還有個(gè)問題是怎么得到這個(gè)User-Agent的信息呢呆奕?
有個(gè)簡(jiǎn)單的方法:使用瀏覽器打開任意一個(gè)網(wǎng)頁,按F12衬吆,在彈出的界面的上方找到Network梁钾,點(diǎn)擊后會(huì)出現(xiàn)一些文件,點(diǎn)擊其中的一個(gè)逊抡,點(diǎn)擊右邊的header姆泻,在里面就有User-Agent信息。
(參考下圖進(jìn)行操作(`?ω?′))
那么User-Agent表示什么呢冒嫡?
User Agent中文名為用戶代理拇勃,簡(jiǎn)稱 UA,它是一個(gè)特殊字符串頭孝凌,使得服務(wù)器能夠識(shí)別客戶使用的操作系統(tǒng)及版本方咆、CPU 類型、瀏覽器及版本蟀架、瀏覽器渲染引擎瓣赂、瀏覽器語言榆骚、瀏覽器插件等。
標(biāo)準(zhǔn)格式為: 瀏覽器標(biāo)識(shí) (操作系統(tǒng)標(biāo)識(shí); 加密等級(jí)標(biāo)識(shí); 瀏覽器語言) 渲染引擎標(biāo)識(shí) 版本信息
——百度百科
Get請(qǐng)求(百度搜索關(guān)鍵字)
如果要進(jìn)行客戶端與服務(wù)器端之間的消息傳遞煌集,我們可以使用HTTP協(xié)議請(qǐng)求進(jìn)行寨躁。
在本節(jié)內(nèi)容中介紹兩種常用的請(qǐng)求:Get和Post。先來看一下Get請(qǐng)求牙勘。
Get請(qǐng)求职恳,通過URL網(wǎng)址傳遞信息。我們可以把數(shù)據(jù)直接放在URL中方面,從而得到想要的信息放钦。
以百度搜索為例子。
當(dāng)我們用百度搜索Python時(shí)恭金,仔細(xì)觀察url會(huì)發(fā)現(xiàn)操禀,其中有wd=Python
的字段。
事實(shí)上横腿,wd
字段就是表示搜索的關(guān)鍵字颓屑,那么通過Get請(qǐng)求,就可以實(shí)現(xiàn)用爬蟲自動(dòng)使用百度搜索了:
#!/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文件揪惦,顯示的就是搜索指定關(guān)鍵字的頁面啦( ̄▽ ̄)~*。
Post請(qǐng)求(登錄新浪微博)
Post請(qǐng)求即向服務(wù)器發(fā)送數(shù)據(jù)罗侯,然后請(qǐng)求執(zhí)行相應(yīng)的操作器腋。比如登錄用戶。
我們只要把需要發(fā)送的數(shù)據(jù)放進(jìn)data里面钩杰,然后傳進(jìn)urlopen的data參數(shù)即可纫塌。
下面以登錄新浪微博為例(以下代碼除注釋轉(zhuǎn)自廖雪峰官網(wǎng)):
from urllib import request, parse
print('Login to weibo.cn...')
email = input('Email: ') # 用戶輸入登錄的郵箱名
passwd = input('Password: ') # 用戶輸入登錄的密碼
login_data = parse.urlencode([ # 登錄數(shù)據(jù),用dict類型儲(chǔ)存讲弄,parse.urlencode將dict轉(zhuǎn)為url參數(shù)
('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相應(yīng)的頭和JSON數(shù)據(jù)
print('%s: %s' % (k, v))
print('Data:', f.read().decode('utf-8')) # 得到頁面信息
如果登錄成功( ̄▽ ̄)/措左,我們獲得的響應(yīng)如下:
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)/,我們獲得的響應(yīng)如下:
...
Data: {"retcode":50011015,"msg":"\u7528\u6237\u540d\u6216\u5bc6\u7801\u9519\u8bef","data":{"username":"aaa@python.org","errline":665}}
小結(jié)
urllib提供的功能就是利用程序去執(zhí)行各種HTTP請(qǐng)求避除。
關(guān)于Python爬蟲的知識(shí)點(diǎn)還有很多怎披,本節(jié)只是對(duì)urllib模塊進(jìn)行簡(jiǎn)單的介紹,供想Python入門的人兒學(xué)習(xí)驹饺,往后會(huì)有更詳細(xì)的內(nèi)容介紹ヾ(o?ω?)?钳枕。
以上就是本節(jié)的全部?jī)?nèi)容缴渊,感謝你的閱讀赏壹。
下一節(jié)內(nèi)容:常用內(nèi)置模塊之 XML
有任何問題與想法独泞,歡迎評(píng)論與吐槽撑帖。
和博主一起學(xué)習(xí)Python吧( ̄▽ ̄)~*