從Python安裝到語法基礎,這纔是初學者都能懂的爬蟲教程

Python和PyCharm的安裝:學會Python和PyCharm的安裝方法

變量和字符串:學會使用變量和字符串的基本用法

函數與控制語句:學會Python循環、判斷語句、循環語句和函數的使用

Python數據結構:理解和使用列表、字典、元組和集合

Python文件操作:學習使用Python建立文件並寫入數據

Python面向對象:瞭解Python中類的定義和使用方法

01 Python與PyCharm安裝

“工欲善其事,必先利其器”,本節介紹Python環境的安裝和Python的集成開發環境(IDE)PyCharm的安裝。

  1. 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

  1. 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變量的概念、字符串的基本使用方法、字符串的切片和索引,以及字符串的幾種常用方法。

  1. 變量

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

這種方法類似於將兩個杯子中的飲料對換,只需要多加一個杯子,即可完成飲料的對換工作。

  1. 字符串的“加法”和“乘法”

由於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

字符串乘以一個數字,意思就是將字符串複製這個數字的份數。

  1. 字符串的切片和索引

字符串的切片和索引就是通過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個是不會選擇的。

在爬蟲實戰中,經常會通過字符串的切片和索引,提取需要的部分,剔除一些不需要的部分。

  1. 字符串方法

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的判斷和循環兩種爬蟲技術中常用的控制語句。

  1. 函數

“髒活累活交給函數來做”,首先,看看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]部分替換爲‘*’號,並打印出來。

調用函數。

  1. 判斷語句

在爬蟲實戰中也會經常使用判斷語句,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次輸入失敗後,退出程序”等。

  1. 循環語句

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種基本數據結構,即列表、字典、元組和集合。

  1. 列表

在爬蟲實戰中,使用最多的就是列表數據結構,不論是構造出的多個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頁):

http://bj.xiaozhu.com/search-duanzufang-p1-0/http://bj.xiaozhu.com/search-duanzufang-p2-0/http://bj.xiaozhu.com/search-duanzufang-p3-0/http://bj.xiaozhu.com/search-duanzufang-p4-0/……

通過以下代碼即可構造出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列表

注意:本網站爲小豬短租網。

  1. 字典

Python的字典數據結構與現實中的字典類似,以鍵值對('key'-'value')的形式表現出來。本文中只講解字典的創造,字典的操作在後面會詳細介紹。字典的格式如下:

user_info = {

'name':'xiaoming',

'age':'23',

'sex':'man'

}

注意:插入MongoDB數據庫需用字典結構。

  1. 元組和集合

在爬蟲中,元組和集合很少用到,因此這裏只做簡單介紹。元組類似於列表,但是元組的元素不能修改只能查看,元組的格式如下:

tuple = (1,2,3)

集合的概念類似數學中的集合。每個集合中的元素是無序的,不可以有重複的對象,因此可以通過集合把重複的數據去除。

list = ['xiaoming','zhangyun','xiaoming']

set = set(list)

print(set)

result {'zhangyun', 'xiaoming'}

注意:集合是用大括號構建的。

05 Python文件操作

在爬蟲初期的工作中,常常會把數據存儲到文件中。本節主要講解Python如何打開文件和讀寫數據。

  1. 打開文件

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()函數中模式參數的常用值

  1. 讀寫文件

上一節中有了名爲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

  1. 關閉文件

當完成讀寫工作後,應該牢記使用close()方法關閉文件。這樣可以保證Python進行緩衝的清理(出於效率考慮而把數據臨時存儲在內存中)和文件的安全性。通過下面代碼即可關閉文件。

f = open('C:/Users/Administrator/Desktop/file.txt','r')

content = f.read()

print(content)

f.close()

06 Python面向對象

Python作爲一個面向對象的語言,很容易創建一個類和對象。本節主要講解類的定義及其相關使用方法。

  1. 定義類

類是用來描述具有相同屬性和方法的對象集合。人可以通過不同的膚色劃分爲不同的種族,食物也有不同的種類,商品也是形形色色。但劃分爲同一類的物體,肯定具有相似的特徵和行爲方式。

對於同一款自行車而言,它們的組成結構都是一樣的,如車架、車輪和腳踏板等。通過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就是類的實例。通過“.”加上類的屬性,就是類屬性的引用。類的屬性會被類的實例共享,所以結果都是一樣的。

  1. 實例屬性

對於同一款自行車來說,有些顧客買回去後會改造下,如加一個車筐可以放東西等。

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這個類的實例。

  1. 實例方法

讀者是否還記得字符串的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 魔術方法

  1. 類的繼承

共享單車的出現,方便了人們的出行。共享單車和原來的自行車組成結構類似,但多了付費的功能。

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父類。父類中的變量和方法可以完全被子類繼承,在特殊情況下,也可以對其覆蓋

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章