python爬虫post请求_Python爬虫之GET和POST请求
爬蟲——GET請求和POST請求
urllib.parse.urlencode()和urllib.parse.unquote()
編碼工作使用urllib.parse的urlencode()函數,幫我們將key:value這樣的鍵值對轉換成"key=value"這樣的字符串,解碼工作可以使用urllib的unquote()函數。#?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請求提交數據,需要編碼成URL編碼格式,然后做為URL的一部分,或者作為參數傳到Request對象中。
GET方式
GET請求一般用于我們向服務器獲取數據,比如說,我們用百度搜索 爬蟲:https://www.baidu.com/s?wd=爬蟲(https://www.baidu.com/s?wd=%E7%88%AC%E8%99%AB)
我們可以看到在請求部分里,http://www.baidu.com/s? 之后出現一個長長的字符串,其中就包含我們要查詢的關鍵詞“爬蟲”,于是我們可以嘗試用默認的GET方式來發送請求。#!/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)
#?向服務器發送這個請求
response?=?urllib.request.urlopen(request)
html?=?response.read()
fo?=?open("baidu.html",?"wb")
fo.write(html)
fo.close()
批量爬取貼吧頁面數據
首先我們創建一個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
……
爬取以上頁面的內容#!/usr/bin/python3
#?-*-?coding:utf-8?-*-
"""
功能:批量爬取貼吧頁面數據
目標地址:百度貼吧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
……
規律:
貼吧中每個頁面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
#?根據url地址,獲取服務器響應文件
def?loadPage(url):
"""
功能:根據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)
#?向服務器發送這個請求
reponse?=?urllib.request.urlopen(request)
#?獲取響應文件中的全部內容
html?=?reponse.read()
return?html
#?存儲文件
def?writeFile(html,?file_name):
"""
功能:存服務器響應文件到本地磁盤文件里
:param?html:?服務器響應文件內容
:param?file_name:?本地磁盤文件名
:return:?None
"""
with?open(file_name,?"wb")?as?f:
f.write(html)
#?貼吧爬蟲函數
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)
#?主函數
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="
#?調用貼吧爬蟲函數,爬取數據
tiebaSpider(url,?begin_page,?end_page)
POST方式
Request請求對象里有data參數,這就是用在POST里的,我們要傳送的數據就是這個參數data,data是一個字典,里面要有匹配鍵值對。
以下以有道詞典翻譯網站為例為模擬POST請求。#!/usr/bin/python3
#?-*-?coding:utf-8?-*-
"""
POST方式:以有道詞典翻譯網站為例
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加載的內容
有些網頁內容是使用AJAX加載的,AJAX一般返回的是JSON,直接對AJAX地址進行POST或GET,就能返回JSON數據。#!/usr/bin/python3
#?-*-?coding:utf-8?-*-
"""
獲取AJAX加載的數據
有些網頁內容使用AJAX加載,只要記得,AJAX一般返回的是JSON,直接對AJAX地址進行post或get,就返回JSON數據了。
以豆瓣為例:
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)
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的python爬虫post请求_Python爬虫之GET和POST请求的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 拔牙后即刻种植牙好吗
- 下一篇: 烤瓷套里面的真牙会烂吗