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 -*-
__author__ = 'mayi'
# 導入庫
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
在學習過程中有什麼不懂得可以加
我的python學習交流扣扣qun,688244617
羣裏有不錯的學習教程、開發工具與電子書籍。
與你分享python企業當下人才需求及怎麼從零基礎學習好python,和學習什麼內容。
# -*- coding:utf-8 -*-
__author__ = 'mayi'
"""
功能:批量爬取貼吧頁面數據
目標地址:百度貼吧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 -*-
__author__ = 'mayi'
"""
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 -*-
__author__ = 'mayi'
"""
獲取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)