Python爬蟲開發【第1篇】【urllib2】

一、urlopenhtml

# urllib2_urlopen.py

# 導入urllib2 庫
import urllib2

# 向指定的url發送請求,並返回服務器響應的類文件對象,urlopen中有data參數爲POST請求,無data參數爲GET請求
response = urllib2.urlopen("http://www.baidu.com")

# 類文件對象支持 文件對象的操做方法,如read()方法讀取文件所有內容,返回字符串
html = response.read()

# 打印字符串
print html
執行寫的python代碼,將打印結果

  

二、requestpython

# urllib2_request.py

import urllib2

# url 做爲Request()方法的參數,構造並返回一個Request對象
request = urllib2.Request("http://www.baidu.com")

# Request對象做爲urlopen()方法的參數,發送給服務器並接收響應
response = urllib2.urlopen(request)

html = response.read()

print html

三、user_agent(用戶代理)web

#urllib2_useragent.py

import urllib2

url = "http://www.itcast.cn"

#IE 9.0 的 User-Agent,包含在 ua_header裏
ua_header = {"User-Agent" : "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0;"} 

#  url 連同 headers,一塊兒構造Request請求,這個請求將附帶 IE9.0 瀏覽器的User-Agent
request = urllib2.Request(url, headers = ua_header)

# 向服務器發送這個請求
response = urllib2.urlopen(request)

html = response.read()
print html

四、更多Header信息ajax

在 HTTP Request 中加入特定的 Header,來構造一個完整的HTTP請求消息。json

添加一個特定的header
# urllib2_headers.py

import urllib2

url = "http://www.itcast.cn"

#IE 9.0 的 User-Agent
header = {"User-Agent" : "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0;"} 
request = urllib2.Request(url, headers = header)

#也能夠經過調用Request.add_header() 添加/修改一個特定的header
request.add_header("Connection", "keep-alive")

# 也能夠經過調用Request.get_header()來查看header信息
# request.get_header(header_name="Connection")

response = urllib2.urlopen(req)

print response.code     #能夠查看響應狀態碼
html = response.read()

print html

隨機添加/修改User-Agent # urllib2_add_headers.py import urllib2 import random url = "http://www.itcast.cn" ua_list = [ "Mozilla/5.0 (Windows NT 6.1; ) Apple.... ", "Mozilla/5.0 (X11; CrOS i686 2268.111.0)... ", "Mozilla/5.0 (Macintosh; U; PPC Mac OS X.... ", "Mozilla/5.0 (Macintosh; Intel Mac OS... " ] user_agent = random.choice(ua_list) request = urllib2.Request(url) #也能夠經過調用Request.add_header() 添加/修改一個特定的header request.add_header("User-Agent", user_agent) # 第一個字母大寫,後面的所有小寫 request.get_header("User-agent") response = urllib2.urlopen(req) html = response.read() print html

五、urllib和urllib2瀏覽器

  • urllib 僅能夠接受URL,不能建立 設置了headers 的Request 類實例
  • urllib 提供 urlencode 方法用來GET查詢字符串的產生,而 urllib2 則沒有
  • 編碼使用urllib的urlencode()函數,幫咱們將key:value這樣的鍵值對轉換成"key=value"這樣的字符串,解碼使用urllib的unquote()函數

六、GET請求:用於咱們向服務器獲取數據安全

批量抓取貼吧頁面數據

# 模擬 main 函數 if __name__ == "__main__": kw = raw_input("請輸入須要爬取的貼吧:") # 輸入起始頁和終止頁,str轉成int類型 beginPage = int(raw_input("請輸入起始頁:")) endPage = int(raw_input("請輸入終止頁:")) url = "http://tieba.baidu.com/f?" # 參數是一個dict類型,urlencode是中文進行轉碼
   key
= urllib.urlencode({"kw" : kw}) # 組合後的url示例:http://tieba.baidu.com/f?kw=lol url = url + key tiebaSpider(url, beginPage, endPage)
接下來,咱們寫一個百度貼吧爬蟲接口,咱們須要傳遞3個參數給這個接口, 一個是main裏組合的url地址,以及起始頁碼和終止頁碼,表示要爬取頁碼的範圍。
def tiebaSpider(url, beginPage, endPage): """ 做用:負責處理url,分配每一個url去發送請求 url:須要處理的第一個url beginPage: 爬蟲執行的起始頁面 endPage: 爬蟲執行的截止頁面 """ for page in range(beginPage, endPage + 1): pn = (page - 1) * 50 filename = "" + str(page) + "頁.html" # 組合爲完整的 url,而且pn值每次增長50 fullurl = url + "&pn=" + str(pn) #print fullurl # 調用loadPage()發送請求獲取HTML頁面 html = loadPage(fullurl, filename) # 將獲取到的HTML頁面寫入本地磁盤文件 writeFile(html, filename)

將爬取網頁的代碼封裝成一個小函數loadPage,供咱們使用。
def loadPage(url, filename): ''' 做用:根據url發送請求,獲取服務器響應文件 url:須要爬取的url地址 filename: 文件名 ''' print "正在下載" + filename headers = {"User-Agent": "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0;"} request = urllib2.Request(url, headers = headers) response = urllib2.urlopen(request) return response.read()
最後若是咱們但願將爬取到了每頁的信息存儲在本地磁盤上,咱們能夠簡單寫一個存儲文件的接口。
def writeFile(html, filename): """ 做用:保存服務器響應文件到本地磁盤文件裏 html: 服務器響應文件 filename: 本地磁盤文件名 """ print "正在存儲" + filename with open(filename, 'w') as f: f.write(html) print "-" * 20

總結:服務器

GET請求爬蟲過程
# urllib2_get.py import urllib #負責url編碼處理 import urllib2 url = "http://www.baidu.com/s" word = {"wd":"傳智播客"} word = urllib.urlencode(word) #轉換成url編碼格式(字符串) newurl = url + "?" + word # url首個分隔符就是 ? headers={ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) 
      Chrome/51.0.2704.103 Safari/537.36"}
# 發送請求 request = urllib2.Request(newurl, headers=headers)   # 獲取響應 response = urllib2.urlopen(request) print response.read()

七、POST請求:Request請求對象的裏有data參數,它就是用在POST裏的,咱們要傳送的數據就是這個參數data,data是一個字典,裏面要匹配鍵值對cookie

import urllib
import urllib2

# POST請求的目標URL
url = "http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&smartresult=ugc&sessionFrom=null"

headers={"User-Agent": "Mozilla...."}

formdata = {
    "type":"AUTO",
    "i":"i love python",
    "doctype":"json",
    "xmlVersion":"1.8",
    "keyfrom":"fanyi.web",
    "ue":"UTF-8",
    "action":"FY_BY_ENTER",
    "typoResult":"true"
}

data = urllib.urlencode(formdata)

request = urllib2.Request(url, data = data, headers = headers) response = urllib2.urlopen(request) 
print response.read()
發送POST請求時,須要特別注意headers的一些屬性:
  • Content-Length: 144: 是指發送的表單數據長度爲144,也就是字符個數是144個。
  • X-Requested-With: XMLHttpRequest :表示Ajax異步請求。
  • Content-Type: application/x-www-form-urlencoded : 表示瀏覽器提交 Web 表單時使用,表單數據會按照 name1=value1&name2=value2 鍵值對形式進行編碼。

八、獲取AJAX加載的內容session

有些網頁內容使用AJAX加載,AJAX通常返回的是JSON,直接對AJAX地址進行post或get,就返回JSON數據

import urllib
import urllib2

# demo1 
url = "https://movie.douban.com/j/chart/top_list?type=11&interval_id=100%3A90&action"

headers={"User-Agent": "Mozilla...."}

# 變更的是這兩個參數,從start開始日後顯示limit個
formdata = {
    'start':'0',
    'limit':'10'
}
data = urllib.urlencode(formdata)

request = urllib2.Request(url, data = data, headers = headers)
response = urllib2.urlopen(request)

print response.read()


# demo2

url = "https://movie.douban.com/j/chart/top_list?"
headers={"User-Agent": "Mozilla...."}

# 處理全部參數
formdata = {
    'type':'11',
    'interval_id':'100:90',
    'action':'',
    'start':'0',
    'limit':'10'
}
data = urllib.urlencode(formdata)

request = urllib2.Request(url, data = data, headers = headers)
response = urllib2.urlopen(request)

print response.read()

九、處理HTTPS請求 SSL證書驗證

https 開頭的網站,urllib2能夠爲 HTTPS 請求驗證SSL證書,就像web瀏覽器同樣,若是網站的SSL證書是通過CA認證的,則可以正常訪問

若是SSL證書驗證不經過,或者操做系統不信任服務器的安全證書,好比瀏覽器在訪問12306網站如:https://www.12306.cn/mormhweb/的時候,

會警告用戶證書不受信任。

 

urllib2在訪問的時候則會報出SSLError:

import urllib2

url = "https://www.12306.cn/mormhweb/"

headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) 
        Chrome/54.0.2840.99 Safari/537.36
"} request = urllib2.Request(url, headers = headers) response = urllib2.urlopen(request) print response.read() 運行結果: urllib2.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:590)> 因此,若是之後遇到這種網站,咱們須要單獨處理SSL證書,讓程序忽略SSL證書驗證錯誤,便可正常訪問。 import urllib import urllib2 # 1. 導入Python SSL處理模塊 import ssl # 2. 表示忽略未經覈實的SSL證書認證 context = ssl._create_unverified_context() url = "https://www.12306.cn/mormhweb/" headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)
        Chrome/54.0.2840.99 Safari/537.36"} request = urllib2.Request(url, headers = headers) # 3. 在urlopen()方法裏 指明添加 context 參數 response = urllib2.urlopen(request, context = context) print response.read()

 十、cookie模擬登錄

import urllib
import urllib2

url = 'www.renren.com'

頭文件中寫入cookie信息,可是須要將Accept -Encoding字段註釋掉,不然服務器會對返回的內容進行壓縮,致使返回數據,出現亂碼

headers = {*********}

request = urllib2.Request(url,headers=headers)

response = urllib2.urlopen(request)
相關文章
相關標籤/搜索