在(一)剛?cè)肱老x坑(1)——爬蟲簡(jiǎn)介?中提到過(guò)urllib2這個(gè)庫(kù),這個(gè)庫(kù)是python2.7自帶的模塊,不需要下載。
本篇使用python3,urllib2在python3中被修改為urllib.request。
urlopen():
????urlopen(url, data=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT, *, cafile=None, capath=None, cadefault=False, context=None)
????????url : url地址
????????data:指明發(fā)往服務(wù)器請(qǐng)求中的額外的信息
????????timeout:連接超時(shí)
????????cafile、capath、cadefault:跟證書有關(guān),一般不用
????????context:上下文
? ? 下面寫一個(gè)小例子:


? ?如果想模擬瀏覽器發(fā)送請(qǐng)求,可以自定義一個(gè)request,填寫一個(gè)瀏覽器的User-Agent,直接上代碼:

? ? 剛才的代碼中只是輸出了html,response里面還有很多的信息,可以一個(gè)一個(gè)打印看一下。

????User-Agent是反爬蟲的第一步,但不能只是一個(gè)User-Agent,可以寫一個(gè)列表,然后每一次請(qǐng)求都換一個(gè)User-Agent才能更好的欺騙服務(wù)器。
? ? 代碼如下:? ??

urlencode():
? ? 在使用百度搜索引擎的時(shí)候,搜索是使用了get方式進(jìn)行請(qǐng)求,傳遞了wd=****的參數(shù)。

? ? 我們可以把瀏覽器地址復(fù)制一下,粘貼到文檔中,可以發(fā)現(xiàn)url變樣了,漢字變成了另一種編碼。
? ? ? ? https://www.baidu.com/s?wd=%E7%99%BE%E5%BA%A6%E8%B4%B4%E5%90%A7
? ? 這就是URL的編碼,在做爬蟲的時(shí)候也需要對(duì)一些文字做一些編碼轉(zhuǎn)換,直接上代碼:

????????urlencode方法把鍵值對(duì)形式{ "wd" : "百度貼吧" }轉(zhuǎn)換成了字符串形式"wd=%E7%99%BE%E5%BA%A6%E8%B4%B4%E5%90%A7",同時(shí)也對(duì)漢字進(jìn)行了編碼操作。
????上面只是測(cè)試了幾個(gè)方法,接下來(lái)使用上面寫的方法做一個(gè)小案例,寫一個(gè)百度貼吧的爬蟲。

? ? 上面代碼就是都是GET請(qǐng)求的方式,也就是把參數(shù)拼接在url中,接下來(lái)我們研究一下POST請(qǐng)求:
? ? ? ? urlopen()中有一個(gè)參數(shù)是data,它就是POST請(qǐng)求中傳遞參數(shù)的方式,可以試試寫一個(gè)關(guān)于有道翻譯的POST請(qǐng)求,話不多說(shuō)直接上代碼:


? ? 這里面的headers中的數(shù)據(jù) 和?post_data數(shù)據(jù)?可以直接從抓包工具或者瀏覽器中復(fù)制。
? ? headers里面有一個(gè)cookies,在某一些網(wǎng)站是需要登陸然后才能瀏覽到數(shù)據(jù),此時(shí)就可以使用cookies繞過(guò)登錄界面,直接進(jìn)行頁(yè)面的抓取。這個(gè)以后會(huì)經(jīng)常遇到,接下來(lái)會(huì)介紹到。