⑴ 豆瓣為什麼用python
1.不同編程語言的運行效率雖然有不同,但是沒有你想像的那麼大的差異。
2.大型架構要想提高運行效率,關鍵在於提高伸縮性和吞吐量,而不是考慮單一程序的效率。高級的...
3.人家只是在應用層用某種語言,在大型架構中,這只是佔到程序的一部分,特別是瓶頸不在這里。
4.Python也有高性能優化的方案,比如二次編譯,JIT和runtime的優化
⑵ 學python可以做什麼
1WEB開發
在國內,豆瓣一開始就使用Python作為web開發基礎語言,知乎的整個架構也是基於Python語言,這使得web開發這塊在國內發展的很不錯。
盡管目前Python並不是做Web開發的首選,但一直都佔有不可忽視的一席。Python中有各類Web框架,無論是簡單而可以自由搭配的微框架還是全功能的大型MVC框架都一應俱全,這在需要敏捷開發的Web項目中也是十分具有優勢的。廣泛使用(或曾經廣泛使用)Python提供的大型Web服務包括知乎、豆瓣、Dropbox等網站。加之Python本身的「膠水」特性,很容易實現在需要大規模性能級計算時整合其它語言,同時保留Web開發時的輕便快捷。
除此之外,Python中還有大量「開箱即用」的模塊,用於與各種其它網站的對接等相關功能。如果希望開發個微信公眾號相關功能,wechat-sdk/weixin-python等包,能夠使你幾乎完全不用管文檔中提及的各種伺服器交互細節,專注於功能實現即能完成開發。
目前,國內的Python web開發主要有兩個技術棧:
(1)Django
Django是一個高級的敏捷web開發框架,如果學會了,擼一個網站很快。當然如果純粹比擼網站的速度,基於ruby的Ruby on rails顯然更快,但是Django有一個優勢就是性能優秀,更適合國內網站的應用場景。國外的著名圖片社區Pinterest早期也是基於Django開發的,承受了用戶快速增長的沖擊。所以說如果你想快速開發一個網站,還能兼顧APP客戶端的API調用需求,Django是可以信賴的。
(2)Flask
相對於Django,Flask則是一個輕量級的web框架,Flask的最大的優勢是性能優越,適合配合手機客戶端開發後台API服務。國內基於Flask的Restful API服務這快很火,也是需求最大的。知名的比如網路、網易、小米、陌陌等等很多公司都有基於Flask的應用部署。當然,如果你想做一個傳統的web網站,還是建議使用Django,Flask的優勢是後端、API,不適合構建全功能網站。
2網路爬蟲
網路爬蟲是Python比較常用的一個場景,國際上,google在早期大量地使用Python語言作為網路爬蟲的基礎,帶動了整個Python語言的應用發展。以前國內很多人用採集器搜刮網上的內容,現在用Python收集網上的信息比以前容易很多了。
Python在這個方面有許多工具上的積累,無論是用於模擬HTTP請求的Requests、用於HTML DOM解析的PyQuery/BeautifulSoup、用於自動化分布式爬取任務的Scrapy,還是用於最簡化資料庫訪問的各種ORM,都使得Python成為數據爬取的首選語言之一。特別是,爬取後的數據分析與計算是Python最為擅長的領域,非常容易整合。目前Python比較流行的網路爬蟲框架是功能非常強大的scrapy。
3人工智慧與機器學習
人工智慧是現在非常火的一個方向,AI熱潮讓Python語言的未來充滿了無限的潛力。現在釋放出來的幾個非常有影響力的AI框架,大多是Python的實現,為什麼呢?
因為Python足夠動態、具有足夠性能,這是AI技術所需要的技術特點。比如基於Python的深度學習庫、深度學習方向、機器學習方向、自然語言處理方向的一些網站基本都是通過Python來實現的。機器學習,尤其是現在火爆的深度學習,其工具框架大都提供了Python介面。Python在科學計算領域一直有著較好的聲譽,其簡潔清晰的語法以及豐富的計算工具,深受此領域開發者喜愛。
6桌面程序
Python也可以用於桌面軟體開發(如sublime text等),甚至移動端開發(參看kivy)。Python簡潔方便,各種工具包齊全的環境,能大幅度減少開發者的負擔。著名的UI框架QT有Python語言的實現版本PyQT。Python簡單易用的特性加上QT的優雅,可以很輕松的開發界面復雜的桌面程序,並且能輕松實現跨平台特性。
7多媒體應用
可以用Python裡面的PIL、Piddle、ReportLab 等模塊對圖象、聲音、視頻、動畫等進行處理,還可以用Python生成動態圖表和統計分析圖表。另外,還可以利用PyOpenGl模塊非常快速有效的編寫出三維場景。
⑶ Python爬蟲實戰(1)requests爬取豆瓣電影TOP250
爬取時間:2020/11/25
系統環境:Windows 10
所用工具:Jupyter NotebookPython 3.0
涉及的庫:requestslxmlpandasmatplotlib
umpy
蛋肥想法: 先將電影名稱、原名、評分、評價人數、分類信息從網站上爬取下來。
蛋肥想法: print數據列表後發現電影原名、分類信息等存在不需要的字元,需預先處理;同時因為後續想做一個豆瓣電影TOP250的維度分布圖,而同一電影存在多個發行國家、類型(如「法國 美國 / 劇情祥備 動作 犯罪」),為了簡(偷)便(懶),這里均取第一個作為記入的數據;最後將數據保存為xlsx。
蛋肥想法: 蛋肥想知道在豆瓣電影TOP250中年份、國家、類型的維度數據,為了練手,使用剛帶余才保存成xlsx的數據,並分別畫成雷達圖、柱形圖、扇謹行毀形圖。
⑷ python爬蟲怎麼處理豆瓣網頁異常請求
1.URLError
首先解釋下URLError可能產生的原因:
網路無連接,即本機無法上網
連接不到特定的伺服器
伺服器不存在
在代碼中,我們需要用try-except語句來包圍並捕獲相應的異常。下面是一個例子,先感受下它的風騷
Python
1
2
3
4
5
6
7
import urllib2
requset = urllib2.Request('http://www.xxxxx.com')
try:
urllib2.urlopen(requset)
except urllib2.URLError, e:
print e.reason
我們利用了 urlopen方法訪問了一個不存在的網址,運行結果如下:
Python
1
[Errno 11004] getaddrinfo failed
它說明了錯誤代號是11004,錯誤原因是 getaddrinfo failed
2.HTTPError
HTTPError是URLError的子類,在你利用urlopen方法發出一個請求時,伺服器上都會對應一個應答對象response,其中它包含一個數字」狀態碼」。舉個例子,假如response是一個」重定向」,需定位到別的地址獲取文檔,urllib2將對此進行處理。
其他不能處理的,urlopen會產生一個HTTPError,對應相應的狀態嗎,HTTP狀態碼表示HTTP協議所返回的響應的狀態。下面將狀態碼歸結如下:
100:繼續 客戶端應當繼續發送請求。客戶端應當繼續發送請求的剩餘部分,或者如果請求已經完成,忽略這個響應。
101: 轉換協議 在發送完這個響應最後的空行後,伺服器將會切換到在Upgrade 消息頭中定義的那些協議。只有在切換新的協議更有好處的時候才應該採取類似措施。
102:繼續處理 由WebDAV(RFC 2518)擴展的狀態碼,代表處理將被繼續執行。
200:請求成功 處理方式:獲得響應的內容,進行處理
201:請求完成,結果是創建了新資源。新創建資源的URI可在響應的實體中得到 處理方式:爬蟲中不會遇到
202:請求被接受,但處理尚未完成 處理方式:阻塞等待
204:伺服器端已經實現了請求,但是沒有返回新的信 息。如果客戶是用戶代理,則無須為此更新自身的文檔視圖。 處理方式:丟棄
300:該狀態碼不被HTTP/1.0的應用程序直接使用, 只是作為3XX類型回應的默認解釋。存在多個可用的被請求資源。 處理方式:若程序中能夠處理,則進行進一步處理,如果程序中不能處理,則丟棄
301:請求到的資源都會分配一個永久的URL,這樣就可以在將來通過該URL來訪問此資源 處理方式:重定向到分配的URL
302:請求到的資源在一個不同的URL處臨時保存 處理方式:重定向到臨時的URL
304:請求的資源未更新 處理方式:丟棄
400:非法請求 處理方式:丟棄
401:未授權 處理方式:丟棄
403:禁止 處理方式:丟棄
404:沒有找到 處理方式:丟棄
500:伺服器內部錯誤 伺服器遇到了一個未曾預料的狀況,導致了它無法完成對請求的處理。一般來說,這個問題都會在伺服器端的源代碼出現錯誤時出現。
501:伺服器無法識別 伺服器不支持當前請求所需要的某個功能。當伺服器無法識別請求的方法,並且無法支持其對任何資源的請求。
502:錯誤網關 作為網關或者代理工作的伺服器嘗試執行請求時,從上游伺服器接收到無效的響應。
503:服務出錯 由於臨時的伺服器維護或者過載,伺服器當前無法處理請求。這個狀況是臨時的,並且將在一段時間以後恢復。
HTTPError實例產生後會有一個code屬性,這就是是伺服器發送的相關錯誤號。
因為urllib2可以為你處理重定向,也就是3開頭的代號可以被處理,並且100-299范圍的號碼指示成功,所以你只能看到400-599的錯誤號碼。
下面我們寫一個例子來感受一下,捕獲的異常是HTTPError,它會帶有一個code屬性,就是錯誤代號,另外我們又列印了reason屬性,這是它的父類URLError的屬性。
Python
1
2
3
4
5
6
7
8
import urllib2
req = urllib2.Request('httt/cqcre')
try:
urllib2.urlopen(req)
except urllib2.HTTPError, e:
print e.code
print e.reason
運行結果如下
Python
1
2
403
Forbidden
錯誤代號是403,錯誤原因是Forbidden,說明伺服器禁止訪問。
我們知道,HTTPError的父類是URLError,根據編程經驗,父類的異常應當寫到子類異常的後面,如果子類捕獲不到,那麼可以捕獲父類的異常,所以上述的代碼可以這么改寫
Python
1
2
3
4
5
6
7
8
9
10
11
import urllib2
req = urllib2.Request('hcqcre')
try:
urllib2.urlopen(req)
except urllib2.HTTPError, e:
print e.code
except urllib2.URLError, e:
print e.reason
else:
print "OK"
如果捕獲到了HTTPError,則輸出code,不會再處理URLError異常。如果發生的不是HTTPError,則會去捕獲URLError異常,輸出錯誤原因。
另外還可以加入 hasattr屬性提前對屬性進行判斷,代碼改寫如下
Python
1
2
3
4
5
6
7
8
9
10
11
12
import urllib2
req = urllib2.Request('httcqcre')
try:
urllib2.urlopen(req)
except urllib2.URLError, e:
if hasattr(e,"code"):
print e.code
if hasattr(e,"reason"):
print e.reason
else:
print "OK"
首先對異常的屬性進行判斷,以免出現屬性輸出報錯的現象。
以上,就是對URLError和HTTPError的相關介紹,以及相應的錯誤處理辦法,小夥伴們加油!
⑸ 豆瓣讀書數據分析-python
豆瓣讀書數據分析-python
(思路來自課程老師綠樹)剛剛學完python數據分析的課程,決定做一個有關python數據分析的小項目,思來想去,還是決定分析豆瓣的數據,因為豆瓣是python寫成的。用python爬蟲抓取數據較為方便,比一般網站少很多頁面bug問題,而且豆瓣上的數據量大概在million這個量級,算是算太大的,但也不小。正好手裡有一份跑出的大概300多萬的數據,直接開始分析。
首先導入數據,將數據賦給一個dataframe,取名為douban
douban=pd.read_table("douban.dat",sep="::",names=["user","book","rate"])
看一下這個數據的描述
總共3648104行,其他的諸如平均數,中位數的值,是豆瓣書籍的鏈接後綴,並無實際意義。
然後關於豆瓣讀書用戶
user_count=douban.groupby('user').count()
user_count=user_count.sort('book',ascending=False)
、我們發現共有38萬多讀者,計數最多的一位eastwolf東狼,真的很厲害,一共寫了4000多的書評。不過我們不排除這是個機器人或者公眾號,因為4000度書評,就算一天看一本書,也要寫11年,而豆瓣創建才不過11年。有點假,不過這個問題我們暫且不談,僅從數據來看,第一名最愛讀書的書霸,就是eastwolf了,大家鼓掌。
然後我們再來看一下書籍的信息
看一下描述
最受歡迎的書有2071個書評,平均每本書大概有45個書評。
看一下具體情況
我們挑出書評最多的10本,找到圖片,就是以下這10本書
可以發現由於不同出版社不同翻譯的問題,10本書實際是4本,豆瓣果然是文藝青年聚集地,《小王子》《追風箏的人》《活著》幾乎就是文藝青年必備了。
豆瓣做為文藝青年聚集地,本身用戶屬於素質較高的群體。裡面分很多小組,讀書,電影,音樂,算是給大家找志同道合之友的好地方。關於讀書這個方面,在大家都很愛讀書的基礎上,我們可以用戶進行聚類分析。依靠的根據是對書籍的打分,這樣來計算不同用戶之間的距離。因為讀的書目越相似,對同一本書打分結果越接近,說明價值觀越相同,找出這樣的相似者,就能給用戶推薦一下潛在的『同志』,算是給豆瓣增加一個社交功能了。
首先我們把用戶信息和書本信息結合,因為考慮到大部分書籍用戶之間交集為空,而且我的電腦的處理能力有限,所以截取了用戶和書籍的前100進行分析,這樣得到一個新的dataframe
然後我們建立鄰近性矩陣
ubrcore=doubancore.pivot('user','book','rate')
即使在取前100的條件下,依然大部分是空白,為了能夠計算,我們把空白處替換成0.
ubrcore1=ubrcore.fillna(value=0)
然後對要進行距離計算,由於本身對書本的打分在1到5之間,純粹的大小差距並不大,所以我們更多的考慮在方向上的差異,所以用餘弦距離來反應不同用戶之間的差異性。
構建公式,並將計算結果給userdistdf這個dataframe
Userdistdf結果如下
最像用戶的就是他自己,餘弦距離都是1。其他人只能是部分相像,果然人生得一知己難啊。不過知己找不到,我們可以給用戶找10個部分相像的『同志』
構建函數
試一下
Bingo,成功!!!!
這樣,我們可以為用戶qdmimi19810920找到了10個志同道合的『同志』了。
⑹ Python爬蟲期末試題(編程題答案)
from seleniumimport webdriver
import time
from selenium.webdriverimport ActionChains
driver = webdriver.Chrome()
driver.get("https://accounts.douban.com/passport/login")
# 點擊密碼登錄山中銷
driver.find_element_by_class_name('account-tab-account').click()
# 定位賬戶 # 輸入內容
driver.find_element_by_id('username').send_keys('2331566038')
driver.find_element_by_id('password').send_keys('*********')
# 點擊登錄
driver.find_element_by_link_text('登錄豆瓣').click()
# 進入內嵌滑動驗證頁面
iframe = driver.find_element_by_id('tcaptcha_iframe')
driver.switch_to_frame(iframe)
element = driver.find_element_by_xpath('//*[@id="tcaptcha_drag_thumb"]')
ActionChains(driver).click_and_hold(on_element=element).perform()
ActionChains(driver).move_to_element_with_offset(to_element=element,xoffset=180,yoffset=0).perform()
driver.save_screenshot('豆逗游瓣.png')
time.sleep(5)
driver.quit()
import urllib.request
import urllib.parse
url ="http://www..com/s"
word = {"wd":"浙江大學培旅"}
word = urllib.parse.urlencode(word)
new_url = url +"?" + word
header = {
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36"
}
resquest = urllib.request.Request(new_url,headers = header,)
response = urllib.request.urlopen(resquest)
html = response.read().decode('utf-8')
print(html)