Python和PyCharm的安裝:學會Python和PyCharm的安裝方法
變量和字符串:學會使用變量和字符串的基本用法
函數與控制語句:學會Python循環、判斷語句、循環語句和函數的使用
Python數據結構:理解和使用列表、字典、元組和集合
Python文件操作:學習使用Python建立文件並寫入數據
Python面向對象:瞭解Python中類的定義和使用方法
01 Python與PyCharm安裝
“工欲善其事,必先利其器”,本節介紹Python環境的安裝和Python的集成開發環境(IDE)PyCharm的安裝。
- Python安裝(Windows、Mac和Linux)
當前主流的Python版本爲2.x和3.x。由於Python 2第三方庫更多(很多庫沒有向Python 3轉移),企業普遍使用Python 2。如果作爲學習和研究的話,建議使用Python 3,因爲它是未來的發展方向。所以本教程選擇Python 3的環境。
1.1 Windows中安裝Python 3
在Windows系統中安裝Python 3,請參照下面的步驟進行。
打開瀏覽器,訪問Python官網(https://www.python.org/)。
光標移動至Downloads鏈接,單擊Windows鏈接。
根據自己的Windows版本(32位或64位),下載相應的Python 3.5版本,如爲Windows 32位系統,應下載Windows x86 executable installer,如果爲Windows 64位系統,應下載Windows x86-64 executable installer。
單擊運行文件,勾選Add Python 3.5 to PATH,然後單擊Install Now按鈕即可完成安裝。
在計算機中打開命令提示符(cmd)窗口,輸入python,如圖1.1所示,說明Python環境安裝成功。
▲圖1.1 運行Python環境
當界面出現提示符>>>時,就表明進入了Python交互式環境,輸入代碼後按Enter鍵即可運行Python代碼,通過輸入exit()並按Enter鍵,就可以退出Python交互式環境。
注意:如果出現錯誤,可能是因爲安裝時未勾選Add Python3.5 to PATH選項,此時卸載Python後重新安裝時勾選Add Python3.5 to PATH選項即可。
1.2 Mac中安裝Python3
Mac系統中自帶了Python 2.7,需到Python官網上下載並安裝Python 3.5。Mac系統中的安裝比Windows更爲簡單,一直單擊“下一步”按鈕即可完成。安裝完後,打開終端並輸入python3,即可進入Mac的Python 3的交互式環境。
1.3 Linux中安裝Python 3
大部分Linux系統內置了Python 2和Python 3,通過在終端輸入python –version,可以查看當前Python 3的版本。如果需要安裝某個特定版本的Python,可以在終端中輸入:
sudo apt-get install python3.5
- PyCharm安裝
安裝好Python環境後,還需要安裝一個集成開發環境(IDE),IDE集成了代碼編寫功能、分析功能、編譯功能和調試功能。在這裏向讀者推薦一個最智能、好用的Python IDE,叫做PyCharm。進入PyCharm的官網,下載社區版即可:
http://www.jetbrains.com/pycharm/
由於PyCharm上手極爲簡單,因此就不詳細講解PyCharm的使用方法了。以下講解如何使用PyCharm關聯Python解釋器,讓PyCharm可以運行Python代碼。
打開PyCharm,在菜單欄中選擇File ∣ Defalut Settings命令。
在彈出的對話框中選擇Project Interpreter,然後在右邊選擇Python環境,這裏選擇Python 3.5,單擊OK按鈕,即可關聯Python解釋器,如圖1.2所示。
▲圖1.2 關聯Python解釋器
02 變量和字符串
本節主要介紹Python變量的概念、字符串的基本使用方法、字符串的切片和索引,以及字符串的幾種常用方法。
- 變量
Python中的變量很好理解,例如:
a = 1
這種操作稱爲賦值,意思爲將數值1賦給了變量a。
注意:Python中語句結束不需要以分號結束,變量不需要提前定義。
現在有變量a和變量b,可以通過下面代碼進行變量a、b值的對換。
a = 4
b = 5
t = a #把a值賦給t變量
a = b #把b值賦給a變量
b = t #把t值賦給b變量
print(a,b)
result 5 4
這種方法類似於將兩個杯子中的飲料對換,只需要多加一個杯子,即可完成飲料的對換工作。
- 字符串的“加法”和“乘法”
由於Python爬蟲的對象大部分爲文本,所以字符串的用法尤爲重要。在Python中,字符串由雙引號或單引號和引號中的字符組成。首先,通過下面代碼看看字符串的“加法”:
a = 'I'
b = ' love'
c = ' Python'
print(a + b + c) #字符串相加
result I love Python
在爬蟲代碼中,會經常構造URL,例如,在爬取一個網頁鏈接時,只有一部分/u/9104ebf5e177,這部分鏈接是無法訪問的,還需要http://www.jianshu.com,這時可以通過字符串的“加法”進行合併。
注意:此網站爲筆者的簡書首頁。
Python的字符串不僅可以相加,也可以乘以一個數字:
a = 'word'
print(a*3) #字符串乘法
result wordwordword
字符串乘以一個數字,意思就是將字符串複製這個數字的份數。
- 字符串的切片和索引
字符串的切片和索引就是通過string[x],獲取字符串的一部分信息:
a = 'I love python'
print(a[0]) #取字符串第一個元素
result I
print(a[0:5]) #取字符串第一個到第五個元素
result I lov
print(a[-1]) #取字符串最後一個元素
result n
通過圖1.3就能清楚地理解字符串的切片和索引。
▲圖1.3 字符串切片和索引
注意:a[0:5]中的第5個是不會選擇的。
在爬蟲實戰中,經常會通過字符串的切片和索引,提取需要的部分,剔除一些不需要的部分。
- 字符串方法
Python作爲面向對象的語言,每個對象都有相應的方法,字符串也一樣,擁有多種方法,在這裏介紹爬蟲技術中常用的幾種方法。
4.1 split()方法
a = 'www.baidu.com'
print(a.split('.'))
result ['www', 'baidu', 'com']
字符串的split()方法就是通過給定的分隔符(在這裏爲‘.’),將一個字符串分割爲一個列表(後面將詳細講解列表)。
注意:如果沒有提供任何分隔符,程序會把所有的空格作爲分隔符(空格、製表、換行等)。
4.2 repalce()方法
a = 'There is apples'
b = a.replace('is','are')
print(b)
result There are apples
這種方法類似文本中的“查找和替換”功能。
4.3 strip()方法
a = ' python is cool '
print(a.strip())
result python is cool
strip()方法返回去除兩側(不包括內部)空格的字符串,也可以指定需要去除的字符,將它們列爲參數中即可。
a = 'python is good'
print(a.strip('*!'))
result python is good
這個方法只能去除兩側的字符,在爬蟲得到的文本中,文本兩側常會有多餘的空格,只需使用字符串的strip()方法即可去除多餘的空格部分。
4.4 format()方法
最後,再講解下好用的字符串格式化符,首先看以下代碼:
a = '{} is my love'.format('Python')
print(a)
result Python is my love
字符串格式化符就像是做選擇題,留了空給做題者選擇。在爬蟲過程中,有些網頁鏈接的部分參數是可變的,這時使用字符串格式化符可以減少代碼的使用量。
例如,Pexels素材網(https://www.pexels.com/),當搜索圖片時,網頁鏈接也會發生變化,如在搜索欄中輸入book,網頁跳轉爲https://www.pexels.com/search/book/,可以設計如下代碼,筆者只需輸入搜索內容,便可返回網頁鏈接。
content = input('請輸入搜索內容:')
url_path = 'https://www.pexels.com/search/{}/'.format(content)
print(url_path)
運行程序並輸入book,便可返回網頁鏈接,單擊網頁鏈接便可訪問網頁了,如圖1.4所示。
▲圖1.4 字符串格式化符演示
03 函數與控制語句
本節主要介紹Python()函數的定義與使用方法,介紹Python的判斷和循環兩種爬蟲技術中常用的控制語句。
- 函數
“髒活累活交給函數來做”,首先,看看Python中定義函數的方法。
def 函數名(參數1,參數2...):
return '結果'
製作一個輸入直角邊就能計算出直角三角形的面積函數:
def function(a,b):
return '1/2ab'
也可以這樣寫
def function(a,b):
print( 1/2ab)
注意:讀者不需要太糾結二者的區別,用return是返回一個值,而第二個是調用函數執行打印功能。
通過輸入function(2,3),便可以調用函數,計算直角邊爲2和3的直角三角形的面積。現在來做一個綜合練習:讀者都知道網上公佈的電話號碼,如156**9354,中間的數值用其他符號代替了,而用戶輸入手機號時卻是完整地輸入,下面就通過Python()函數來實現這種轉換功能。
def change_number(number):
hiding_number = number.replace(number[3:7],''4)
print(hiding_number)
change_number('15648929354')
result 156**9354
注意:這裏的手機號碼是隨意輸入的,不是真實的號碼。
代碼說明如下:
定義了一個名爲change_number的函數。
對輸入的參數進行切片,把參數的[3:7]部分替換爲‘*’號,並打印出來。
調用函數。
- 判斷語句
在爬蟲實戰中也會經常使用判斷語句,Python的判斷語句格式如下:
if condition:
do
else:
do
注意:冒號和縮進不要忘記了
再看一下多重條件的格式
if condition:
do
elif condition:
do
else:
do
在平時使用密碼時,輸入的密碼正確即可登錄,密碼錯誤時就需要再次輸入密碼。
def count_login():
password = input('password:')
if password == '12345':
print('輸入成功!')
else:
print('錯誤,再輸入')
count_login()
count_login()
程序說明如下:
運行程序,輸入密碼後按Enter鍵。
如果輸入的字符串爲12345,則打印“輸入成功!”,程序結束。
如果輸入的字符串不是12345,則打印“錯誤,再輸入”,繼續運行程序,直到輸入正確爲止。
讀者也可以將程序設計得更爲有趣,例如,“3次輸入失敗後,退出程序”等。
- 循環語句
Python的循環語句包括for循環和while循環,代碼如下:
for循環
for item in iterable:
do
item表示元素,iterable是集合
for i in range(1,11):
print(i)
其結果爲依次輸出1到10,切記11是不輸出的,range爲Python內置函數
while循環
while condition:
do
例如,設計一個小程序,計算1~100的和:
i = 0
sum = 0
while i < 100:
i = i + 1
sum = sum + i
print(sum)
result 5050
04 Python數據結構
數據結構是存放數據的容器,本節主要講解Python的4種基本數據結構,即列表、字典、元組和集合。
- 列表
在爬蟲實戰中,使用最多的就是列表數據結構,不論是構造出的多個URL,還是爬取到的數據,大多數都爲列表數據結構。下面首先介紹列表最顯著的特徵:
列表中的每一個元素都是可變的。
列表的元素都是有序的,也就是說每個元素都有對應的位置(類似字符串的切片和索引)。
列表可以容納所有的對象。
列表中的每個元素都是可變的,這意味着可以對列表進行增、刪、改操作,這些操作在爬蟲中很少使用,因此這裏不再給讀者添加知識負擔。
列表的每個元素都有對應的位置,這種用法與字符串的切片和索引很相似。
list = ['peter', 'lilei', 'wangwu', 'xiaoming']
print(list[0])
print(list[2:])
result
peter
['wangwu', 'xiaoming']
如果爲切片,返回的也是列表的數據結構。
列表可以容納所有的對象:
list = [
1,
1.1,
'string',
print(1),
True,
[1, 2],
(1, 2),
{'key', 'value'}
]
列表中會經常用到多重循環,因此讀者有必要去了解和使用多重循環。現在,擺在讀者面前有兩個列表,分別是姓名和年齡的列表:
names = ['xiaoming','wangwu','peter']
ages = [23,15,58]
這時可以通過多重循環讓name和age同時打印在屏幕上:
names = ['xiaoming','wangwu','peter']
ages = [23,15,58]
for name, age in zip(names, ages):
print(name,age)
result
xiaoming 23
wangwu 15
peter 58
注意:多重循環前後變量要一致。
在爬蟲中,經常請求多個網頁,通常情況下會把網頁存到列表中,然後循環依次取出並訪問爬取數據。這些網頁都有一定的規律,如果是手動將這些網頁URL存入到列表中,不僅花費太多時間,也會造成代碼冗餘。這時可通過列表推導式,構造出這樣的列表,例如某個網站每頁的URL是這樣的(一共13頁):
通過以下代碼即可構造出13頁URL的列表數據:
urls = ['http://bj.xiaozhu.com/search-duanzufang-p{}-0/'.format(number) for number in range(1,14)]
for url in urls:
print(url)
通過一行代碼即可構造出來,通過for循環打印出每個URL,如圖1.5所示。
▲圖1.5 列表推導式構造URL列表
注意:本網站爲小豬短租網。
- 字典
Python的字典數據結構與現實中的字典類似,以鍵值對('key'-'value')的形式表現出來。本文中只講解字典的創造,字典的操作在後面會詳細介紹。字典的格式如下:
user_info = {
'name':'xiaoming',
'age':'23',
'sex':'man'
}
注意:插入MongoDB數據庫需用字典結構。
- 元組和集合
在爬蟲中,元組和集合很少用到,因此這裏只做簡單介紹。元組類似於列表,但是元組的元素不能修改只能查看,元組的格式如下:
tuple = (1,2,3)
集合的概念類似數學中的集合。每個集合中的元素是無序的,不可以有重複的對象,因此可以通過集合把重複的數據去除。
list = ['xiaoming','zhangyun','xiaoming']
set = set(list)
print(set)
result {'zhangyun', 'xiaoming'}
注意:集合是用大括號構建的。
05 Python文件操作
在爬蟲初期的工作中,常常會把數據存儲到文件中。本節主要講解Python如何打開文件和讀寫數據。
- 打開文件
Python中通過open()函數打開文件,語法如下:
open(name[, mode[, buffering]])
open()函數使用文件名作爲唯一的強制參數,然後返回一個文件對象。模式(mode)和緩衝(buffering)是可選參數。在Python的文件操作中,mode參數的輸入是有必要的,而buffering使用較少。
如果在本機上有名爲file.txt的文件(讀者可以在本機中新建一個文本文件),其存儲路徑爲C:UsersAdministratorDesktop,那麼可以通過下面代碼打開文件:
f = open('C:/Users/Administrator/Desktop/file.txt')
注意:此代碼爲Windows系統下的路徑寫法。
如果文件不存在,則會出現如圖1.6所示的錯誤。
▲圖1.6 文件不存在報錯信息
如果open()函數只是加入文件的路徑這一個參數,則只能打開文件並讀取文件的相關內容。如果要向文件中寫入內容,則必須加入模式這個參數了。下面首先來看看open()函數中模式參數的常用值,如表1.1所示。
▲表1.1 open()函數中模式參數的常用值
- 讀寫文件
上一節中有了名爲f的類文件對象,那麼就可以通過f.write()方法和f.read()方法寫入和讀取數據了。
f = open('C:/Users/Administrator/Desktop/file.txt','w+')
f.write('hello world')
這時,在本機上打開file.txt文件,可以看到如圖1.7所示的結果。
▲圖1.7 Python寫文件
注意:如果沒有建立文件,運行上面代碼也可以成功。
如果再次運行程序,txt文件中的內容不會繼續添加,可以修改模式參數爲'r+',便可一直寫入文件。
Python讀取文件通過read()方法,下面嘗試把f的類文件對象寫入的數據讀取出來,使用如下代碼即可完成操作:
f = open('C:/Users/Administrator/Desktop/file.txt','r')
content = f.read()
print(content)
result hello world
- 關閉文件
當完成讀寫工作後,應該牢記使用close()方法關閉文件。這樣可以保證Python進行緩衝的清理(出於效率考慮而把數據臨時存儲在內存中)和文件的安全性。通過下面代碼即可關閉文件。
f = open('C:/Users/Administrator/Desktop/file.txt','r')
content = f.read()
print(content)
f.close()
06 Python面向對象
Python作爲一個面向對象的語言,很容易創建一個類和對象。本節主要講解類的定義及其相關使用方法。
- 定義類
類是用來描述具有相同屬性和方法的對象集合。人可以通過不同的膚色劃分爲不同的種族,食物也有不同的種類,商品也是形形色色。但劃分爲同一類的物體,肯定具有相似的特徵和行爲方式。
對於同一款自行車而言,它們的組成結構都是一樣的,如車架、車輪和腳踏板等。通過Python可以定義這個自行車的類:
class Bike:
compose = ['frame','wheel','pedal']
通過使用class定義一個自行車的類,類中的變量compose稱爲類的變量,專業術語爲類的屬性。這樣,顧客購買的自行車組成結構就是一樣的了。
my_bike = Bike()
you_bike = Bike()
print(my_bike.compose)
print(you_bike.compose) #類的屬性都是一樣的
結果如圖1.8所示。
▲圖1.8 類屬性引用
在左邊寫上變量名,右邊寫上類的名稱,這個過程稱之爲類的實例化,而my_bike就是類的實例。通過“.”加上類的屬性,就是類屬性的引用。類的屬性會被類的實例共享,所以結果都是一樣的。
- 實例屬性
對於同一款自行車來說,有些顧客買回去後會改造下,如加一個車筐可以放東西等。
class Bike:
compose = ['frame','wheel','pedal']
my_bike = Bike()
my_bike.other = 'basket'
print(my_bike.other) #實例屬性
結果如圖1.9所示。
▲圖1.9 實例屬性
說明:通過給類的實例屬性進行賦值,也就是實例屬性。compose屬性屬於所有的該款自行車,而other屬性只屬於my_bike這個類的實例。
- 實例方法
讀者是否還記得字符串的format()方法。方法就是函數,方法是對實例進行使用的,所以又叫實例方法。對於自行車而言,它的方法就是騎行。
class Bike:
compose = ['frame','wheel','pedal']
def use(self):
print('you are riding')
my_bike = Bike()
my_bike.use()
結果如圖1.10所示。
▲圖1.10 實例方法
注意:這裏的self參數就是實例本身。
和函數一樣,實例方法也是可以有參數的。
class Bike:
compose = ['frame','wheel','pedal']
def use(self,time):
print('you ride {}m'.format(time*100))
my_bike = Bike()
my_bike.use(10)
結果如圖1.11所示。
▲圖1.11 實例方法多參數
Python的類中有一些“魔法方法”,_init_()方法就是其中之一。在我們創造實例的時候,不需要引用該方法也會被自動執行。
class Bike:
compose = ['frame','wheel','pedal']
def __init__(self):
self.other = 'basket'
def use(self,time):
print('you ride {}m'.format(time*100))
my_bike = Bike()
print(my_bike.other)
結果如圖1.12所示。
▲圖1.12 魔術方法
- 類的繼承
共享單車的出現,方便了人們的出行。共享單車和原來的自行車組成結構類似,但多了付費的功能。
class Bike:
compose = ['frame','wheel','pedal']
def __init__(self):
self.other = 'basket' #定義實例的屬性
def use(self,time):
print('you ride {}m'.format(time*100))
class Share_bike(Bike):
def cost(self,hour):
print('you spent {}'.format(hour*2))
bike = Share_bike()
print(bike.other)
bike.cost(2)
結果如圖1.13所示。
▲圖1.13 類的繼承
在新的類Share_bike後面的括號中加入Bike,表示Share_bike繼承了Bike父類。父類中的變量和方法可以完全被子類繼承,在特殊情況下,也可以對其覆蓋