從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的環境。

記得關注小編後私信【學習】領取Python學習教程哦。

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環境安裝成功。

從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官網上下載並安裝Python3.5。Mac系統中的安裝比Windows更為簡單,一直單擊“下一步”按鈕即可完成。安裝完後,打開終端並輸入Python3,即可進入Mac的Python3的交互式環境。

1.3 Linux中安裝Python3

大部分Linux系統內置了Python2和Python3,通過在終端輸入python–version,可以查看當前Python3的版本。如果需要安裝某個特定版本的Python,可以在終端中輸入:

sudo apt-get install python3.5

2. 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所示。
從Python安裝到語法基礎,小白都能懂的爬蟲教程!

圖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

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

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

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

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

3. 字符串的切片和索引

字符串的切片和索引就是通過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就能清楚地理解字符串的切片和索引。

從Python安裝到語法基礎,小白都能懂的爬蟲教程!


圖1.3 字符串切片和索引

注意:a[0:5]中的第5個是不會選擇的。

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

4. 字符串方法

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所示。

從Python安裝到語法基礎,小白都能懂的爬蟲教程!


圖1.4 字符串格式化符演示

03 函數與控制語句

本節主要介紹Python()函數的定義與使用方法,介紹Python的判斷和循環兩種爬蟲技術中常用的控制語句。

1. 函數

“髒活累活交給函數來做”,首先,看看Python中定義函數的方法。

def 函數名(參數1,參數2...):
return '結果'

製作一個輸入直角邊就能計算出直角三角形的面積函數:

def function(a,b):
return '1/2*a*b'
#也可以這樣寫
def function(a,b):
print( 1/2*a*b)
注意:讀者不需要太糾結二者的區別,用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]部分替換為‘*’號,並打印出來。
  • 調用函數。

2. 判斷語句

在爬蟲實戰中也會經常使用判斷語句,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學習教程哦。

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

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所示。

從Python安裝到語法基礎,小白都能懂的爬蟲教程!


圖1.5 列表推導式構造URL列表

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

2. 字典

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

user_info = {
'name':'xiaoming',
'age':'23',
'sex':'man'
}
注意:插入MongoDB數據庫需用字典結構。

3. 元組和集合

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

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:\Users\Administrator\Desktop,那麼可以通過下面代碼打開文件:

f = open('C:/Users/Administrator/Desktop/file.txt')
注意:此代碼為Windows系統下的路徑寫法。

如果文件不存在,則會出現如圖1.6所示的錯誤。

從Python安裝到語法基礎,小白都能懂的爬蟲教程!


圖1.6 文件不存在報錯信息

如果open()函數只是加入文件的路徑這一個參數,則只能打開文件並讀取文件的相關內容。如果要向文件中寫入內容,則必須加入模式這個參數了。下面首先來看看open()函數中模式參數的常用值,如表1.1所示。

從Python安裝到語法基礎,小白都能懂的爬蟲教程!


表1.1 open()函數中模式參數的常用值

2. 讀寫文件

上一節中有了名為f的類文件對象,那麼就可以通過f.write()方法和f.read()方法寫入和讀取數據了。

f = open('C:/Users/Administrator/Desktop/file.txt','w+')
f.write('hello world')

這時,在本機上打開file.txt文件,可以看到如圖1.7所示的結果。

從Python安裝到語法基礎,小白都能懂的爬蟲教程!


圖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

3. 關閉文件

當完成讀寫工作後,應該牢記使用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所示。

從Python安裝到語法基礎,小白都能懂的爬蟲教程!


圖1.8 類屬性引用

在左邊寫上變量名,右邊寫上類的名稱,這個過程稱之為類的實例化,而my_bike就是類的實例。通過“.”加上類的屬性,就是類屬性的引用。類的屬性會被類的實例共享,所以結果都是一樣的。

2. 實例屬性

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

class Bike:
compose = ['frame','wheel','pedal']
my_bike = Bike()
my_bike.other = 'basket'
print(my_bike.other) #實例屬性

結果如圖1.9所示。

從Python安裝到語法基礎,小白都能懂的爬蟲教程!


▲圖1.9 實例屬性

說明:通過給類的實例屬性進行賦值,也就是實例屬性。compose屬性屬於所有的該款自行車,而other屬性只屬於my_bike這個類的實例。

3. 實例方法

讀者是否還記得字符串的format()方法。方法就是函數,方法是對實例進行使用的,所以又叫實例方法。對於自行車而言,它的方法就是騎行。

class Bike:
compose = ['frame','wheel','pedal']
def use(self):
print('you are riding')
my_bike = Bike()
my_bike.use()

結果如圖1.10所示。

從Python安裝到語法基礎,小白都能懂的爬蟲教程!


圖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所示。

從Python安裝到語法基礎,小白都能懂的爬蟲教程!


圖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所示。

從Python安裝到語法基礎,小白都能懂的爬蟲教程!


圖1.12 魔術方法

4. 類的繼承

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

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所示。

從Python安裝到語法基礎,小白都能懂的爬蟲教程!


圖1.13 類的繼承

在新的類Share_bike後面的括號中加入Bike,表示Share_bike繼承了Bike父類。父類中的變量和方法可以完全被子類繼承,在特殊情況下,也可以對其覆蓋。

記得關注小編後私信【學習】領取Python學習教程哦。

從Python安裝到語法基礎,小白都能懂的爬蟲教程!


分享到:


相關文章: