導航:首頁 > 編程語言 > python新聞簡報

python新聞簡報

發布時間:2023-06-07 02:41:06

python 新浪微博爬蟲,求助

0x00. 起因
因為參加學校大學生創新競賽,研究有關微博博文表達的情緒,需要大量微博博文,而網上無論是國內的某度、csdn,還是國外谷歌、gayhub、codeproject等都找不到想要的程序,沒辦法只能自己寫一個程序了。
ps.在爬盟找到類似的程序,但是是windows下的,並且閉源,而且最終爬取保存的文件用notepad++打開有很多奇怪的問題,所以放棄了。
0x01. 基礎知識
本程序由Python寫成,所以基本的python知識是必須的。另外,如果你有一定的計算機網路基礎,在前期准備時會有少走很多彎路。
對於爬蟲,需要明確幾點:
1. 對爬取對象分類,可以分為以下幾種:第一種是不需要登錄的,比如博主以前練手時爬的中國天氣網,這種網頁爬取難度較低,建議爬蟲新手爬這類網頁;第二種是需要登錄的,如豆瓣、新浪微博,這些網頁爬取難度較高;第三種獨立於前兩種,你想要的信息一般是動態刷新的,如AJAX或內嵌資源,這種爬蟲難度最大,博主也沒研究過,在此不細舉(據同學說淘寶的商品評論就屬於這類)。
2. 如果同一個數據源有多種形式(比如電腦版、手機版、客戶端等),優先選取較為「純凈的」展現。比如新浪微博,有網頁版,也有手機版,而且手機版可以用電腦瀏覽器訪問,這時我優先選手機版新浪微博。
3. 爬蟲一般是將網頁下載到本地,再通過某些方式提取出感興趣的信息。也就是說,爬取網頁只完成了一半,你還要將你感興趣的信息從下載下來的html文件中提取出來。這時就需要一些xml的知識了,在這個項目中,博主用的是XPath提取信息,另外可以使用XQuery等等其他技術,詳情請訪問w3cschool。
4. 爬蟲應該盡量模仿人類,現在網站反爬機制已經比較發達,從驗證碼到禁IP,爬蟲技術和反爬技術可謂不斷博弈。
0x02. 開始
決定了爬蟲的目標之後,首先應該訪問目標網頁,明確目標網頁屬於上述幾種爬蟲的哪種,另外,記錄為了得到感興趣的信息你需要進行的步驟,如是否需要登錄,如果需要登錄,是否需要驗證碼;你要進行哪些操作才能獲得希望得到的信息,是否需要提交某些表單;你希望得到的信息所在頁面的url有什麼規律等等。
以下博文以博主項目為例,該項目爬取特定新浪微博用戶從注冊至今的所有微博博文和根據關鍵詞爬取100頁微博博文(大約1000條)。
0x03. 收集必要信息
首先訪問目標網頁,發現需要登錄,進入登錄頁面如下新浪微博手機版登錄頁面
注意url後半段有很多形如」%xx」的轉義字元,本文後面將會講到。
從這個頁面可以看到,登錄新浪微博手機版需要填寫賬號、密碼和驗證碼。
這個驗證碼是近期(本文創作於2016.3.11)才需要提供的,如果不需要提供驗證碼的話,將有兩種方法進行登錄。
第一種是填寫賬號密碼之後執行js模擬點擊「登錄」按鈕,博主之前寫過一個Java爬蟲就是利用這個方法,但是現在找不到工程了,在此不再贅述。
第二種需要一定HTTP基礎,提交包含所需信息的HTTP POST請求。我們需要Wireshark 工具來抓取登錄微博時我們發出和接收的數據包。如下圖我抓取了在登錄時發出和接收的數據包Wireshark抓取結果1
在搜索欄提供搜索條件」http」可得到所有http協議數據包,右側info顯示該數據包的縮略信息。圖中藍色一行是POST請求,並且info中有」login」,可以初步判斷這個請求是登錄時發出的第一個數據包,並且這個180.149.153.4應該是新浪微博手機版登錄認證的伺服器IP地址,此時我們並沒有任何的cookie。
在序號為30是數據包中有一個從該IP發出的HTTP數據包,裡面有四個Set-Cookie欄位,這些cookie將是我們爬蟲的基礎。
Wireshark抓取結果2
早在新浪微博伺服器反爬機制升級之前,登錄是不需要驗證碼的,通過提交POST請求,可以拿到這些cookie,在項目源碼中的TestCookie.py中有示例代碼。
ps.如果沒有wireshark或者不想這么麻煩的話,可以用瀏覽器的開發者工具,以chrome為例,在登錄前打開開發者工具,轉到Network,登錄,可以看到發出和接收的數據,登錄完成後可以看到cookies,如下圖chrome開發者工具
接下來訪問所需頁面,查看頁面url是否有某種規律。由於本項目目標之一是獲取某用戶的全部微博,所以直接訪問該用戶的微博頁面,以央視新聞 為例。
央視新聞1
圖為央視新聞微博第一頁,觀察該頁面的url可以發現,新浪微博手機版的微博頁面url組成是 「weibo.cn/(displayID)?page=(pagenum)」 。這將成為我們爬蟲拼接url的依據。
接下來查看網頁源碼,找到我們希望得到的信息的位置。打開瀏覽器開發者工具,直接定位某條微博,可以發現它的位置,如下所示。
xpath
觀察html代碼發現,所有的微博都在<div>標簽里,並且這個標簽里有兩個屬性,其中class屬性為」c」,和一個唯一的id屬性值。得到這個信息有助於將所需信息提取出來。
另外,還有一些需要特別注意的因素
* 微博分為原創微博和轉發微博
* 按照發布時間至當前時間的差距,在頁面上有」MM分鍾前」、」今天HH:MM」、」mm月dd日 HH:MM」、」yyyy-mm-dd HH:MM:SS」等多種顯示時間的方式* 手機版新浪微博一個頁面大約顯示10條微博,所以要注意對總共頁數進行記錄以上幾點都是細節,在爬蟲和提取的時候需要仔細考慮。
0x04. 編碼
1.爬取用戶微博
本項目開發語言是Python 2.7,項目中用了一些第三方庫,第三方庫可以用pip的方法添加。
既然程序自動登錄的想法被驗證碼擋住了,想要訪問特定用戶微博頁面,只能使用者提供cookies了。
首先用到的是Python的request模塊,它提供了帶cookies的url請求。
import request
print request.get(url, cookies=cookies).content使用這段代碼就可以列印帶cookies的url請求頁面結果。
首先取得該用戶微博頁面數,通過檢查網頁源碼,查找到表示頁數的元素,通過XPath等技術提取出頁數。
頁數
項目使用lxml模塊對html進行XPath提取。
首先導入lxml模塊,在項目里只用到了etree,所以from lxml import etree
然後利用下面的方法返回頁數
def getpagenum(self):
url = self.geturl(pagenum=1)
html = requests.get(url, cookies=self.cook).content # Visit the first page to get the page number.
selector = etree.HTML(html)
pagenum = selector.xpath('//input[@name="mp"]/@value')[0]
return int(pagenum)
接下來就是不斷地拼接url->訪問url->下載網頁。
需要注意的是,由於新浪反爬機制的存在,同一cookies訪問頁面過於「頻繁」的話會進入類似於「冷卻期」,即返回一個無用頁面,通過分析該無用頁面發現,這個頁面在特定的地方會出現特定的信息,通過XPath技術來檢查這個特定地方是否出現了特定信息即可判斷該頁面是否對我們有用。
def ispageneeded(html):
selector = etree.HTML(html)
try:
title = selector.xpath('//title')[0]
except:
return False
return title.text != '微博廣場' and title.text != '微博'
如果出現了無用頁面,只需簡單地重新訪問即可,但是通過後期的實驗發現,如果長期處於過頻訪問,返回的頁面將全是無用頁面,程序也將陷入死循環。為了避免程序陷入死循環,博主設置了嘗試次數閾值trycount,超過這個閾值之後方法自動返回。
下面代碼片展示了單線程爬蟲的方法。
def startcrawling(self, startpage=1, trycount=20):
attempt = 0
try:
os.mkdir(sys.path[0] + '/Weibo_raw/' + self.wanted)except Exception, e:
print str(e)
isdone = False
while not isdone and attempt < trycount:
try:
pagenum = self.getpagenum()
isdone = True
except Exception, e:
attempt += 1
if attempt == trycount:
return False
i = startpage
while i <= pagenum:
attempt = 0
isneeded = False
html = ''
while not isneeded and attempt < trycount:
html = self.getpage(self.geturl(i))
isneeded = self.ispageneeded(html)
if not isneeded:
attempt += 1
if attempt == trycount:
return False
self.savehtml(sys.path[0] + '/Weibo_raw/' + self.wanted + '/' + str(i) + '.txt', html)print str(i) + '/' + str(pagenum - 1)
i += 1
return True
考慮到程序的時間效率,在寫好單線程爬蟲之後,博主也寫了多線程爬蟲版本,基本思想是將微博頁數除以線程數,如一個微博用戶有100頁微博,程序開10個線程,那麼每個線程只負責10個頁面的爬取,其他基本思想跟單線程類似,只需仔細處理邊界值即可,在此不再贅述,感興趣的同學可以直接看代碼。另外,由於多線程的效率比較高,並發量特別大,所以伺服器很容易就返回無效頁面,此時trycount的設置就顯得更重要了。博主在寫這篇微博的時候,用一個新的cookies,多線程爬取現場測試了一下爬取北京郵電大學的微博,3976條微博全部爬取成功並提取博文,用時僅15s,實際可能跟cookies的新舊程度和網路環境有關,命令行設置如下,命令行意義在項目網址里有說明python main.py _T_WM=xxx; SUHB=xxx; SUB=xxx; gsid_CTandWM=xxx u bupt m 20 20爬取的工作以上基本介紹結束,接下來就是爬蟲的第二部分,解析了。由於項目中提供了多線程爬取方法,而多線程一般是無序的,但微博博文是依靠時間排序的,所以項目採用了一種折衷的辦法,將下載完成的頁面保存在本地文件系統,每個頁面以其頁號為文件名,待爬取的工作結束後,再遍歷文件夾內所有文件並解析。
通過前面的觀察,我們已經了解到微博博文存在的標簽有什麼特點了,利用XPath技術,將這個頁面里所有有這個特點的標簽全部提取出來已經不是難事了。
在這再次提醒,微博分為轉發微博和原創微博、時間表示方式。另外,由於我們的研究課題僅對微博文本感興趣,所以配圖不考慮。
def startparsing(self, parsingtime=datetime.datetime.now()):
basepath = sys.path[0] + '/Weibo_raw/' + self.uidfor filename in os.listdir(basepath):
if filename.startswith('.'):
continue
path = basepath + '/' + filename
f = open(path, 'r')
html = f.read()
selector = etree.HTML(html)
weiboitems = selector.xpath('//div[@class="c"][@id]')for item in weiboitems:
weibo = Weibo()
weibo.id = item.xpath('./@id')[0]
cmt = item.xpath('./div/span[@class="cmt"]')if len(cmt) != 0:
weibo.isrepost = True
weibo.content = cmt[0].text
else:
weibo.isrepost = False
ctt = item.xpath('./div/span[@class="ctt"]')[0]
if ctt.text is not None:
weibo.content += ctt.text
for a in ctt.xpath('./a'):
if a.text is not None:
weibo.content += a.text
if a.tail is not None:
weibo.content += a.tail
if len(cmt) != 0:
reason = cmt[1].text.split(u'\xa0')
if len(reason) != 1:
weibo.repostreason = reason[0]
ct = item.xpath('./div/span[@class="ct"]')[0]
time = ct.text.split(u'\xa0')[0]
weibo.time = self.gettime(self, time, parsingtime)self.weibos.append(weibo.__dict__)
f.close()
方法傳遞的參數parsingtime的設置初衷是,開發前期爬取和解析可能不是同時進行的(並不是嚴格的「同時」),微博時間顯示是基於訪問時間的,比如爬取時間是10:00,這時爬取到一條微博顯示是5分鍾前發布的,但如果解析時間是10:30,那麼解析時間將錯誤,所以應該講解析時間設置為10:00。到後期爬蟲基本開發完畢,爬取工作和解析工作開始時間差距降低,時間差將是爬取過程時長,基本可以忽略。
解析結果保存在一個列表裡,最後將這個列表以json格式保存到文件系統里,刪除過渡文件夾,完成。
def save(self):
f = open(sys.path[0] + '/Weibo_parsed/' + self.uid + '.txt', 'w')jsonstr = json.mps(self.weibos, indent=4, ensure_ascii=False)f.write(jsonstr)
f.close()
2.爬取關鍵詞
同樣的,收集必要的信息。在微博手機版搜索頁面敲入」python」,觀察url,研究其規律。雖然第一頁並無規律,但是第二頁我們發現了規律,而且這個規律可以返回應用於第一頁第一頁
第二頁
應用後第一頁
觀察url可以發現,對於關鍵詞的搜索,url中的變數只有keyword和page(事實上,hideSearchFrame對我們的搜索結果和爬蟲都沒有影響),所以在代碼中我們就可以對這兩個變數進行控制。
另外,如果關鍵詞是中文,那麼url就需要對中文字元進行轉換,如我們在搜索框敲入」開心」並搜索,發現url如下顯示搜索開心
但復制出來卻為
http://weibo.cn/search/mblog?hideSearchFrame=&keyword=%E5%BC%80%E5%BF%83&page=1幸好,python的urllib庫有qoute方法處理中文轉換的功能(如果是英文則不做轉換),所以在拼接url前使用這個方法處理一下參數。
另外,考慮到關鍵詞搜索屬於數據收集階段使用的方法,所以在此只提供單線程下載網頁,如有多線程需要,大家可以按照多線程爬取用戶微博的方法自己改寫。最後,對下載下來的網頁進行提取並保存(我知道這樣的模塊設計有點奇怪,打算重(xin)構(qing)時(hao)時再改,就先這樣吧)。
def keywordcrawling(self, keyword):
realkeyword = urllib.quote(keyword) # Handle the keyword in Chinese.
try:
os.mkdir(sys.path[0] + '/keywords')
except Exception, e:
print str(e)
weibos = []
try:
highpoints = re.compile(u'[\U00010000-\U0010ffff]') # Handle emoji, but it seems doesn't work.
except re.error:
highpoints = re.compile(u'[\uD800-\uDBFF][\uDC00-\uDFFF]')pagenum = 0
isneeded = False
while not isneeded:
html = self.getpage('http://weibo.cn/search/mblog?keyword=%s&page=1' % realkeyword)isneeded = self.ispageneeded(html)
if isneeded:
selector = etree.HTML(html)
try:
pagenum = int(selector.xpath('//input[@name="mp"]/@value')[0])except:
pagenum = 1
for i in range(1, pagenum + 1):
try:
isneeded = False
while not isneeded:
html = self.getpage('http://weibo.cn/search/mblog?keyword=%s&page=%s' % (realkeyword, str(i)))isneeded = self.ispageneeded(html)
selector = etree.HTML(html)
weiboitems = selector.xpath('//div[@class="c"][@id]')for item in weiboitems:
cmt = item.xpath('./div/span[@class="cmt"]')if (len(cmt)) == 0:
ctt = item.xpath('./div/span[@class="ctt"]')[0]
if ctt.text is not None:
text = etree.tostring(ctt, method='text', encoding="unicode")tail = ctt.tail
if text.endswith(tail):
index = -len(tail)
text = text[1:index]
text = highpoints.sub(u'\u25FD', text) # Emoji handling, seems doesn't work.
weibotext = text
weibos.append(weibotext)
print str(i) + '/' + str(pagenum)
except Exception, e:
print str(e)
f = open(sys.path[0] + '/keywords/' + keyword + '.txt', 'w')try:
f.write(json.mps(weibos,indent=4,ensure_ascii=False))except Exception,ex:
print str(ex)
finally:
f.close()
博主之前從未寫過任何爬蟲程序,為了獲取新浪微博博文,博主先後寫了3個不同的爬蟲程序,有Python,有Java,爬蟲不能用了是很正常的,不要氣餒,爬蟲程序和反爬機制一直都在不斷博弈中,道高一尺魔高一丈。
另. 轉載請告知博主,如果覺得博主帥的話就可以不用告知了

⑵ python3 怎麼爬取新聞網站

需求:

從門戶網站爬取新聞,將新聞標題,作者,時間,內容保存到本地txt中。

用到的python模塊:

importre#正則表達式
importbs4#BeautifulSoup4解析模塊
importurllib2#網路訪問模塊
importNews#自己定義的新聞結構
importcodecs#解決編碼問題的關鍵,使用codecs.open打開文件
importsys#1解決不同頁面編碼問題

其中bs4需要自己裝一下,安裝方法可以參考:Windows命令行下pip安裝python whl包

程序:

#coding=utf-8
importre#正則表達式
importbs4#BeautifulSoup4解析模塊
importurllib2#網路訪問模塊
importNews#自己定義的新聞結構
importcodecs#解決編碼問題的關鍵,使用codecs.open打開文件
importsys#1解決不同頁面編碼問題

reload(sys)#2
sys.setdefaultencoding('utf-8')#3

#從首頁獲取所有鏈接
defGetAllUrl(home):
html=urllib2.urlopen(home).read().decode('utf8')
soup=bs4.BeautifulSoup(html,'html.parser')
pattern='http://w+.jia..com/article/w+'
links=soup.find_all('a',href=re.compile(pattern))
forlinkinlinks:
url_set.add(link['href'])

defGetNews(url):
globalNewsCount,MaxNewsCount#全局記錄新聞數量
whilelen(url_set)!=0:
try:
#獲取鏈接
url=url_set.pop()
url_old.add(url)

#獲取代碼
html=urllib2.urlopen(url).read().decode('utf8')

#解析
soup=bs4.BeautifulSoup(html,'html.parser')
pattern='http://w+.jia..com/article/w+'#鏈接匹配規則
links=soup.find_all('a',href=re.compile(pattern))

#獲取URL
forlinkinlinks:
iflink['href']notinurl_old:
url_set.add(link['href'])

#獲取信息
article=News.News()
article.url=url#URL信息
page=soup.find('div',{'id':'page'})
article.title=page.find('h1').get_text()#標題信息
info=page.find('div',{'class':'article-info'})
article.author=info.find('a',{'class':'name'}).get_text()#作者信息
article.date=info.find('span',{'class':'time'}).get_text()#日期信息
article.about=page.find('blockquote').get_text()
pnode=page.find('div',{'class':'article-detail'}).find_all('p')
article.content=''
fornodeinpnode:#獲取文章段落
article.content+=node.get_text()+' '#追加段落信息

SaveNews(article)

printNewsCount
break
exceptExceptionase:
print(e)
continue
else:
print(article.title)
NewsCount+=1
finally:
#判斷數據是否收集完成
ifNewsCount==MaxNewsCount:
break

defSaveNews(Object):
file.write("【"+Object.title+"】"+" ")
file.write(Object.author+" "+Object.date+" ")
file.write(Object.content+" "+" ")

url_set=set()#url集合
url_old=set()#爬過的url集合

NewsCount=0
MaxNewsCount=3

home='http://jia..com/'#起始位置

GetAllUrl(home)

file=codecs.open("D:\test.txt","a+")#文件操作

forurlinurl_set:
GetNews(url)
#判斷數據是否收集完成
ifNewsCount==MaxNewsCount:
break

file.close()

新聞文章結構

#coding:utf-8
#文章類定義
classNews(object):
def__init__(self):
self.url=None
self.title=None
self.author=None
self.date=None
self.about=None
self.content=None

對爬取的文章數量就行統計。

⑶ python可以做到自動抓取互聯網上的新聞更新到網站嗎

理論上完全可以實現,相應的技術方案也是比較成熟的。不知道需要爬取的網站內容復雜不復雜的。目前我想到的方案是藉助爬蟲框架,數據存儲可利用mysql,mongodb之類的。打個比方,這是我用scrapy爬取詩詞網站的數據,臘純然後存儲到Mongodb中,就是缺少一部更新。

我們可以設定一個任務,任務可以是每1分鍾更新一下爬取數據,這樣就可以做到對應網站數據的更新,至於自身網站數據的更新,因為是客戶端發起的,所以,只要做到伺服器商數汪帶據更新了,客戶端就可以看到最新的數據,當然,需要注意相應的緩存技術的影響。

總的來說,爬取網站的數據然後更新到網站,是完全可以實現的。主要是看出於什麼的目的,以及爬輪陵咐取的網站的復雜性問題。

⑷ Python如何簡單爬取騰訊新聞網前五頁文字內容

可以使用python裡面的一個爬蟲庫,beautifulsoup,這個庫可以很方便的爬取數據。爬蟲首先就得知道網頁的鏈接,然後獲取網頁的源代碼,通過正則表達式或者其他方法來獲取所需要的內容,具體還是要對著網頁源代碼進行操作,查看需要哪些地方的數據,然後通過beautifulsoup來爬取特定html標簽的內容。網上有很多相關的內容,可以看看。

⑸ 請教python Scrapy 高手 如何抓取騰訊新聞評論頁面內容,有重謝

其實你可以換個思路,scrapy的確是可以爬去js生成的代碼,使用webkit中間件,這個網上有教程,你可以搜一下。
但是有個更好的方法,通過請求分析獲取到評論的信息,比如:
這個新聞:http://coral.qq.com/1129103872
對應的評論地址:http://coral.qq.com/article/1129103872/comment?reqnum=2000
後面那個reqnum是你要提取的評論數,希望這個能幫到你。

如果解決了您的問題請採納!
如果未解決請繼續追問

⑹ python如何利用已有的語料庫,對一篇新聞文本進行分詞

把自己的語料庫(sogou文本分類語料庫)放在LTK_DATA/corpora/目錄下;
然後在命令行輸入以下之後,即可看到所有的txt文件名列表了。

⑺ Python 在編程語言中是什麼地位為什麼很多大學不教 Python

Python是當下非常熱門的一種編程語言。熱門到什麼程度?我們首先看看最近流行的編程語言排行榜:

這是 TIOBE編程語言社區發布的2018年1月排行榜,Python已經超過C#躍居熱門編程語言的第四位。

那麼,Python為什麼會成長為如此熱門的語言呢?

首先,跟最近大熱的AI人工智慧和深度學習技術是分不開的。現在流行的AI人工智慧技術大部分都是用Python語言編寫的,這大大促進了的Python語言的發展。AI深度學習技術本身的特點決定了其不適合靜態編譯型語言,而Python語言被選作AI技術框架的基礎語言,更多的是源於Python的動態特性及其開發效率高等性能優勢。

說起來Ruby、Perl等與Python同屬動態語言,三者的運行效率相差並不大,而Python既可以寫網路又可以處理數據,所以Python當仁不讓的成為了AI技術的首選。

豆瓣的崛起是對Python語言性能的實例鑒證。豆瓣是最早使用Python作為語言的網站,其創始人用3個月時間使用基於Python的Quixote框架開發搭建了最初的豆瓣社區的框架。當時,PHP和JAVA是絕對的主流技術,但是想要用PHP或JAVA開發網站,需要自己動手處理大量的工作,單靠一個人在短時間內完成開發一個功能齊全的大型網站幾乎是不可能的,所以Python的敏捷性與高效性使其當選為豆瓣的網站語言。

其次,Python涉及多領域的應用范圍,促進了其成為熱門語言。除了web開發,Python也應用於學術研究及科學領域。對於科研人員來說,Python簡單易學,容易上手,即使非計算機專業的科研學者利用Python龐大的庫和簡單的語法,也可以編寫工具幫助進行科學學術研究。

Python擁有Matplotlib(matplotlib.org/)及numPy(www.numpy.org/)這樣強大的繪圖庫和數值擴展,能幫助科研學術人員進行繪圖和數值分析。這使得Python在該領域成為難以替代的選擇。基於同樣的原因,Python在國外政府部門也被大量運用。

Python還廣泛應用於電子製造行業,比如布線模擬等CAD領域,比起傳統的TCL編程,Python語言要友好的多。很多使用C/C++/JAVA編寫的測試工具,由於靜態編譯語言維護成本相對較高,現在已經開始轉為用Python編寫了。在金融領域,比如量化交易,Python同樣有許多強大的擴展庫。

隨著Python擴展庫不斷發展壯大,Python在科研、電子、政府、數據分析、web、金融、圖像處理、AI技術各方面都有強大的類庫、框架和解決方案,以致有了「已經沒有任何語言能夠動搖Python在今後生產生活的核心語言地位」的說法。因此也出現了在義務教育階段就開始教授Python語言的情況出現。據說在美國,連嬰幼兒都有 Python 編程書,Python 要從娃娃抓起。

第三,國家對於人工智慧的重視,助推了Python的熱門。2018年1月16日上午,教育部召開新聞發布會,介紹了《普通高中課程方案和語文等學科課程標准(2017年版)》的有關情況,並重新修訂了語文等14門學科的課程標准。在此次「新課標」改革中,正式將人工智慧、物聯網、大數據處理劃入新課標,這也就意味著今年秋季入學的高中生,將要開始學習Python了。

⑻ python背後是一項科技運動

比較官方的說法,python是一種解釋型語言,解釋型語言是指代碼一行一行的解釋執行,就好像有個 同聲傳譯 ,你每說一句話,他都能不間斷地給你翻譯,把你說的話(意指寫好的代碼)翻譯成機器能夠理解的語言。對於機器來說,這些翻譯後的語言就是機器語言,就是指令,機器收到指令後,就會根據指令執行對應的操作。

與解釋型語言相對的,有編譯型語言,編譯型語言則通過編譯器先將代碼翻譯成機器語言,再交給機器去執行。舉個例子,我方主持了一個會議,參會的分別有英國人、俄國人和西班牙人,他們三方都帶了自己的同聲傳譯。假如是解釋型語言呢,我在開會的時候用一種每個同聲傳譯都聽得懂的的語言,也就是一種官方用語。這樣我可以不間斷地用這種語言來做交流,因為這些翻譯人員都會為這三國參會人員同步翻譯成目標語言,你應該也注意到了,解釋型語言類似於一種通用的語言。而如果是編譯型語言呢,我會讓我這邊的3個翻譯人員將我的一份中文演講稿,分別翻譯成英文版的、俄文版的和西班牙語版的,在開會的時候,我只要交給參會的國際友人去翻閱就好了。解釋型語言側重的是一種通用的、能夠實時解釋翻譯的特性,而編譯型語言側重的是有針對性、提前准備的特性。然而,在開會的時候,解釋型效率是沒有那麼高的,因為需要同聲傳譯消耗時間去做翻譯,而編譯型的效率會高些,因為翻譯工作已經在開會前做好了,只需要參會人員理解並且執行就好。


1989年的聖誕節,荷蘭程序員Guido van Rossum( 吉多·范羅蘇姆 ,以下簡稱吉多)在家休假無聊,為了打發時間,他開發了一種新的解釋型語言。可見,該程序員無聊的時候,就是寫代碼。因為作者非常喜歡 Monty Python's Flying Circus (巨蟒劇團之飛翔的馬戲團,這是英國的一個電視喜劇),就拿python作為這個新語言的名字。我想大家不一定都知道這部喜劇,但是可能都聽說過python,可能微信在幾天前給你推過python相關的培訓廣告,可能一些學校已經將掌握python基礎概念作為一門選修課,可能你的智能家居里的操作系統有一部分核心代碼是用python實現的,可能你的手機里有一個插件也是用python實現的,python現在的應用范圍非常廣泛,功能也非常強大。

吉多之前在 荷蘭數學和計算機科學研究學會 上班,在那裡,他為ABC編程語言工作了好多年。 ABC語言長這樣的

這是一個函數,你也許看不懂,根據英文單詞,或許可以大概猜出點什麼。這里只想讓你知道,python也差不多長這樣,相比較會更容易理解些。

ABC雖然是一門編程語言,它的定位是作為教學或原型設計的工具,是專門為學校老師或者科研人員設計的。ABC的定位決定了它受眾不是很廣泛,並且它也有使用門檻,對計算機不了解的人,沒有經過一段時間的學習,可能根本就上不了手。所以,ABC並不能作為一門通用的編程語言,在業內也無法獲得成功。雖然說ABC沒有python那麼成功,但是ABC可以說是"the mother of python",作者在很多地方都借鑒了ABC,取其精華、取其糟粕。現如今,python是長這樣的

可能對於沒接觸過編程的人來說,它們兩不都是一樣的,不都是一堆英文字母么,我都看不懂。但是對於初學計算機課程,那些需要學習C語言的人來說,python相比較算是更容易理解了。python非常簡短,一些復雜的流程,在C語言中,可能需要幾十行代碼,但是在python中,可能就只需要幾行代碼。當然不同的業務場景,可能不是這樣的,但是普遍情況下,用python的開發效率是非常高的。python適合快速開發,適合產品快速迭代出新。

1999年1月,也就是語言面世的10年後, 吉多 向DARPA(Defense Advanced Research Projects Agency,美國國防部一個負責科研的下屬機構)申請資金。我去翻了下該申請的修訂版,修訂版在1999年8月份提交,修訂版比第一版內容更具有概括性,並且內容翔實,條理清晰,值得翻閱。

該修訂版叫 Computer Programming for Everybody ,直譯過來,就是針對每個人的計算機編程,翻譯為通俗易懂的詞——人人編程,人人編程是一種 社會 現象,每個人都有一定的編程能力,並且對計算機有一定的認識,了解軟硬體是怎麼運轉起來的,了解一些軟硬體的設計規范,能夠通過編程來表達自己的想法,能夠通過編程來配置自己的軟體,通過編程來控制自己的機器,以改善自己的生活。舉個例子,你在某寶買了一個掃地機器人,該機器人支持定義打掃路線,支持設置掃地機器人在需要更換掃把的時候,指示燈顯示指定的顏色。你知道掃地機器人可以做什麼,有什麼操作習慣,這是基於你對一些機器的理解,如果你用過很多軟體,或者參與過軟體的設計,你大概都知道一些軟體可能都有「設置」、「編輯」或「幫助」等菜單鍵。這種設計思維,或者操作習慣,都是很多軟體都有的,有了這種認識之後,你面對很多同類型的軟體、或者同類型的產品,就大概能夠知道從那裡入手,以及對它有什麼功能,都有一個初步的期待或者認識。既然大家都了解計算機了,那麼計算機的一些概念或者說是理念,可以說是屬於常識的一部分,面對一些計算機或者說智能設備,也大概知道從哪裡上手使用。我覺得這就是作者要達到的願景。

該修訂版主要有幾個目的:

在這里,他想從推廣python開始,因為python作為一門適合快速開發的工具,既適合專家,也適合初學者,同時python有一個活躍的且不斷增長的用戶群體,這個用戶群體對他這個申請也非常感興趣,願意為之努力。python的用戶數多,說明已經在市場得到了一定的認可,並且這個用戶群體也願意為python的發展做貢獻,這對於一門編程語言來說,最好不過了。

該提案的 基本論點 部分寫得很好,他說他想普及計算機應用,但並非通過介紹新的硬體,或者新軟體這種形式,而是通過賦予每個人編程能力來實現。信息技術的發展給了人們各種強大的計算機,它們以桌面電腦、筆記本電腦或者嵌入式系統的形式存在,如果用戶在軟體設計和實現上有一個通用的認知,那將會極大地促進生產和創造,並且對未來有深遠的影響。試想一下,如果你有一種修改和配置軟體的能力,並且你可以把你的修改通過社區網站分享其他人,其他人碰到同樣的問題的話,就可以參照你的方法。這種能力在緊急的情況下是很重要的,你不必等專家來給你解決問題,你自己就可以嘗試解決這些問題。說到這里,你有沒有想起貼吧,或者論壇,論壇有很多個板塊,不同的領域分不同的板塊,假如你想root手機(手機越獄,指解除手機廠商的限制,獲取手機的用戶最高許可權,以實現對手機的某種控制),你可以到論壇上root板塊找答案,這種形式可謂跟吉多提到的是一樣的。如果你對你的手機或者電腦有更深入的了解,你可以通過編程改善你的輸入法,或者改變你的顯示器冷暖色等等,這些都是對你生活有幫助的。吉多在這里就是想達到這種狀態,簡單點說,人人都對計算機有一定的了解,且都有處理計算機問題的能力。

為了實現這個目標,作者制定了5年計劃,這個5年計劃如下:

5年計劃循序漸進,由淺入深。1999年3月,美國國防部對此進行了回應,同意撥款給他。作者的5年計劃在1999年底開始實施,雖然想推進5年,但是只收到1年的資金支持。不過,作者還是沒有放棄這個項目,一直推進,直到他不再參與python的工作。當時美國國防部對他們提供了多少資金呢,我沒看到官方公開的數據。2013年有報道稱,DARPA向Continuum Analytics提供3百萬美元的支持,讓該公司給python開發數據處理以及數據可視化工具。具體數字是否可靠,這個尚不清楚,但管中窺豹,可見美國國防部對該項目表示認可,並提供了資金支持。Continuum Analytics有一個比較有名的工具,叫Anaconda,Anaconda可以理解為是python + 各種科學計算庫的工具箱,Anaconda官網有這么一句話

翻譯為「Continuum Analytics的Anaconda是使用python的、領先的開源科學計算平台,我們賦予那些正在改變世界的人超能力。」

在查資料的時候,我發現了一個wiki論壇, 該論壇對該項目進行了評價,論壇列出了該項目成功的地方和失敗的地方,以及一些 社會 人士的看法。論壇這樣總結道,這個項目成功的地方在於:

這個項目失敗的地方在於:

回想自己初學python的時候,我覺得這個總結是很公正的。python確實容易入門,有編程基礎的人可能只需要一個星期就能掌握python的一些基本語法。相比C語言,python對於初學者是很友好的,很容易讓人上手。但是,要深入理解python,並沒有這么簡單,需要花很多時間去磨練。接手一個使用python的項目,你需要花一些時間精力去熟悉,去摸透裡面的邏輯,這對於初學者來說,是無法避免的。 對於一個程序員來說,作者能想像到以後計算機的普及應用,以及用戶的認知水平,還有他能夠做什麼,通過什麼來實現,能有這些遠大的抱負,這是非常不容易的。西方世界經常說到「change the world,make the world a better place」,作者也確實做到了,他設計的python在計算機世界裡扮演者一個非常重要的角色。如果通過 科技 能夠改變世界,那麼python就是改變世界的其中一步。1980-2000年,美國對 科技 公司是政策扶持、技術擴散,這期間涌現了如IBM、HP、思科等 科技 公司,大家熟知的微軟和蘋果都是在這期間上市的。python可以說是這個 科技 運動的一個縮影,在 科技 浪潮的推動下,python得到了長足的發展。

很多 科技 或工業相關的網站會根據當年編程語言的流行度做下排名,它們會列出當年在業界最受歡迎的編程語言。其中,IEEE Spectrum 和 TIOBE 的2021年度編程語言是python,如果我還沒記錯的話,TIOBE的2020年度編程語言也是python。可見python是非常受歡迎的,用現在的話講,就是「網紅」編程語言。現在,很多計算設備上都有python的身影,小到智能家居、手機、智能手錶,大到鋰電車、工控車床、甚至太空梭都有python的身影。你可能在瀏覽網頁的時候,右下角彈出一個「7天python入門」的廣告,可見python現在還是有很多需求,因為有需求,所以才有人去投廣告,才會有人去找培訓機構。

作者在給美國國防部的提案中寫到,他想跟高中或大學展開合作,設計一些python的課程,針對不同年級,設計不同水平的課程。現在來看,他確實是做到了,現在哈佛、密歇根大學等排名靠前的大學,都有python課程,python在這些大學的CS(計算機科學)課程中應用非常廣泛,可以說是作為CS導論的一個教學工具。在一些比較高級的課程,比如數據科學、人工智慧等都可以看到python的身影,這是因為學術界以及工業界為python提供了一些處理科學計算和大數據的工具,這也歸功於美國國防部的支持。美國有許多編程夏令營,針對不同年齡段有不同的課程,並且也有許多支持python代碼的編程競賽。Google在coursera上有一個面向初學者的課程,該課程叫 Google IT Automation with Python,完成課程大約需要 8 個月,課程建議每周花5小時學習,課程結束後就可以獲得Google頒發的證書。可見,不管是工業界,還是教育界,都對python有不同程度的支持。這里打個岔,第一版的Google搜索引擎還是用python寫的,作者也在Google工作了一段時間。

現如今,每隔一段時間,就有一個PyCon活動,這個活動匯聚世界各地的開發者,每年都有開發者來展示他們使用python的成功案例,或者表達自己對python的新功能或者缺陷的看法。可見,python用戶社區一直都是很活躍的。這讓我想到了某新能源 汽車 ,該 汽車 用戶有很高的粘性,有一位車主跟我說過,他們有一個微信群,裡面有該新能源 汽車 的高管,很多車主樂意在裡面指出問題,或者提建議,因為這些高管會對問題或者建議做出相應的反饋。用戶願意提意見,產品經理願意廣開言路,採納多方建議,實屬不易。python社區也差不多如此。

幾年前,你是否看過一個新聞,《人工智慧「網紅」編程語言Python進入山東小學課本》,這是2017年澎湃網的一則新聞,裡面講了python進入了山東省小學六年級教材,作為一門「網紅」編程語言,它是否適合低齡學生,這個倒是沒細說,但是可見國內有些地方是把編程作為一種比較基礎的能力來考量。python往低齡階段滲透是否合適呢,我在翻資料的時候瞥到韓國高麗大學的一篇論文,論文講述小學生在學習python的過程中會碰到一些困難,比如經常少打了一些括弧,經常拼錯單詞,經常碰到語法錯誤,以及對這些現象的看法。還有,南京師范大學有一篇報道,講述了中學生學習在學習python時,採用面向問題的學習模式,我理解是case by case的教學模式,這種模式有利於學生培養學生的計算機思維,以及幫助他們理解一些計算機相關的概念,解決計算機相關的問題。

python是否適合低齡學生呢,我覺得這個是值得討論的話題。最後還要問你一句,你會讓你的小孩學習python么,從什麼時候開始學呢?你的娃因為不知道打多少個括弧嚎啕大哭時,你能幫得上忙么?你到時候需要專門請一個程序員來給你的娃做家教么?


https://zh.wikipedia.org/wiki/Python%E8%BB%9F%E9%AB%94%E5%9F%BA%E9%87%91%E6%9C%83

https://www.python.org/psf/

https://www.computerworld.com/article/2711690/python-gets-a-big-data-boost-from-darpa.html

https://legacy.python.org/doc/essays/omg-darpa-mcc-position/

https://legacy.python.org/doc/essays/blurb/

https://www.python.org/doc/essays/cp4e/

http://wiki.c2.com/?

https://koreauniv.pure.elsevier.com/en/publications/an-analysis-of-the-difficulties-of-elementary-school-students-in-

https://www.frontiersin.org/articles/10.3389/fpsyg.2021.771221/full

https://zh.wikipedia.org/wiki/%E7%BB%88%E8%BA%AB%E4%BB%81%E6%85%88%E7%8B%AC%E8%A3%81%E8%80%85

https://gvanrossum.github.io//

http://neopythonic.blogspot.com/2016/04/kings-day-speech.html

https://www.artima.com/intv/guido.html

https://www.htsec.com/jfimg/colimg/upload/20200113/68981578882847978.pdf

閱讀全文

與python新聞簡報相關的資料

熱點內容
mcpe怎麼看伺服器地址 瀏覽:994
螢石雲智能鎖添加密碼 瀏覽:503
股票自動化交易編程 瀏覽:471
android自定義窗口 瀏覽:921
工程動力學pdf 瀏覽:179
騰訊的雲伺服器是bgp嗎 瀏覽:945
excel弘編程 瀏覽:912
什麼人不適合做程序員 瀏覽:675
喜購app怎麼樣 瀏覽:804
交換機查鄰居命令 瀏覽:343
渲染卡在正在編譯場景幾何體 瀏覽:315
app進入頁面為什麼有編譯 瀏覽:563
真我手機照片加密怎麼找回 瀏覽:637
怎麼查自己的app專屬流量 瀏覽:105
安卓車機一般是什麼主機 瀏覽:740
wps電腦版解壓包 瀏覽:79
怎麼在手機設置中解除應用加密 瀏覽:551
安卓手機怎麼讓微信提示音音量大 瀏覽:331
批處理域用戶訪問共享文件夾 瀏覽:132
怎麼做軟綿綿解壓筆 瀏覽:699