Python2的GET請求
# urllib 僅可以接受URL,不能創建 設置了headers 的Request 類實例。
# urllib 提供 urlencode 方法用來GET查詢字符串的產生,而 urllib2 則沒有。(這是 urllib 和 urllib2 經常一起使用的主要原因)。
# 編碼工作使用urllib的urlencode()函數,幫我們將key:value這樣的鍵值對轉換成"key=value"這樣的字符串。
# 解碼工作使用urllib的unquote()函數。(注意,不是urllib2.urlencode())。
# 一般HTTP請求提交數據,需要編碼成 URL編碼格式。然後作爲url的一部分,或者作爲參數傳到Request對象中。
import urllib
word = {"wd": "傳智播客"}
# 通過urllib.urlencode()方法,將字典鍵值對按URL編碼轉換,從而能被web服務器接受。接收的參數是一個字典。
word = urllib.urlencode(word)
print word # 結果:"wd=%E4%BC%A0%E6%99%BA%E6%92%AD%E5%AE%A2"
# 通過urllib.unquote()方法,把 URL編碼字符串,轉換回原先字符串。
word = urllib.unquote("wd=%E4%BC%A0%E6%99%BA%E6%92%AD%E5%AE%A2")
print word # 結果:wd=傳智播客
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, data=None, headers=headers) # get請求可以不帶參數data。
request.add_header("Authorization", "APPCODE " + "d108a3c6fb764d038abc48710fc55ffc")
request.add_header("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8")
request.get_header("Authorization")
request.get_header("Content-type")
response = urllib2.urlopen(request)
print response.read()
import urllib
import urllib2
def tiebaSpider(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)
# 調用loadPage()發送請求,獲取HTML頁面(服務器響應文件)
html = loadPage(fullurl, filename)
# 將獲取到的HTML頁面(服務器響應文件)寫入本地磁盤文件
writeFile(html, filename)
def loadPage(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)
# python3 爬取網頁的寫法如下:
# request = urllib.request.Request(url, headers=headers)
# response = urllib.request.urlopen(request)
return response.read()
def writeFile(html, filename):
print "正在存儲" + filename
with open(filename, 'wb') as f:
f.write(html)
if __name__ == "__main__":
kw = raw_input("請輸入需要爬取的貼吧:")
# 輸入起始頁和終止頁,str轉成int類型
beginPage = int(raw_input("請輸入起始頁:"))
endPage = int(raw_input("請輸入終止頁:"))
url = "http://tieba.baidu.com/f?"
key = urllib.urlencode({"kw": kw})
# 組合後的url示例:http://tieba.baidu.com/f?kw=lol
url = url + key
tiebaSpider(url, beginPage, endPage)
Python2的POST請求
import urllib
import urllib2
newurl = "http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&smartresult=ugc&sessionFrom=null"
headers = {"User-Agent": "Mozilla...."}
formdata = {
"i": "i love python",
"doctype": "json",
"keyfrom": "fanyi.web",
}
data = urllib.urlencode(formdata)
request = urllib2.Request(newurl, data=data, headers=headers) # post請求一定要帶參數data。
request.add_header("Authorization", "APPCODE " + "d108a3c6fb764d038abc48710fc55ffc")
request.add_header("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8")
request.get_header("Authorization")
request.get_header("Content-type")
response = urllib2.urlopen(request)
print response.read()
# 上面我們說了Request請求對象裏有data參數,它就是用在POST裏的,我們要傳送的數據就是這個參數data,data是一個字典,裏面要匹配鍵值對。
# 發送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加載的內容
# -*- coding:utf-8 -*-
import urllib
import urllib2
url = "https://movie.douban.com/j/chart/top_list?"
# 處理所有參數
formdata = {
'type':'11',
'interval_id':'100:90',
'action':'',
'start': '0',
'limit': '10'
}
url = "https://movie.douban.com/j/chart/top_list?type=11&interval_id=100%3A90&action"
# 變動的是這兩個參數,從start開始往後顯示limit個
formdata = {
'start': '0',
'limit': '10'
}
headers = {"User-Agent": "Mozilla...."}
data = urllib.urlencode(formdata)
request = urllib2.Request(url, data=data, headers=headers)
response = urllib2.urlopen(request)
print response.read()