關(guān)于python爬蟲模塊urllib庫詳解
1.urllib模塊簡介
python2有urllib和urllib2兩種模塊,都用來實現(xiàn)網(wǎng)絡(luò)請求的發(fā)送。python3將urllib和urllib2模塊整合并命名為urllib模塊。urllib模塊有多個子模塊,各有不同的功能:
- ①urllib.request模塊:用于實現(xiàn)基本的http請求。
- ②urllib.error模塊:用于異常處理。如在發(fā)送網(wǎng)絡(luò)請求時出現(xiàn)錯誤,用該模塊捕捉并處理。
- ③urllib.parse模塊:用于解析。
- ④urllib.robotparser:用于解析robots.txt文件,判斷是否可以爬取網(wǎng)站信息。
2.發(fā)送請求:urlopen()方法
urloprn() 方法由urllib.request模塊提供,以實現(xiàn)基本的http請求,并接受服務(wù)器端返回的響應(yīng)數(shù)據(jù)。
urlopen()語法: urllib.request.urlopen(url,data=None,[timeout,]*,cafile=None,capath=None,cadefault=False,context=None)
- url:訪問網(wǎng)站的完整url地址
- data:默認(rèn)為None,表示請求方式為get請求;如果需要實現(xiàn)post請求,需要字典形式的數(shù)據(jù)作為參數(shù)。
- timeout:設(shè)置超時,單位為秒。
- cafile,capath:指定一組HTTPS請求信任的CA證書,cafile指包含單個證書的CA文件,capath指定證書文件的目錄。
- cadefault:CA證書的默認(rèn)值。
- context:描述SSL選項的 的實例。
3. 發(fā)送GET請求
代碼示例
import urllib.request # 導(dǎo)入request子模塊 url = 'https://www.python.org/' response = urllib.request.urlopen(url=url) # 發(fā)送網(wǎng)絡(luò)請求 print('響應(yīng)數(shù)據(jù)類型為:', type(response)) print('響應(yīng)狀態(tài)碼為:', response.status) print('響應(yīng)狀態(tài)碼為:', response.getcode()) print('響應(yīng)頭所有信息為:', response.getheaders()) print('響應(yīng)頭指定信息為:', response.getheader('Accept-Ranges')) # 讀取HTML代碼并進(jìn)行utf-8解碼 print('Python官網(wǎng)HTML代碼如下:\n', response.read().decode('utf-8'))
輸出結(jié)果如下(部分):
- response是一個<class ‘http.client.HTTPResponse’>對象;
- 響應(yīng)狀態(tài)碼也稱響應(yīng)碼,也稱狀態(tài)碼,可以通過status屬性查看,也可以通過getcode()方法查看。
- getheaders()用于查看響應(yīng)頭所有信息
- getheader()中傳入?yún)?shù),用于查看響應(yīng)頭的指定信息。
- 關(guān)于請求頭&響應(yīng)頭
- 當(dāng)你使用http(https)協(xié)議請求一個網(wǎng)站的時候,你的瀏覽器會向?qū)Ψ降姆?wù)器發(fā)送一個http請求,這個請求同樣包含三個部分
- 請求方法 請求路徑(URL) 請求協(xié)議版本
例:GET https://www.google.com.hk/ HTTP/1.1 - 報文主體
- (POST/GET)參數(shù)
- 請求方法 請求路徑(URL) 請求協(xié)議版本
當(dāng)你向?qū)Ψ桨l(fā)送請求后,對方會回應(yīng)你瀏覽器的請求,返回兩個部分:響應(yīng)頭,Body
Body就是返回給你的主體,比如說請求網(wǎng)站返回的html 響應(yīng)頭訊息里包含了服務(wù)器的響應(yīng)訊息,如http版本,壓縮方式,響應(yīng)文件類型,文件編碼等
4.發(fā)送post請求
即在上邊基礎(chǔ)上,在urlopen()函數(shù)中寫入data參數(shù)。
- post請求會攜帶一些form表單數(shù)據(jù),這個需要復(fù)制過來以字典形式寫入。
表單數(shù)據(jù)在網(wǎng)頁上點擊F12后,在Fetch/XHR一欄中的Payload中獲取。
以爬取有道翻譯,翻譯“你好”為例,此時的表單數(shù)據(jù)如下:
i: 你好
from: AUTO
to: AUTO
smartresult: dict
client: fanyideskweb
salt: 16417380413821
sign: 6545acd2d928b39eb5bead9349a2d4ff
lts: 1641738041382
bv: fdac15c78f51b91dabd0a15d9a1b10f5
doctype: json
version: 2.1
keyfrom: fanyi.web
action: FY_BY_REALTlME
代碼示例如下:
import urllib.request import urllib.parse import json # 要進(jìn)行輸入內(nèi)容 key = input("請輸入內(nèi)容:") data = { "i": key, "from": "AUTO", "to": "AUTO", "smartresult": "dict", "client": "fanyideskweb", "salt": "16374132986488", "sign": "dfd139af546a8cd63de0676f446ca2ee", "lts": "1637413298648", "bv": "03a6a27012b22bc3c7ecc76381772182", "doctype": "json", "version": "2.1", "keyfrom": "fanyi.web", "action": "FY_BY_REALTlME", } # 字節(jié)流,如果輸入中文,需要處理的 data = urllib.parse.urlencode(data) # 轉(zhuǎn)為十六進(jìn)制形式 data = bytes(data, encoding='utf8') # 轉(zhuǎn)為字節(jié)流 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36' } # 目標(biāo)url發(fā)請求 # {"errorCode":50} ,把_o url = 'https://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule' # 構(gòu)建請求對象 req = urllib.request.Request(url, data=data, headers=headers) # 發(fā)請求,獲取響應(yīng)對象 res = urllib.request.urlopen(req) # print(res.getcode()) # 得到響應(yīng)碼,200表示請求成功 html = res.read().decode('utf-8') # print(type(html)) # <class 'str'>,得到的是json數(shù)據(jù) # json數(shù)據(jù)轉(zhuǎn)字典 dic = json.loads(html) result = dic["translateResult"] # [[{'src': '你好', 'tgt': 'hello'}]] print(result[0][0]['tgt'])
另一個簡單的示例:
import urllib.request # 導(dǎo)入urllib.request模塊 import urllib.parse # 導(dǎo)入urllib.parse模塊 url = 'https://www.httpbin.org/post' # post請求測試地址 # 將表單數(shù)據(jù)轉(zhuǎn)換為bytes類型,并設(shè)置編碼方式為utf-8 print() data = bytes(urllib.parse.urlencode({'hello': 'python'}), encoding='utf-8') response = urllib.request.urlopen(url=url, data=data) # 發(fā)送網(wǎng)絡(luò)請求 print(response.read().decode('utf-8')) # 讀取HTML代碼并進(jìn)行
5. 設(shè)置網(wǎng)絡(luò)超時
urlopen()的timeout參數(shù)用于設(shè)置請求超時,該參數(shù)以秒為單位,表示如果在請求時超出了設(shè)置的時間還沒有得到響應(yīng)時就會拋出異常。
import urllib.request url = 'https://www.python.org/' response = urllib.request.urlopen(url=url, timeout=0.1) # 設(shè)置超時時間為0.1秒 print(response.read().decode('utf-8'))
因為0.1秒設(shè)置的過快,結(jié)果因超時而產(chǎn)生異常,報錯。
通常根據(jù)網(wǎng)絡(luò)環(huán)境不同,設(shè)置一個合理的時間,如2秒,3秒。
對該網(wǎng)絡(luò)超時異常進(jìn)行捕捉并處理:
import urllib.request # 導(dǎo)入urllib.request模塊 import urllib.error # 導(dǎo)入urllib.error模塊 import socket # 導(dǎo)入socket模塊 url = 'https://www.python.org/' # 請求地址 try: # 發(fā)送網(wǎng)絡(luò)請求,設(shè)置超時時間為0.1秒 response = urllib.request.urlopen(url=url, timeout=0.1) print(response.read().decode('utf-8')) # 讀取HTML代碼并進(jìn)行utf-8解碼 except urllib.error.URLError as error: # 處理異常 if isinstance(error.reason, socket.timeout): # 判斷異常是否為超時異常 print('當(dāng)前任務(wù)已超時,即將執(zhí)行下一任務(wù)!')
6. 復(fù)雜網(wǎng)絡(luò)請求_urllib.request.Request()
urllib.request.Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None)
參數(shù)說明:
- url:訪問網(wǎng)站的完整url地址
- data:默認(rèn)為None,表示請求方式為get請求;如果需要實現(xiàn)post請求,需要字典形式的數(shù)據(jù)作為參數(shù)。
- headers:設(shè)置請求頭部信息,字典類型。
- origin_req_host:用于設(shè)置請求方的host名稱或者IP。
- unverifiable:用于設(shè)置網(wǎng)頁是否需要驗證,默認(rèn)值為False。
- method:用于設(shè)置請求方式,如GET,POST。
7.設(shè)置請求頭
7.1get請求示例
url = 'https://www.baidu.com' # 定義請求頭信息 headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36'} # 創(chuàng)建Request對象 r = urllib.request.Request(url=url, headers=headers) response = urllib.request.urlopen(r) # 發(fā)送網(wǎng)絡(luò)請求 print(response.read().decode('utf-8')) # 讀取HTML代碼并進(jìn)行utf-8解碼
7.2post請求示例
import urllib.request # 導(dǎo)入urllib.request模塊 import urllib.parse # 導(dǎo)入urllib.parse模塊 url = 'https://www.httpbin.org/post' # 請求地址 # 定義請求頭信息 headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36'} # 將表單數(shù)據(jù)轉(zhuǎn)換為bytes類型,并設(shè)置編碼方式為utf-8 data = bytes(urllib.parse.urlencode({'hello': 'python'}),encoding='utf-8') # 創(chuàng)建Request對象 r = urllib.request.Request(url=url,data=data,headers=headers,method='POST') response = urllib.request.urlopen(r) # 發(fā)送網(wǎng)絡(luò)請求 print(response.read().decode('utf-8')) # 讀取HTML代碼并進(jìn)行utf-8解碼
創(chuàng)建出一個Request對象,然后直接調(diào)用urlopen()函數(shù)。 創(chuàng)建Request也被稱為創(chuàng)建請求對象。
8. Cookies的獲取與設(shè)置
Cookies是服務(wù)器向客戶端返回響應(yīng)數(shù)據(jù)時所留下的標(biāo)記。當(dāng)客戶再次訪問服務(wù)器時會攜帶這個標(biāo)記。一般登錄一個頁面成功后,會在瀏覽器的cookie中保留一些信息,再次訪問時服務(wù)器核對后即可確認(rèn)當(dāng)前用戶登錄過,此時可直接將登錄后的數(shù)據(jù)返回。
import urllib.request url = "https://www.csdn.net/" opener = urllib.request.build_opener() # 獲取opener對象 resp = opener.open(url) print(resp.read().decode())
因為urlopen()方法不支持代理、cookie等其他的HTTP/GTTPS高級功能,所以這里不用urlopen()發(fā)送請求,而需要創(chuàng)建一個opener對象(這本來是urllib2中的方法)。示例如下。學(xué)習(xí)過程中這里作為了解即可,建議重點研究/使用requests庫。
import urllib.request # 導(dǎo)入urllib.request模塊 import http.cookiejar # 導(dǎo)入http.cookiejar子模塊 # 登錄后頁面的請求地址 url = 'xxx' cookie_file = 'cookie.txt' # cookie文件 cookie = http.cookiejar.LWPCookieJar() # 創(chuàng)建LWPCookieJar對象 # 讀取cookie文件內(nèi)容 cookie.load(cookie_file,ignore_expires=True,ignore_discard=True) # 生成cookie處理器 handler = urllib.request.HTTPCookieProcessor(cookie) # 創(chuàng)建opener對象 opener = urllib.request.build_opener(handler) response = opener.open(url) # 發(fā)送網(wǎng)絡(luò)請求 print(response.read().decode('utf-8')) # 打印登錄后頁面的html代碼
9.設(shè)置代理IP
import urllib.request # 導(dǎo)入urllib.request模塊 url= 'xxxxxxxxxxxxxxx' # 創(chuàng)建代理IP proxy_handler = urllib.request.ProxyHandler({ 'https': 'xxxxxxxxxxxxxxxxx' # 寫入代理IP }) # 創(chuàng)建opener對象 opener = urllib.request.build_opener(proxy_handler) response = opener.open(url,timeout=2) print(response.read().decode('utf-8'))
10.異常處理
urllib模塊中的urllib.error子模塊包含了URLError與HTTPError兩個比較重要的異常類。
10.1 URLError
URLError類提供了一個reason屬性,可以通過這個屬性了解錯誤的原因。示例如下:
import urllib.request # 導(dǎo)入urllib.request模塊 import urllib.error # 導(dǎo)入urllib.error模塊 try: # 向不存在的網(wǎng)絡(luò)地址發(fā)送請求 response = urllib.request.urlopen('https://www.python.org/1111111111.html') except urllib.error.URLError as error: # 捕獲異常信息 print(error.reason) # 打印異常原因
程序運行結(jié)果:
10.2HTTPError
HTTPError類是URLError的子類,主要用于處理HTTP請求所出現(xiàn)的一次。此類有以下三個屬性。
- code :返回HTTP狀態(tài)碼
- reason 返回錯誤原因
- headers 返回請求頭
import urllib.request # 導(dǎo)入urllib.request模塊 import urllib.error # 導(dǎo)入urllib.error模塊 try: # 向不存在的網(wǎng)絡(luò)地址發(fā)送請求 response = urllib.request.urlopen('https://www.python.org/1111111111.html') print(response.status) except urllib.error.HTTPError as error: # 捕獲異常信息 print('狀態(tài)碼為:',error.code) # 打印狀態(tài)碼 print('異常信息為:',error.reason) # 打印異常原因 print('請求頭信息如下:\n',error.headers) # 打印請求頭
結(jié)果如下(部分):
10.3URLError&HTTPError雙重異常捕捉
因為URLError是HTTPError的父類,所以在捕獲異常的時候可以先找子類是否異常,父類的異常應(yīng)當(dāng)寫到子類異常的后面,如果子類捕獲不到,那么可以捕獲父類的異常。 URLError產(chǎn)生的原因主要是
網(wǎng)絡(luò)沒有連接,
服務(wù)器連接失
找不到指定的服務(wù)器。
當(dāng)使用urlopen或 opener.open 不能處理的,服務(wù)器上都對應(yīng)一個響應(yīng)對象,其中包含一個數(shù)字(狀態(tài)碼),如果urlopen不能處理,urlopen會產(chǎn)生一個相應(yīng)的HTTPError對應(yīng)相應(yīng)的狀態(tài)碼,HTTP狀態(tài)碼表示HTTP協(xié)議所返回的響應(yīng)的狀態(tài)碼。
import urllib.request # 導(dǎo)入urllib.request模塊 import urllib.error # 導(dǎo)入urllib.error模塊 try: response = urllib.request.urlopen('https://www.python.org/',timeout=0.1) except urllib.error.HTTPError as error: # HTTPError捕獲異常信息 print('狀態(tài)碼為:',error.code) # 打印狀態(tài)碼 print('HTTPError異常信息為:',error.reason) # 打印異常原因 print('請求頭信息如下:\n',error.headers) # 打印請求頭 except urllib.error.URLError as error: # URLError捕獲異常信息 print('URLError異常信息為:',error.reason)
這里訪問了一個真實存在的URL,輸出結(jié)果為:
11.解析URL
urllin模塊提供了parse子模塊用來解析URL。
11.1 拆分URL
urlparse()方法
parse子模塊提供了urlparse()方法,實現(xiàn)將URL分解成不同部分,語法格式如下:
urllib.parse.urlparse(urlstring,scheme=’’,allow_fragment=True)
- urlstring:需要拆分的URL,必選參數(shù)。
- scheme:可選參數(shù),需要設(shè)置的默認(rèn)協(xié)議,默認(rèn)為空字符串,如果要拆分的URL中沒有協(xié)議,可通過該參數(shù)設(shè)置一個默認(rèn)協(xié)議。
- allow_fragment:可選參數(shù),如果該參數(shù)設(shè)置為False,則表示忽略fragment這部分內(nèi)容,默認(rèn)為True。
示例:
import urllib.parse #導(dǎo)入urllib.parse模塊 parse_result = urllib.parse.urlparse('https://docs.python.org/3/library/urllib.parse.html') print(type(parse_result)) # 打印類型 print(parse_result) # 打印拆分后的結(jié)果
程序運行結(jié)果:
用此方法,除了返回ParseResult對象以外,還可以直接獲取ParseResult對象中的每個屬性值:
print('scheme值為:', parse_result.scheme) print('netloc值為:', parse_result.netloc) print('path值為:', parse_result.path) print('params值為:', parse_result.params) print('query值為:', parse_result.query) print('fragment值為:', parse_result.fragment)
urlsplit()方法
urlsplit()方法與urlparse()方法類似,都可以實現(xiàn)URL的拆分。只是urlsplit()方法不再單獨拆分params這部分內(nèi)容,而是將params合并到path中,所以返回結(jié)果只有5部分內(nèi)容。且返回的數(shù)據(jù)類型為SplitResult。
import urllib.parse #導(dǎo)入urllib.parse模塊 # 需要拆分的URL url = 'https://docs.python.org/3/library/urllib.parse.html' print(urllib.parse.urlsplit(url)) # 使用urlsplit()方法拆分URL print(urllib.parse.urlparse(url)) # 使用urlparse()方法拆分URL
程序運行結(jié)果:
11.2 組合URL
urlunparse()方法
urlunparse()方法實現(xiàn)URL的組合 語法:urlunparse(parts) parts表示用于組合url的可迭代對象
import urllib.parse #導(dǎo)入urllib.parse模塊 list_url = ['https', 'docs.python.org', '/3/library/urllib.parse.html', '', '', ''] tuple_url = ('https', 'docs.python.org', '/3/library/urllib.parse.html', '', '', '') dict_url = {'scheme': 'https', 'netloc': 'docs.python.org', 'path': '/3/library/urllib.parse.html', 'params': '', 'query':'', 'fragment': ''} print('組合列表類型的URL:', urllib.parse.urlunparse(list_url)) print('組合元組類型的URL:', urllib.parse.urlunparse(tuple_url)) print('組合字典類型的URL:', urllib.parse.urlunparse(dict_url.values()))
程序運行結(jié)果:
urlunsplit()方法
同樣用于URL組合,只是參數(shù)中的元素必須是5個。
import urllib.parse #導(dǎo)入urllib.parse模塊 list_url = ['https', 'docs.python.org', '/3/library/urllib.parse.html', '', ''] tuple_url = ('https', 'docs.python.org', '/3/library/urllib.parse.html', '', '') dict_url = {'scheme': 'https', 'netloc': 'docs.python.org', 'path': '/3/library/urllib.parse.html', 'query': '', 'fragment': ''} print('組合列表類型的URL:', urllib.parse.urlunsplit(list_url)) print('組合元組類型的URL:', urllib.parse.urlunsplit(tuple_url)) print('組合字典類型的URL:', urllib.parse.urlunsplit(dict_url.values()))
程序運行結(jié)果
11.3 連接URL
用**urljoin()**方法來實現(xiàn)URL的連接。 urllib.parse.urljoin(base,url,allow_fragments=True)
- base 表示基礎(chǔ)鏈接
- url 表示新的鏈接
- allow_fragments 為可選參數(shù),默認(rèn)為Ture,設(shè)為False則忽略fragment這部分內(nèi)容。
import urllib.parse #導(dǎo)入urllib.parse模塊 base_url = 'https://docs.python.org' # 定義基礎(chǔ)鏈接 # 第二參數(shù)不完整時 print(urllib.parse.urljoin(base_url,'3/library/urllib.parse.html')) # 第二參數(shù)完整時,直接返回第二參數(shù)的鏈接 print(urllib.parse.urljoin(base_url,'https://docs.python.org/3/library/urllib.parse.html#url-parsing'))
程序運行結(jié)果:
11.4 URL的編碼與解碼
使用urlencode()方法編碼請求參數(shù),該方法接收的參數(shù)值為字典。
示例
import urllib.parse # 導(dǎo)入urllib.parse模塊 base_url = 'http://httpbin.org/get?' # 定義基礎(chǔ)鏈接 params = {'name': 'Jack', 'country': 'China', 'age': 18} # 定義字典類型的請求參數(shù) url = base_url+urllib.parse.urlencode(params) # 連接請求地址 print('編碼后的請求地址為:', url)
程序運行結(jié)果:
使用quote方法編碼請求參數(shù),該方法接收的參數(shù)值類型為字符串。
示例:
import urllib.parse #導(dǎo)入urllib.parse模塊 base_url = 'http://httpbin.org/get?country=' # 定義基礎(chǔ)鏈接 url = base_url + urllib.parse.quote('中國') # 字符串編碼 print('編碼后的請求地址為:', url)
程序運行結(jié)果:
使用unquote()方法解碼請求參數(shù),即逆向解碼。
示例:
import urllib.parse #導(dǎo)入urllib.parse模塊 u = urllib.parse.urlencode({'country': '中國'}) # 使用urlencode編碼 q = urllib.parse.quote('country=中國') # 使用quote編碼 print('urlencode編碼后結(jié)果為:', u) print('quote編碼后結(jié)果為:', q) print('對urlencode解碼:', urllib.parse.unquote(u)) print('對quote解碼:', urllib.parse.unquote(q))
程序運行結(jié)果:
11.5URL參數(shù)的轉(zhuǎn)換
使用parse_qs()方法將參數(shù)轉(zhuǎn)換為字典類型。
import urllib.parse #導(dǎo)入urllib.parse模塊 # 定義一個請求地址 url = 'http://httpbin.org/get?name=Jack&country=%E4%B8%AD%E5%9B%BD&age=30' q = urllib.parse.urlsplit(url).query # 獲取需要的參數(shù) q_dict = urllib.parse.parse_qs(q) # 將參數(shù)轉(zhuǎn)換為字典類型的數(shù)據(jù) print('數(shù)據(jù)類型為:', type(q_dict)) print('轉(zhuǎn)換后的數(shù)據(jù):', q_dict)
(其中query是前邊拆分部分提到的拆分結(jié)果對象的一個屬性)
程序運行結(jié)果:
使用parse_qsl()方法將參數(shù)轉(zhuǎn)換為元組組成的列表
import urllib.parse # 導(dǎo)入urllib.parse模塊 str_params = 'name=Jack&country=%E4%B8%AD%E5%9B%BD&age=30' # 字符串參數(shù) list_params = urllib.parse.parse_qsl(str_params) # 將字符串參數(shù)轉(zhuǎn)為元組所組成的列表 print('數(shù)據(jù)類型為:', type(list_params)) print('轉(zhuǎn)換后的數(shù)據(jù):', list_params)
程序運行結(jié)果:
到此這篇關(guān)于關(guān)于python爬蟲模塊urllib庫詳解的文章就介紹到這了,更多相關(guān)python爬蟲模塊urllib庫內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用Python和Scribus創(chuàng)建一個RGB立方體的方法
這篇文章主要介紹了使用Python和Scribus創(chuàng)建一個RGB立方體的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07Python時間模塊datetime、time、calendar的使用方法
這篇文章主要介紹了Python時間模塊的使用方法,主要包括三大模塊datetime、time、calendar,感興趣的小伙伴們可以參考一下2016-01-01python3實現(xiàn)用turtle模塊畫一棵隨機櫻花樹
今天小編就為大家分享一篇python3實現(xiàn)用turtle模塊畫一棵隨機櫻花樹,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-11-11PyCharm搭建Spark開發(fā)環(huán)境的實現(xiàn)步驟
這篇文章主要介紹了PyCharm搭建Spark開發(fā)環(huán)境的實現(xiàn)步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09