爬蟲---GET請求和POST請求

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()

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章