創(chuàng)新互聯(lián)www.cdcxhl.cn八線動態(tài)BGP香港云服務器提供商,新人活動買多久送多久,劃算不套路!
從策劃到設計制作,每一步都追求做到細膩,制作可持續(xù)發(fā)展的企業(yè)網(wǎng)站。為客戶提供網(wǎng)站設計制作、做網(wǎng)站、網(wǎng)站策劃、網(wǎng)頁設計、主機域名、網(wǎng)站空間、網(wǎng)絡營銷、VI設計、 網(wǎng)站改版、漏洞修補等服務。為客戶提供更好的一站式互聯(lián)網(wǎng)解決方案,以客戶的口碑塑造優(yōu)易品牌,攜手廣大客戶,共同發(fā)展進步。今天就跟大家聊聊有關Python爬蟲之GET和POST的區(qū)別,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
爬蟲——GET請求和POST請求
urllib.parse.urlencode()和urllib.parse.unquote()
編碼工作使用urllib.parse的urlencode()函數(shù),幫我們將key:value這樣的鍵值對轉換成"key=value"這樣的字符串,解碼工作可以使用urllib的unquote()函數(shù)。
# python3.5控制臺中測試結果 >>> import urllib >>> word = {"wd":"爬蟲"} # 通過urllib.parse.urlencode()方法,將字典鍵值對按URL編碼轉換,從而能被wed服務器接受。 >>> urllib.parse.urlencode(word) 'wd=%E7%88%AC%E8%99%AB' # 通過urllib.parse.unquote()方法,把URL編碼字符串,轉換回原先的字符串。 >>> urllib.parse.unquote(word) 'wd=爬蟲'
一般HTTP請求提交數(shù)據(jù),需要編碼成URL編碼格式,然后做為URL的一部分,或者作為參數(shù)傳到Request對象中。
GET方式
GET請求一般用于我們向服務器獲取數(shù)據(jù),比如說,我們用百度搜索 爬蟲:https://www.baidu.com/s?wd=爬蟲(https://www.baidu.com/s?wd=%E7%88%AC%E8%99%AB)
我們可以看到在請求部分里,http://www.baidu.com/s? 之后出現(xiàn)一個長長的字符串,其中就包含我們要查詢的關鍵詞“爬蟲”,于是我們可以嘗試用默認的GET方式來發(fā)送請求。
#!/usr/bin/python3 # -*- coding:utf-8 -*- # 導入庫 import urllib.request import urllib url = "http://www.baidu.com/s?" word = {"wd":"爬蟲"} # 轉換成url編碼格式 word = urllib.parse.urlencode(word) # 拼接成完整的url full_url = url + word # chrome 的 User-Agent,包含在 header里 header = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36'} # url 連同 headers,一起構造Request請求,這個請求將附帶 chrome 瀏覽器的User-Agent request = urllib.request.Request(full_url, headers = header) # 向服務器發(fā)送這個請求 response = urllib.request.urlopen(request) html = response.read() fo = open("baidu.html", "wb") fo.write(html) fo.close()
批量爬取貼吧頁面數(shù)據(jù)
首先我們創(chuàng)建一個python文件:tiebaSpider.py,我們要完成的功能是,輸入一個百度貼吧的地址,比如:百度貼吧LOL吧
第一頁:http://tieba.baidu.com/f?kw=lol&ie=utf-8&pn=0
第二頁:http://tieba.baidu.com/f?kw=lol&ie=utf-8&pn=50
第三頁:http://tieba.baidu.com/f?kw=lol&ie=utf-8&pn=100
……
爬取以上頁面的內(nèi)容
#!/usr/bin/python3 # -*- coding:utf-8 -*- """ 功能:批量爬取貼吧頁面數(shù)據(jù) 目標地址:百度貼吧LOL吧 分析: 第一頁:https://tieba.baidu.com/f?kw=lol&ie=utf-8&pn=0 第二頁:http://tieba.baidu.com/f?kw=lol&ie=utf-8&pn=50 第三頁:http://tieba.baidu.com/f?kw=lol&ie=utf-8&pn=100 …… 規(guī)律: 貼吧中每個頁面URL不同之處,就是最后的pn值,其余的都是一樣的。其pn = (page - 1) * 50 url = "https://tieba.baidu.com/f?kw=lol&ie=utf-8&pn=" pn = (page - 1) * 50 full_url = url + str(pn) """ # 導入庫 import urllib import urllib.request # 根據(jù)url地址,獲取服務器響應文件 def loadPage(url): """ 功能:根據(jù)url地址,獲取服務器響應文件 :param url: url地址 :return: 獲取的服務器響應文件信息 """ # chrome 的User-Agent 頭 header = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36'} # url 連同 headers,一起構造Request請求,這個請求將附帶 chrome 瀏覽器的User-Agent request = urllib.request.Request(url, headers = header) # 向服務器發(fā)送這個請求 reponse = urllib.request.urlopen(request) # 獲取響應文件中的全部內(nèi)容 html = reponse.read() return html # 存儲文件 def writeFile(html, file_name): """ 功能:存服務器響應文件到本地磁盤文件里 :param html: 服務器響應文件內(nèi)容 :param file_name: 本地磁盤文件名 :return: None """ with open(file_name, "wb") as f: f.write(html) # 貼吧爬蟲函數(shù) def tiebaSpider(url, begin_page, end_page): """ 功能:處理從begin_page到end_page的url頁面 :param url: url地址 :param begin_page: 需爬取的起始頁 :param end_page: 需爬取的終止頁 :return: """ for page in range(begin_page, end_page + 1): pn = (page - 1) * 50 full_url = url + str(pn) file_name = "第" + str(page) + "頁.html" print("正在爬取" + file_name) # 獲取full_url對應的html文件信息 html = loadPage(full_url) print("正在存儲" + file_name) # 存儲full_url對應的html文件信息 writeFile(html, file_name) # 主函數(shù) if __name__ == '__main__': url = "https://tieba.baidu.com/f?" # 輸入需爬取的貼吧 kw = input("請輸入需要爬取的貼吧:") # 輸入需爬取的起始頁和終止頁 begin_page = int(input("請輸入起始頁:")) end_page = int(input("請輸入終止頁:")) key = urllib.parse.urlencode({"kw":kw}) # 組合的的url示例:https://tieba.baidu.com/f?kw=lol&ie=utf-8&pn= url = url + key + "&ie=utf-8&pn=" # 調(diào)用貼吧爬蟲函數(shù),爬取數(shù)據(jù) tiebaSpider(url, begin_page, end_page)
POST方式
Request請求對象里有data參數(shù),這就是用在POST里的,我們要傳送的數(shù)據(jù)就是這個參數(shù)data,data是一個字典,里面要有匹配鍵值對。
以下以有道詞典翻譯網(wǎng)站為例為模擬POST請求。
#!/usr/bin/python3 # -*- coding:utf-8 -*- """ POST方式:以有道詞典翻譯網(wǎng)站為例 url = "http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&smartresult=ugc&sessionFrom=null" """ # 導入庫 import urllib.request import urllib url = "http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&smartresult=ugc&sessionFrom=null" # chrome 的 User-Agent,包含在 header里 header = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36'} word = input("請輸入需要翻譯的詞條:") from_data = { "i":word, "from":"AUTO", "to":"AUTO", "smartresult":"dict", "doctype":"json", "version":"2.1", "keyfrom":"fanyi.wed" } data = urllib.parse.urlencode(from_data) data = data.encode(encoding="utf-8") # str轉bytes request = urllib.request.Request(url, data = data, headers = header) response = urllib.request.urlopen(request) html = response.read().decode(encoding = "utf-8").strip() print(html)
獲取AJAX加載的內(nèi)容
有些網(wǎng)頁內(nèi)容是使用AJAX加載的,AJAX一般返回的是JSON,直接對AJAX地址進行POST或GET,就能返回JSON數(shù)據(jù)。
#!/usr/bin/python3 # -*- coding:utf-8 -*- """ 獲取AJAX加載的數(shù)據(jù) 有些網(wǎng)頁內(nèi)容使用AJAX加載,只要記得,AJAX一般返回的是JSON,直接對AJAX地址進行post或get,就返回JSON數(shù)據(jù)了。 以豆瓣為例: url = "https://movie.douban.com/j/chart/top_list?type=11&interval_id=100:90&action&start=0&limit=100" """ # 導入庫 import urllib import urllib.request url = "https://movie.douban.com/j/chart/top_list?" # chrome 的 User-Agent,包含在 header里 header = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36'} from_data = { 'type':'11', 'interval_id':'100:90', 'action':'', 'start':'0', 'limit':'100' } data = urllib.parse.urlencode(from_data) data = data.encode(encoding="utf-8") # str轉bytes request = urllib.request.Request(url, data = data, headers = header) response = urllib.request.urlopen(request) html = response.read().decode(encoding = "utf-8") print(html)
看完上述內(nèi)容,你們對Python爬蟲之GET和POST的區(qū)別有進一步的了解嗎?如果還想了解更多知識或者相關內(nèi)容,請關注創(chuàng)新互聯(lián)-成都網(wǎng)站建設公司行業(yè)資訊頻道,感謝大家的支持。