python爬虫post请求_Python爬虫之GET和POST请求
爬蟲——GET請(qǐng)求和POST請(qǐng)求
urllib.parse.urlencode()和urllib.parse.unquote()
編碼工作使用urllib.parse的urlencode()函數(shù),幫我們將key:value這樣的鍵值對(duì)轉(zhuǎn)換成"key=value"這樣的字符串,解碼工作可以使用urllib的unquote()函數(shù)。#?python3.5控制臺(tái)中測試結(jié)果
>>>?import?urllib
>>>?word?=?{"wd":"爬蟲"}
#?通過urllib.parse.urlencode()方法,將字典鍵值對(duì)按URL編碼轉(zhuǎn)換,從而能被wed服務(wù)器接受。
>>>?urllib.parse.urlencode(word)
'wd=%E7%88%AC%E8%99%AB'
#?通過urllib.parse.unquote()方法,把URL編碼字符串,轉(zhuǎn)換回原先的字符串。
>>>?urllib.parse.unquote(word)
'wd=爬蟲'
一般HTTP請(qǐng)求提交數(shù)據(jù),需要編碼成URL編碼格式,然后做為URL的一部分,或者作為參數(shù)傳到Request對(duì)象中。
GET方式
GET請(qǐng)求一般用于我們向服務(wù)器獲取數(shù)據(jù),比如說,我們用百度搜索 爬蟲:https://www.baidu.com/s?wd=爬蟲(https://www.baidu.com/s?wd=%E7%88%AC%E8%99%AB)
我們可以看到在請(qǐng)求部分里,http://www.baidu.com/s? 之后出現(xiàn)一個(gè)長長的字符串,其中就包含我們要查詢的關(guān)鍵詞“爬蟲”,于是我們可以嘗試用默認(rèn)的GET方式來發(fā)送請(qǐng)求。#!/usr/bin/python3
#?-*-?coding:utf-8?-*-
#?導(dǎo)入庫
import?urllib.request
import?urllib
url?=?"http://www.baidu.com/s?"
word?=?{"wd":"爬蟲"}
#?轉(zhuǎn)換成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,一起構(gòu)造Request請(qǐng)求,這個(gè)請(qǐng)求將附帶?chrome?瀏覽器的User-Agent
request?=?urllib.request.Request(full_url,?headers?=?header)
#?向服務(wù)器發(fā)送這個(gè)請(qǐng)求
response?=?urllib.request.urlopen(request)
html?=?response.read()
fo?=?open("baidu.html",?"wb")
fo.write(html)
fo.close()
批量爬取貼吧頁面數(shù)據(jù)
首先我們創(chuàng)建一個(gè)python文件:tiebaSpider.py,我們要完成的功能是,輸入一個(gè)百度貼吧的地址,比如:百度貼吧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ù)
目標(biāo)地址:百度貼吧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ī)律:
貼吧中每個(gè)頁面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)
"""
#?導(dǎo)入庫
import?urllib
import?urllib.request
#?根據(jù)url地址,獲取服務(wù)器響應(yīng)文件
def?loadPage(url):
"""
功能:根據(jù)url地址,獲取服務(wù)器響應(yīng)文件
:param?url:?url地址
:return:?獲取的服務(wù)器響應(yīng)文件信息
"""
#?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,一起構(gòu)造Request請(qǐng)求,這個(gè)請(qǐng)求將附帶?chrome?瀏覽器的User-Agent
request?=?urllib.request.Request(url,?headers?=?header)
#?向服務(wù)器發(fā)送這個(gè)請(qǐng)求
reponse?=?urllib.request.urlopen(request)
#?獲取響應(yīng)文件中的全部內(nèi)容
html?=?reponse.read()
return?html
#?存儲(chǔ)文件
def?writeFile(html,?file_name):
"""
功能:存服務(wù)器響應(yīng)文件到本地磁盤文件里
:param?html:?服務(wù)器響應(yīng)文件內(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對(duì)應(yīng)的html文件信息
html?=?loadPage(full_url)
print("正在存儲(chǔ)"?+?file_name)
#?存儲(chǔ)full_url對(duì)應(yīng)的html文件信息
writeFile(html,?file_name)
#?主函數(shù)
if?__name__?==?'__main__':
url?=?"https://tieba.baidu.com/f?"
#?輸入需爬取的貼吧
kw?=?input("請(qǐng)輸入需要爬取的貼吧:")
#?輸入需爬取的起始頁和終止頁
begin_page?=?int(input("請(qǐng)輸入起始頁:"))
end_page?=?int(input("請(qǐng)輸入終止頁:"))
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請(qǐng)求對(duì)象里有data參數(shù),這就是用在POST里的,我們要傳送的數(shù)據(jù)就是這個(gè)參數(shù)data,data是一個(gè)字典,里面要有匹配鍵值對(duì)。
以下以有道詞典翻譯網(wǎng)站為例為模擬POST請(qǐng)求。#!/usr/bin/python3
#?-*-?coding:utf-8?-*-
"""
POST方式:以有道詞典翻譯網(wǎng)站為例
url?=?"http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&smartresult=ugc&sessionFrom=null"
"""
#?導(dǎo)入庫
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("請(qǐng)輸入需要翻譯的詞條:")
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轉(zhuǎn)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,直接對(duì)AJAX地址進(jìn)行POST或GET,就能返回JSON數(shù)據(jù)。#!/usr/bin/python3
#?-*-?coding:utf-8?-*-
"""
獲取AJAX加載的數(shù)據(jù)
有些網(wǎng)頁內(nèi)容使用AJAX加載,只要記得,AJAX一般返回的是JSON,直接對(duì)AJAX地址進(jìn)行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"
"""
#?導(dǎo)入庫
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轉(zhuǎn)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位技術(shù)專家面對(duì)面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的python爬虫post请求_Python爬虫之GET和POST请求的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 拔牙后即刻种植牙好吗
- 下一篇: python斐波那契数列前20项_Pyt