Python學習筆記


鏈接B站,嵩天老師零基礎學習視頻:https://www.bilibili.com/video/av19391909?p=2

程序設計語言:編譯型,一次性執行結束(c語言)和解釋型,逐條執行,便於維護(JavaScript,python等腳本語言)

拿到一個問題時:

  • 分析問題的計算部分
  • 確定功能,使用IPO方法進一步分析:輸入;處理;輸出。I(輸入input)P(處理process)O(output輸出)分析"
  • 設計算法:計算公式
  • 編寫程序
  • 運行調試程序

程序設計的步驟:

  • 確定程序的IPO
  • 編寫程序
  • 調試程序

問題小練習:如何利用溫度攝氏度和huashi華氏度進行轉換?

I(輸入input)P(處理process)O(output輸出)分析;

設計算法:

C = (F - 32)/ 1.8

F = C * 1.8 + 32

源碼如下:

 1 while (True):
 2     content = str(input('請輸入當前溫度:'))
 3     if content[-1] in ["c","C"]:
 4         huashi = int(content[:-1]) * 1.8 + 32
 5         print("當前溫度為攝氏度{a},轉化為華氏度{b}".format(a = content,b = str(huashi) + 'F'))
 6     elif content[-1] in ['f','F']:
 7         sheshi = (int(content[:-1])- 32) / 1.8
 8         print('當前溫度為華氏度{0},轉化為攝氏度{1}'.format(content,str(sheshi) + 'C'))
 9     else:
10         print('輸入有誤')

 為了提高學習興趣,跟着嵩天老師學習了一下turtle庫,這個庫可以在圖形化頁面生成圖形。

下面一段是一段生成蟒蛇源碼,大家可以自己敲一下,或者直接點擊源碼頂部按鈕,然后復制即可。

不懂得地方自行百度,搜索能力是必備的。

下面的源碼,利用是函數調用。先調用main(),然后從main()函數里面調用drawSnake()函數,def 是定義函數。里面的參數,嵩天老師都已經講解,我也注釋出來了。至於源碼怎么編寫的,暫時不需要了解,只要先明白大概源碼的作用就OK了。

 1 import turtle
 2 def drawSnake(rad,angle,len,neckrad):
 3     for i in range(len):
 4         turtle.circle(rad,angle)   # rad表示爬行圓形軌跡的半徑位置,正值為左,負值為右,angle表示小烏龜爬行的弧度值
 5         turtle.circle(-rad,angle)
 6     turtle.circle(rad,angle/2)
 7     turtle.fd(rad)                      # forward簡寫,代表爬行的直線距離
 8     turtle.circle(neckrad+1,180)
 9     turtle.fd(rad*2/3)
10 
11 def main():
12     turtle.setup(1300,800,0,0) # 長度,高度,左上角坐標起始點
13     pythonsize = 60            
14     turtle.pensize(pythonsize) # 寬度,小烏龜寬度
15     turtle.pencolor("green")   # 小烏龜走過的軌跡顏色
16     turtle.seth(-40)           # 小烏龜開始爬行的角度方向,參照數學象限
17     drawSnake(40,80,5,pythonsize/2) 
18 main()

生成結果如下:

數據類型

數據類型就不詳細介紹了,整型,浮點型,復數型,字符型,文件型,元組,列表,集合,字典等。

接下來學習數字類型(輸一下下面的例子看看結果就知道區別,同時可以用下面的函數方法對其類型轉換):

  • 整型 int(4) 轉為整數
  • 浮點型 float(4) 轉為浮點數
  • 復數型 complex(4) 轉換成復數

 轉換方法就是:int(),float(),complex()

運算方法:

 

字符串切片索引

下面一個小練習,最好對應嵩天老師的視頻觀看,簡單的內容就不詳述了,看視頻了解。

輸入1到7,然后打印出分別對應的星期一到星期日
下面是本人作出的源碼,稍微多加了一點以后要寫到的內容,其中包括循環,函數,__main__,__name__方法。不必糾結個別不懂得地方,船到橋下自然直,等你學到這,自然就會了,筆者也是這樣過來的。
 1 def cal():
 2     '''
 3     輸入1到7,然后打印出分別對應的星期一到星期日
 4     '''
 5     for i in range(20):
 6         content = "星期一星期二星期三星期四星期五星期六星期日"
 7         a = int(input('請輸入星期幾,輸入用1到7數字代表:'))
 8         if a in list(range(1,8)):
 9             index = a * 3
10             output = content[index-3:index]
11             print(output)
12         else:
13             print("請重新輸入")
14             continue
15 if __name__ == '__main__':
16     cal()

 列表的操作

 

 小游戲,利用turtle庫繪制五角星並填充。可以復制這段代碼運行一下,同樣試着更改一下參數,看看有什么變化。

 1 from turtle import Turtle
 2 p = Turtle()
 3 p.speed(1)
 4 p.pensize(5)
 5 p.color('black','yellow')
 6 p.begin_fill()
 7 for i in range(5):
 8     p.fd(200)
 9     p.right(144)
10 p.end_fill()

輸出結果:

詞雲:如下圖所示

源碼如下,嘗試手動輸出:

輸入前請安裝jieba庫、wordcloud庫、以及scipy庫,安裝方式pip install 庫名

下面划線的部位根據自己文檔和圖片,字體的實際路徑填寫。

源碼:

 1 import jieba
 2 from wordcloud import WordCloud,STOPWORDS
 3 from scipy.misc import imread
 4 import matplotlib.pyplot as plt
 5 # 讀取文件
 6 obj_content = open("C:/Users/Desktop/ciyun.txt",'r')
 7 text= obj_content.read()
 8 # 對文本進行分詞
 9 cut_text = ''.join(jieba.cut(text))
10 # 讀取圖片
11 picture = imread("C:/Users/Desktop/timg.jpg")
12 # 導入字體
13 cloud = WordCloud(font_path = "C:/Users/Desktop/simsun.ttc",
14                   background_color = 'white',
15                   mask = picture,
16                   max_words = 3000,
17                   max_font_size = 40)
18 word_cloud = cloud.generate(cut_text)
19 # 輸出圖片
20 plt.axis('off')
21 plt.imshow(word_cloud) 
22 plt.show()

網絡爬蟲---robots協議

robots協議就是不被允許的爬蟲

例子:看一下百度的robots協議

網址:http://www.baidu.com/robots.txt

User-agent:后面指的被百度禁止的惡意爬蟲,

disallow:后面的是被禁止的通配符類型,最后一個不允許爬蟲訪問的資源目錄

京東的robots協議,被京東禁止的爬蟲。在網址后面加/robots.txt就可以了。https://www.jd.com/robots.txt

QQ的robots協議https://www.qq.com/robots.txt

爬取網頁源碼通用框架:(為防止異常外加try :語句 except:語句)

 1 # 通用爬取網頁的代碼框架
 2 import requests
 3 def getHtmlText(url):
 4     try:
 5         r = requests.get(url,timeout = 5)
 6         r.raise_for_status() # 如果狀態不是200,引發HttpError異常
 7         r.encoding = r.apparent_encoding
 8         return r.text
 9     except :                          # except Exception as e 
10         return "產生異常"
11 if __name__ == '__main__':
12     url = "www.baidu.com"
13     print(getHtmlText(url))

 實例一:

爬取京東商城手機信息:https://item.jd.com/5853575.html

 

 

過程如下:

源碼:

 1 # 通用爬取網頁的代碼框架
 2 import requests
 3 def getHtmlText(url):
 4     try:
 5         r = requests.get(url,timeout = 5)
 6         r.raise_for_status() # 如果狀態不是200,引發HttpError異常
 7         r.encoding = r.apparent_encoding
 8         return r.text[:1000]
 9     except :                          # except Exception as e 
10         return "產生異常"
11 if __name__ == '__main__':
12     url = "https://item.jd.com/5853575.html"
13     print(getHtmlText(url))
14     

運行結果和上面截圖一樣。

  實例二:

 

爬取亞馬遜商城商品信息:

 1 import requests
 2 url = 'https://www.amazon.cn/dp/B07G5Z9H8R/ref=lp_106200071_1_1?s=pc&ie=UTF8&qid=1546562300&sr=1-1'
 3 try:
 4     kv = {"user_agent":"Mozilla/5.0"}
 5     r = requests.get(url,headers = kv)
 6     r.raise_for_status()
 7     r.encoding = r.apparent_encoding
 8     print(r.text[1000:2000])    # 返回字符串一萬多行,截取了一部分字符串
 9 except:
10     print("異常返回")

實例三:

爬取蘇寧易購ipad商品信息

 1 import requests
 2 url = 'https://product.suning.com/0000000000/10400501623.html?safp=d488778a.13701.productWrap.1'
 3 # 請求頭 模擬瀏覽器登陸
 4 kv = {"user-agent":"Mozilla/5.0"}
 5 try:
 6     r = requests.get(url,headers = kv)
 7     r.raise_for_status()
 8     r.encoding = r.apparent_encoding
 9     print(r.text[:1000])
10 except:
11     print("爬取失敗")

 百度搜索關鍵詞借口:https://www.baidu.com/s?wd=keyword

 1 import requests
 2 url = 'http://www.baidu.com/s'
 3 kv = {'wd':"python"}
 4 try:
 5     r = requests.get(url,params = kv)
 6     r.raise_for_status()
 7     r.encoding = r.apparent_encoding
 8     print(r.request.url)
 9     print(len(r.text))
10 except:
11     print("爬取失敗")
12     
13 import requests
14 url = 'http://www.baidu.com/s'
15 kv = {'wd':"趙蘊卓"}
16 try:
17     r = requests.get(url,params = kv)
18     r.raise_for_status()
19     r.encoding = r.apparent_encoding
20     print(r.request.url)
21     print(len(r.text))
22 except:
23     print("爬取失敗")

搜狗搜索關鍵字接口:https://www.sogou.com/web?query=keyword

 1 import requests
 2 url = 'http://www.sougou.com/web'
 3 kv = {'query':"python"}
 4 try:
 5     r = requests.get(url,params = kv)
 6     r.raise_for_status()
 7     print(r.request.url)
 8     print(len(r.text))
 9 except:
10     print('搜索失敗')

360搜索關鍵詞接口:https://www.so.com/s?q=keyword

 1 import requests
 2 url = 'https://www.so.com/s'
 3 kv = {"q":"python"}
 4 try:
 5     r = requests.get(url,params = kv )
 6     r.raise_for_status()
 7     r.encoding = r.apparent_encoding
 8     print(r.request.url)
 9     print(len(r.text))
10 except:
11     print('爬取錯誤')

 爬取網頁圖片並存儲:

 1 import requests
 2 import os
 3 import time
 4 url = 'http://wx1.sinaimg.cn/bmiddle/b4d7da4cly1fdk29b03dwj22c03407wi.jpg'
 5 root = 'D://pics//'
 6 path = root + url.split('/')[-1]
 7 try:
 8     if not os.path.exists(root):
 9         os.mkdir(root)
10     if not os.path.exists(path):
11         r = requests.get(url)
12         with open(path,'wb') as f:
13             f.write(r.content)
14             f.close()
15             time.sleep(3)
16             print('下載完成')
17     else:
18         print("該文件已存在")
19     
20 except:
21     print("爬取失敗")

 利用ip138查詢接口查詢輸入ip地址的歸屬地http://www.ip138.com/

查看網頁的ip地址可以在dos頁面輸入 ping + 網址(不加http協議) ,例如:ping www.baidu.com

ip以我校ip地址為例

 1 # 查詢ip地址
 2 import requests
 3 url = 'http://www.ip138.com/ips138.asp?ip='
 4 
 5 try:
 6     r = requests.get(url + "60.175.65.100")
 7     r.raise_for_status()
 8     r.encoding = r.apparent_encoding
 9     print(r.text[7100:7400])
10 except:
11     print('查詢失敗')

 BeautifulSoup庫---美味湯

語法兩行搞定:

from bs4 import BeautifulSoup

soup = BeautifulSoup('<p>data</p>','html.parser'),第二個參數是解析方法

1 url = 'https://python123.io/ws/demo.html'
2 import requests
3 from bs4 import BeautifulSoup
4 r = requests.get(url)
5 demo = r.text
6 soup = BeautifulSoup(demo,'html.parser')
7 print(soup.prettify())

案例:最好大學排名 http://www.zuihaodaxue.cn/zuihaodaxuepaiming2016.html

爬取大學排名信息:

源碼如下

 1 import requests
 2 from bs4 import BeautifulSoup
 3 import bs4
 4 def getHtmlText(url):
 5     '''提取html'''
 6     try:
 7         r = requests.get(url,timeout = 30)
 8         r.raise_for_status()
 9         r.encoding = r.apparent_encoding
10         return r.text
11     except:
12         return ""
13     
14 def fillUnivList(ulist,html):
15     '''提取關鍵信息,填到列表中,這是一個二維列表
16     列表里面的每一個元素是一個學校信息,每一個元素
17     仍是一個含有三個元素的列表'''
18     soup = BeautifulSoup(html,'html.parser')
19     for tr in soup.find('tbody').children:
20         if isinstance(tr,bs4.element.Tag):
21             tds = tr('td')
22             ulist.append([tds[0].string,tds[1].string,tds[2].string])
23              
24             
25 def printUnivList(ulist,num):
26     ''''輸入表頭,和輸出排名信息'''
27     plt = "{0:{3}<10}\t{1:{3}^10}\t{2:{3}>10}" # ^居中對齊;<左對齊;>右對齊;
28     print(plt.format('排名','學校','總分',chr(12288))) # chr(12288)中文空格填充,放在對齊符號前面記住就行。
29     for i in range(num):
30         u =  ulist[i]
31         print(plt.format(u[0],u[1],u[2],chr(12288)))
32     print('Suc' + str(num))
33 def main():
34     unifo = []
35     url = 'http://www.zuihaodaxue.com/zuihaodaxuepaiming2016.html'
36     html = getHtmlText(url)
37     fillUnivList(unifo,html)
38     printUnivList(unifo,20)
39 main()
40  

輸入結果:

 正則表達式

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM