Python爬蟲(chóng)從入門(mén)到精通系列──第1課 基礎(chǔ)知識(shí)

本教程所有源碼下載鏈接:https://share.weiyun.com/5xmFeUO 密碼:fzwh6g
本教程首發(fā)于GitOPEN's Home瓤狐,轉(zhuǎn)載請(qǐng)征求作者同意

基礎(chǔ)知識(shí)

環(huán)境搭建

Python安裝

平時(shí)能接觸到的操作系統(tǒng)非Windows踊沸、macOS数苫、Linux莫屬。其中Windows是我們?nèi)粘V凶畛S玫腛S,它軟件更多祸憋、辦公和游戲可以兼得;macOS由于搭載其的電腦外表漂亮肖卧、屏幕優(yōu)秀蚯窥、性能均衡,而被很多設(shè)計(jì)者和程序員所喜愛(ài);Linux在服務(wù)器領(lǐng)域是無(wú)可匹敵拦赠,幾乎所有大型應(yīng)用服務(wù)器都部署于Linux系統(tǒng)巍沙,常用的Linux服務(wù)器系統(tǒng)有CentOS、Ubuntu Server等荷鼠,但是Linux桌面版也在程序員中應(yīng)用較廣句携,便捷的終端、穩(wěn)定的性能是編程的首選允乐。

由于macOS和Ubuntu系統(tǒng)都自帶python環(huán)境矮嫉,因此,我們只講解Windows下Python的安裝和配置喳篇。感興趣的同學(xué)敞临,可以自己在虛擬機(jī)中測(cè)試和熟悉Linux系統(tǒng),推薦Ubuntu18.04麸澜。

Windows下安裝Python

熟悉一下Python的主頁(yè)

image

下載挺尿。官方的最新版已經(jīng)更新到了3.7.0,但是我們下載的版本是Python3.6.5炊邦,因此编矾,我們點(diǎn)擊View the full list of downloads

image

只需要記住馁害,不同架構(gòu)的Windows系統(tǒng)窄俏,選擇不同的安裝包下載。

image

安裝碘菜。按圖示操作即可凹蜈。

  • 雙擊安裝包,選擇自定義安裝忍啸,方便以后使用仰坦。

    image
  • 直接下一步。

    image
  • 修改路徑计雌,將路徑改為c:\Python36悄晃。

    image
  • 安裝成功

    image

環(huán)境變量檢測(cè)與設(shè)置。

  • 打開(kāi)cmd命令行凿滤。

    image
  • 輸入python妈橄,提示python版本等信息表示環(huán)境變量設(shè)置成功。

    image
  • 如果輸入python后翁脆,提示不是內(nèi)部命令或外部命令眷蚓,則表示環(huán)境變量沒(méi)有配置好。

    image

設(shè)置環(huán)境變量鹃祖。

  • 桌面右擊計(jì)算機(jī)???溪椎,選擇屬性普舆,然后,再次選擇高級(jí)系統(tǒng)設(shè)置校读。

    image
  • 高級(jí)一欄中點(diǎn)擊環(huán)境變量沼侣,打開(kāi)環(huán)境變量設(shè)置窗口。

    image
  • 點(diǎn)擊新建歉秫,在變量名中輸入PATH(大寫(xiě))蛾洛,在變量值中輸入C:\Python36\Scripts\;C:\Python36\C:\Python36\Scripts\文件夾下有一些常用工具雁芙,例如pip包管理工具轧膘,也加入到環(huán)境變量中,這樣方便以后使用兔甘;C:\Python36\就是python的安裝目錄谎碍。

    image
  • 將cmd命令行都關(guān)閉,重新打開(kāi)cmd洞焙,再次輸入python進(jìn)行驗(yàn)證蟆淀。

Python環(huán)境到這里就安裝完畢了。

包管理工具pip

pip是Python的一款包管理工具澡匪,由于眾所周知的原因熔任,用pip安裝庫(kù)的速度簡(jiǎn)直是“是可忍孰不可忍”。因此唁情,我們有必要加速pip包管理工具的下載速度疑苔。

pip的基本使用

Windows中,打開(kāi)cmd命令行甸鸟,輸入pip后惦费,可以看到使用方法:

image
# 搜索requests包
pip search requests
# 升級(jí)requests包
pip install requests --upgrade
# 卸載requests包
pip uninstall requests
# 查看待更新包
pip list --outdate

升級(jí)pip包管理器

python -m pip install --upgrade pip

加速pip下載速度

在某程序員論壇上,有這樣一個(gè)軟笑話(huà):《安裝scrapy快瘋了抢韭,一個(gè)下午沒(méi)了》???

image

我們使用清華大學(xué)開(kāi)源軟件鏡像站的pypi鏡像進(jìn)行pip下載加速趁餐。

臨時(shí)加速
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple requests

注意,simple不能少篮绰,是https而不是http

永久加速1

修改

~/.config/pip/pip.conf (Linux),

%APPDATA%\pip\pip.ini (Windows 10) ,

C:\Users\Administrator\AppData\Roaming\pip\pip.ini(Windows7),

$HOME/Library/Application Support/pip/pip.conf (macOS) (沒(méi)有就創(chuàng)建一個(gè))季惯,

修改 index-url至tuna吠各,例如

[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple

pip 和 pip3 并存時(shí),只需修改 ~/.pip/pip.conf勉抓。

永久加速2

使用腳本永久加速贾漏,只需用Python執(zhí)行oh-my-tuna.py文件即可設(shè)置好鏡像站加速,

該腳本在我們的源碼中有提供藕筋,位置為CrawlerLessons/codes/lesson01/oh-my-tuna.py纵散,下載后,直接在命令行中運(yùn)行即可:

python on-my-tuna.py

安裝IPython

ipython是一個(gè)python的交互式shell,比默認(rèn)的python shell好用得多伍掀,支持變量自動(dòng)補(bǔ)全掰茶,自動(dòng)縮進(jìn),支持bash shell命令蜜笤,內(nèi)置了許多很有用的功能和函數(shù)濒蒋。學(xué)習(xí)ipython將會(huì)讓我們以一種更高的效率來(lái)使用python。同時(shí)它也是利用Python進(jìn)行科學(xué)計(jì)算和交互可視化的一個(gè)最佳的平臺(tái)把兔。

使用pip安裝IPython

pip install ipython

使用IPython沪伙,再命令行中輸入ipython即可進(jìn)入交互式shell

╭─sunjiajia@Mac /Users/sunjiajia  ?system?
╰─$ ipython
Python 3.6.5 (default, Jul  2 2018, 18:32:34)
Type 'copyright', 'credits' or 'license' for more information
IPython 6.4.0 -- An enhanced Interactive Python. Type '?' for help.

In [1]:

IDE 的選擇

在以后的編程中,我們使用PyCharm這款享譽(yù)全球的IDE县好,開(kāi)發(fā)拄衰、調(diào)試城舞、支持網(wǎng)頁(yè)開(kāi)發(fā)和支持?jǐn)?shù)據(jù)庫(kù),可以滿(mǎn)足我們幾乎所有的開(kāi)發(fā)需求。

PyCharm是收費(fèi)軟件抬旺,但也提供社區(qū)免費(fèi)版本,雖然功能有所減少旗扑,但是也夠我們后續(xù)寫(xiě)爬蟲(chóng)了捎谨。

PyCharm下載地址:官方網(wǎng)址

PyCharm的基本使用

創(chuàng)建項(xiàng)目:

image

選擇項(xiàng)目路徑:

image

創(chuàng)建Python文件禀酱,命名為test01.py

image

test01.py中輸入以下python代碼炬守,右擊空白處,選擇Run test01剂跟,運(yùn)行當(dāng)前python文件:

image

PyCharm常用設(shè)置項(xiàng)如圖所示:

image

HTML和CSS基礎(chǔ)知識(shí)

這一節(jié)我們學(xué)習(xí)網(wǎng)頁(yè)編程的基礎(chǔ)知識(shí)减途。這節(jié)課目標(biāo)是,了解網(wǎng)頁(yè)的基本知識(shí)曹洽,在寫(xiě)爬蟲(chóng)的時(shí)候可以清晰的分析目標(biāo)數(shù)據(jù)所在的結(jié)構(gòu)鳍置,從而更輕松的拿到自己想要的數(shù)據(jù)。

無(wú)論是動(dòng)態(tài)加載送淆,還是延遲加載税产,無(wú)論是文字還是多媒體,最終在瀏覽器中展示給我們偷崩,都是以HTML語(yǔ)法來(lái)展示辟拷;無(wú)論是絢麗的動(dòng)畫(huà)頁(yè)面效果,還是表格的樣式阐斜,都可以用CSS來(lái)進(jìn)行定制衫冻。

下面來(lái)一個(gè)概念簡(jiǎn)介,來(lái)自百度百科的內(nèi)容:

HTML谒出,即超文本標(biāo)記語(yǔ)言(英語(yǔ):HyperText Markup Language)隅俘,是標(biāo)準(zhǔn)通用標(biāo)記語(yǔ)言下的一個(gè)應(yīng)用邻奠,也是一種規(guī)范,一種標(biāo)準(zhǔn)为居,它通過(guò)標(biāo)記符號(hào)來(lái)標(biāo)記要顯示的網(wǎng)頁(yè)中的各個(gè)部分碌宴。網(wǎng)頁(yè)文件本身是一種文本文件,通過(guò)在文本文件中添加標(biāo)記符颜骤,可以告訴瀏覽器如何顯示其中的內(nèi)容(如:文字如何處理唧喉,畫(huà)面如何安排,圖片如何顯示等)忍抽。

CSS八孝,即層疊樣式表(英文全稱(chēng):Cascading Style Sheets),是一種用來(lái)表現(xiàn)HTML或XML等文件樣式的計(jì)算機(jī)語(yǔ)言鸠项。CSS不僅可以靜態(tài)地修飾網(wǎng)頁(yè)干跛,還可以配合各種腳本語(yǔ)言動(dòng)態(tài)地對(duì)網(wǎng)頁(yè)各元素進(jìn)行格式化。

HTML基本標(biāo)簽

標(biāo)簽名 含義
<!--...--> 注釋標(biāo)簽用于在源代碼中插入注釋祟绊。注釋不會(huì)顯示在瀏覽器中楼入。
<!DOCTYPE> <!DOCTYPE> 聲明必須是 HTML 文檔的第一行,位于 <html> 標(biāo)簽之前牧抽。<!DOCTYPE> 聲明不是 HTML 標(biāo)簽嘉熊;它是指示 web 瀏覽器關(guān)于頁(yè)面使用哪個(gè) HTML 版本進(jìn)行編寫(xiě)的指令。在 HTML5 中只有一種寫(xiě)法<!DOCTYPE html>
<html> <html></html> 標(biāo)簽限定了文檔的開(kāi)始點(diǎn)和結(jié)束點(diǎn)扬舒,在它們之間是文檔的頭部和主體阐肤。正如您所了解的那樣,文檔的頭部由 <head>標(biāo)簽定義讲坎,而主體由<body>標(biāo)簽定義孕惜。
<head> 用于定義文檔的頭部,它是所有頭部元素的容器晨炕。<head> 中的元素可以引用腳本衫画、指示瀏覽器在哪里找到樣式表、提供元信息等等瓮栗。
<meta> 提供有關(guān)頁(yè)面的元信息(meta-information)削罩,比如針對(duì)搜索引擎和更新頻度的描述和關(guān)鍵詞。
<title> 定義文檔的標(biāo)題费奸。
<style> 用于為 HTML 文檔定義樣式信息鲸郊。type 屬性是必需的,定義 style 元素的內(nèi)容货邓。唯一可能的值是 "text/css"
<link> 定義文檔與外部資源的關(guān)系四濒,最常見(jiàn)的用途是鏈接樣式表换况。
<body> body 元素定義文檔的主體职辨,包含文檔的所有內(nèi)容(比如文本、超鏈接戈二、圖像舒裤、表格和列表等等。)
? ?

HTML常用標(biāo)簽

標(biāo)簽名 含義
<a target="_blank">新聞</a> 定義超鏈接
<img src="images/logo.png" alt="GitOPEN搜索觉吭,最貼心搜索"> 插入圖片
<table border="1"><tr><th>Month</th><th>Savings</th></tr><tr><td>January</td> <td>$100</td></tr></table> 表格
<div>我是div</div> 可定義文檔中的分區(qū)或節(jié)
<p><span>some text.</span>some other text.</p> 被用來(lái)組合文檔中的行內(nèi)元素腾供。
<ul><li>Coffee</li><li>Milk</li></ul> 無(wú)序列表
<ol><li>Coffee</li><li>Milk</li></ol> 有序列表
<input type="button" value="搜索一下"/> 用于搜集用戶(hù)信息。根據(jù)不同的 type 屬性值鲜滩,輸入字段可以是text伴鳖、復(fù)選框checkbox、單選按鈕radio徙硅、button榜聂、submit等等。

CSS語(yǔ)法

HTML整合CSS的方式一

直接將css寫(xiě)在HTML文件中嗓蘑,代碼CrawlerLessons/codes/lesson01/HTMLDemo/demo01.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>我是GitOPEN</title>
    <style>
        #div01 {
            background-color: #2d78f4;
        }

        .div02 {
            background-color: cadetblue;
            font-style: oblique;
            font-weight: bold;
        }
    </style>
</head>
<body>
<div id="div01">
    我是div01须肆,我的樣式使用了id選擇器(div01)
</div>
<div class="div02">
    我是div02,我的樣式使用了類(lèi)選擇器(div02)
</div>
<div class="div02">
    我是div03桩皿,我的樣式使用了類(lèi)選擇器(div02)
</div>

</body>
</html>

HTML整合CSS的方式二

css寫(xiě)在單獨(dú)的文件中豌汇,代碼CrawlerLessons/codes/lesson01/HTMLDemo/demo02.css

#div01 {
    background-color: #2d78f4;
}

.div02 {
    background-color: cadetblue;
    font-style: oblique;
    font-weight: bold;
}

html也是一個(gè)單獨(dú)的文件,代碼CrawlerLessons/codes/lesson01/HTMLDemo/demo02.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>我是GitOPEN</title>
    <link rel="stylesheet" href="demo02.css">
</head>
<body>
<div id="div01">
    我是div01泄隔,我的樣式使用了id選擇器(div01)
</div>
<div class="div02">
    我是div02拒贱,我的樣式使用了類(lèi)選擇器(div02)
</div>
<div class="div02">
    我是div03,我的樣式使用了類(lèi)選擇器(div02)
</div>

</body>
</html>

CSS常用屬性

屬性名 作用
font-size 字號(hào)大小
font-style 字體格式
font-weight 字體粗細(xì)
color 文本顏色
text-decoration 超鏈接設(shè)置梅尤。line-through添加刪除線柜思;blink文字閃動(dòng);none不顯示上述任何效果
background-color 背景顏色
backgroud-image 背景圖片(地址)
background-repeat 是否重復(fù)巷燥。no-repeat不重復(fù)平鋪赡盘;repeat-x或者y:只在水平或者垂直方向上平鋪
text-align 文本對(duì)齊。left左對(duì)齊缰揪;right右對(duì)齊陨享;center居中對(duì)齊;justify:相對(duì)左右兩端對(duì)齊
display 顯示樣式钝腺。block塊級(jí)元素抛姑,在對(duì)象前后都換行;inline在對(duì)象前后都不換行艳狐;list-item在對(duì)象前后都換行定硝,增加了項(xiàng)目符號(hào)

Python必備知識(shí)點(diǎn)

基礎(chǔ)數(shù)據(jù)類(lèi)型

變量及其類(lèi)型的含義

Python中的變量不需要聲明,變量在使用前都必須賦值毫目,在賦值以后蔬啡,該變量才會(huì)被創(chuàng)建诲侮。

Python中的變量就是變量,它本身沒(méi)有類(lèi)型箱蟆,通常所說(shuō)的“變量類(lèi)型”沟绪,表示的意思是變量所指向的內(nèi)存中對(duì)象的類(lèi)型。

name = 'GitOPEN'
age = 18
salary = 99999.99

等號(hào)(=)叫做運(yùn)算符空猜,用來(lái)給變量name绽慈、agesalary賦值辈毯,左邊是一個(gè)變量名坝疼,右邊是存儲(chǔ)在變量中的值。

在給變量賦值不同類(lèi)型的對(duì)象漓摩,那么裙士,變量就有了類(lèi)型。

name是字符串變量管毙,age是整型變量腿椎,salary是浮點(diǎn)型變量。

多個(gè)變量賦值

Python中夭咬,可以同時(shí)為多個(gè)變量賦值:

aa = bb = cc = 11

這個(gè)例子的含義為啃炸,創(chuàng)建一個(gè)整型對(duì)象,值為11卓舵,從后向前賦值南用,3個(gè)變量都指向同一個(gè)內(nèi)存地址。

再看一個(gè)例子:

dd, ee, ff = 22, 33, "GitOPEN"

這個(gè)例子中掏湾,將整型對(duì)象2233分別分配給變量ddee裹虫,字符串對(duì)象GitOPEN分配給變量ff

標(biāo)準(zhǔn)數(shù)據(jù)類(lèi)型

  • Number(數(shù)字)── 不可變數(shù)據(jù)
  • String(字符串)──不可變數(shù)據(jù)
  • List(列表)──可變數(shù)據(jù)
  • Tuple(元組)──不可變數(shù)據(jù)
  • Set(集合)──可變數(shù)據(jù)
  • Dictionary(字典)──可變數(shù)據(jù)

Number(數(shù)字)

Python3中的支持int融击、float筑公、bool、complex(復(fù)數(shù))尊浪,在Python3中匣屡,只有一種整數(shù)類(lèi)型int,表示為長(zhǎng)整型拇涤,沒(méi)有python2中的Long捣作。

示例:

In [3]: aa = 1111

In [4]: isinstance(aa, int)
Out[4]: True
數(shù)值運(yùn)算
# 加法運(yùn)算
In [5]: 11 + 11
Out[5]: 22

# 減法
In [6]: 5.21 - 5.20
Out[6]: 0.009999999999999787

# 減法
In [10]: 4.3 - 2
Out[10]: 2.3

# 取余
In [11]: 18 % 4
Out[11]: 2

# 乘方
In [12]: 2 ** 5
Out[12]: 32

# 除法,得到一個(gè)浮點(diǎn)數(shù)
In [13]: 2 / 4
Out[13]: 0.5

# 除法鹅士,得到一個(gè)整數(shù)
In [14]: 2 // 4
Out[14]: 0

# 除法券躁,得到一個(gè)整數(shù)
In [15]: 5 // 2
Out[15]: 2
  • 注意:混合計(jì)算時(shí),Python會(huì)把整型轉(zhuǎn)換成為浮點(diǎn)數(shù)。
數(shù)值類(lèi)型實(shí)例
int float complex
10 0.0 3.14j
100 15.20 45.j
-786 -21.9 9.322e-36j
080 32.3e+18 .876j
-0490 -90. -.6545+0J
-0x260 -32.54e100 3e+26J
0x69 70.2E-12 4.53e-7j
浮點(diǎn)數(shù)誤差

先看一個(gè)例子:

In [24]: x = 4.20

In [25]: y = 2.10

In [26]: x + y
Out[26]: 6.300000000000001

In [27]: (x + y) == 6.3
Out[27]: False

In [28]: x = 1.2

In [29]: y = 2.3

In [30]: x + y
Out[30]: 3.5

In [31]: (x + y) == 3.5
Out[31]: True

產(chǎn)生上述問(wèn)題的原因嘱朽,就來(lái)自于浮點(diǎn)數(shù)計(jì)算精度問(wèn)題旭贬。

浮點(diǎn)數(shù)在計(jì)算機(jī)中表達(dá)為二進(jìn)制(binary)小數(shù),

例如搪泳,0.1251/10 + 2/100 + 5/100的值;

又例如0.0010/2 + 0/4 + 1/8的值扼脐。

這兩個(gè)數(shù)值相同岸军。唯一的實(shí)質(zhì)區(qū)別是第一個(gè)寫(xiě)為十進(jìn)制小數(shù)記法,第二個(gè)是二進(jìn)制瓦侮。

問(wèn)題就來(lái)了艰赞,大多數(shù)十進(jìn)制小數(shù)不能完全用二進(jìn)制小數(shù)來(lái)表示,導(dǎo)致的結(jié)果是肚吏,一般情況下方妖,你輸入的十進(jìn)制浮點(diǎn)數(shù),由實(shí)際存儲(chǔ)在計(jì)算機(jī)中的近似的二進(jìn)制浮點(diǎn)數(shù)表示罚攀。

這個(gè)問(wèn)題可以參見(jiàn)文檔《浮點(diǎn)數(shù)算法:爭(zhēng)議和限制》進(jìn)行詳細(xì)了解党觅。

浮點(diǎn)數(shù)誤差的解決方法

Python中的decimal模塊可以解決浮點(diǎn)數(shù)誤差的煩惱。這個(gè)模塊可以通過(guò)整數(shù)斋泄、字符串杯瞻、或者構(gòu)建decimal.Decimal對(duì)象,來(lái)解決這個(gè)問(wèn)題炫掐。如果是浮點(diǎn)數(shù)魁莉,因?yàn)楦↑c(diǎn)數(shù)本身存在誤差,在計(jì)算前需要先將浮點(diǎn)數(shù)轉(zhuǎn)化為字符串募胃。

示例:

In [32]: from decimal import Decimal

In [33]: from decimal import getcontext

In [34]: Decimal('4.20') + Decimal('2.10')
Out[34]: Decimal('6.30')

In [35]: x = 4.20

In [36]: y = 2.10

In [37]: z = Decimal(str(x)) + Decimal(str(y))

In [38]: z
Out[38]: Decimal('6.3')

# 設(shè)置精度
In [39]: getcontext().prec = 4

In [40]: Decimal('1.00') / Decimal('3.0')
Out[40]: Decimal('0.3333')
  • 注意旗唁,精度提升的同時(shí),會(huì)伴隨性能的損失痹束。在對(duì)數(shù)據(jù)要求特別高的場(chǎng)景下检疫,例如財(cái)務(wù)計(jì)算等,性能的損失是值得的参袱。

String(字符串)

在Python中电谣,字符串用單引號(hào)'或者雙引號(hào)"括起來(lái),如果遇到特殊字符抹蚀,可以用反斜杠\進(jìn)行轉(zhuǎn)義剿牺。

字符串截取的用法示例:

In [41]: aa = '我愛(ài)學(xué)習(xí)'

In [42]: bb = '我是張學(xué)友的粉絲'

In [44]: aa[1:3]
Out[44]: '愛(ài)學(xué)'

In [45]: aa[1:4]
Out[45]: '愛(ài)學(xué)習(xí)'

In [47]: bb[-6:-1]
Out[47]: '張學(xué)友的粉'

In [48]: bb[-7:-1]
Out[48]: '是張學(xué)友的粉'

加號(hào)+是字符串的連接符,星號(hào)*表示復(fù)制當(dāng)前字符串多少次:

In [50]: aa + "," + bb
Out[50]: '我愛(ài)學(xué)習(xí),我是張學(xué)友的粉絲'

In [51]: (aa + "," + bb + "环壤。") * 10
Out[51]: '我愛(ài)學(xué)習(xí),我是張學(xué)友的粉絲晒来。我愛(ài)學(xué)習(xí),我是張學(xué)友的粉絲。我愛(ài)學(xué)習(xí),我是張學(xué)友的粉絲郑现。我愛(ài)學(xué)習(xí),我是張學(xué)友的粉絲湃崩。我愛(ài)學(xué)習(xí),我是張學(xué)友的粉絲荧降。我愛(ài)學(xué)習(xí),我是張學(xué)友的粉絲。我愛(ài)學(xué)習(xí),我是張學(xué)友的粉絲攒读。我愛(ài)學(xué)習(xí),我是張學(xué)友的粉絲朵诫。我愛(ài)學(xué)習(xí),我是張學(xué)友的粉絲。我愛(ài)學(xué)習(xí),我是張學(xué)友的粉絲薄扁。'

我們有這樣一個(gè)字符串GitOPEN\niubi剪返,看一下下面的操作:

In [53]: cc = "GitOPEN\niubi"

In [54]: print(cc)
GitOPEN
iubi

In [55]: dd = r"GitOPEN\niubi"

In [56]: print(dd)
GitOPEN\niubi

如果字符串本身有特殊字符,但是想讓字符串中的特殊字符不轉(zhuǎn)義邓梅,那么在字符串前面加上r脱盲,表示按照原始字符串進(jìn)行輸出。

List(列表)

List可以說(shuō)是Python中使用最頻繁的數(shù)據(jù)類(lèi)型日缨。列表中的元素類(lèi)型可以不相同钱反,它支持?jǐn)?shù)字,字符串甚至可以列表嵌套匣距。

下面是列表面哥,列表截取操作,列表排序操作:

In [57]: a_list = ['aa', 'bb', 'cc', 'dd', 'ee']

In [58]: b_list = [11, 22, 33.22, 44.05]

In [59]: print(a_list[1])
bb

In [60]: print(a_list[1:3])
['bb', 'cc']

In [61]: print(a_list[2:])
['cc', 'dd', 'ee']

In [62]: print(b_list)
[11, 22, 33.22, 44.05]

# reverse = False表示升序墨礁,這是默認(rèn)值
In [64]: b_list.sort(reverse=False)

In [65]: print(b_list)
[11, 22, 33.22, 44.05]

# reverse = True表示降序
In [66]: b_list.sort(reverse=True)

In [67]: print(b_list)
[44.05, 33.22, 22, 11]

Tuple(元組)

Python中幢竹,元組是用()括起來(lái)的,元素不能修改恩静。

a_tup = ('鋤禾','日','當(dāng)午')
b_tup = (1, 2, 3, 4, 5)
c_tup = "a", "b", "c", "d"

# 創(chuàng)建空元組
d_tup = ()

# 元組中只有一個(gè)元素時(shí)焕毫,需要在元素后面添加逗號(hào)
e_tup = (50,)

f_tup = a_tup + b_tup

print(f_tup)

# 刪除元組
del f_tup
print(f_tup)
元組內(nèi)置函數(shù)

Python元組包含了以下內(nèi)置函數(shù):

序號(hào) 方法及描述
1 cmp(tuple1, tuple2)比較兩個(gè)元組元素。
2 len(tuple) 計(jì)算元組元素個(gè)數(shù)驶乾。
3 max(tuple) 返回元組中元素最大值邑飒。
4 min(tuple)返回元組中元素最小值。
5 tuple(seq) 將列表轉(zhuǎn)換為元組级乐。

Dictionary(字典)

Python中的字典另一種可變?nèi)萜髂P透硐蹋梢源鎯?chǔ)任意類(lèi)型對(duì)象。

鍵值對(duì)的鍵和值用:冒號(hào)分割风科,每個(gè)鍵值對(duì)用,逗號(hào)分割撒轮;鍵是唯一的,值不需要唯一贼穆,如果鍵重復(fù)题山,那么最后一個(gè)鍵值對(duì)會(huì)覆蓋前面的。

In [69]: a_dict = {'a':'1', 'b':'2', 'c':'3', 'b':'4'}

# 取值
In [70]: a_dict['b']
Out[70]: '4'

In [71]: a_dict
Out[71]: {'a': '1', 'b': '4', 'c': '3'}

# 更新值
In [72]: a_dict['a'] = 11

In [73]: a_dict
Out[73]: {'a': 11, 'b': '4', 'c': '3'}

# 刪除某個(gè)鍵對(duì)應(yīng)的值
In [74]: del a_dict['c']

In [75]: a_dict
Out[75]: {'a': 11, 'b': '4'}

# 清空字典中所有的值
In [76]: a_dict.clear()

In [77]: a_dict
Out[77]: {}

# 刪除字典
In [78]: del a_dict

In [79]: a_dict
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-79-374973eefd04> in <module>()
----> 1 a_dict

NameError: name 'a_dict' is not defined
字典中鍵的特性
  • 同一個(gè)鍵不允許出現(xiàn)兩次故痊。創(chuàng)建時(shí)如果同一個(gè)鍵被賦值兩次顶瞳,后一個(gè)值會(huì)被記住。
  • 鍵必須是不可變數(shù)據(jù)類(lèi)型,可以用數(shù)字慨菱、字符串焰络、元組,但是列表就不行符喝。
字典的內(nèi)置函數(shù)
序號(hào) 函數(shù)及描述
1 cmp(dict1, dict2)比較兩個(gè)字典元素闪彼。
2 len(dict)計(jì)算字典元素個(gè)數(shù),即鍵的總數(shù)协饲。
3 str(dict)輸出字典可打印的字符串表示备蚓。
4 type(variable)返回輸入的變量類(lèi)型,如果變量是字典就返回字典類(lèi)型囱稽。
字典的內(nèi)置方法
序號(hào) 函數(shù)及描述
1 dict.clear()刪除字典內(nèi)所有元素
2 dict.copy()返回一個(gè)字典的淺復(fù)制
3 dict.fromkeys(seq[, val])創(chuàng)建一個(gè)新字典,以序列 seq 中元素做字典的鍵二跋,val 為字典所有鍵對(duì)應(yīng)的初始值
4 dict.get(key, default=None)返回指定鍵的值战惊,如果值不在字典中返回default值
5 dict.has_key(key) 如果鍵在字典dict里返回true,否則返回false
6 dict.items()以列表返回可遍歷的(鍵, 值) 元組數(shù)組
7 dict.keys()以列表返回一個(gè)字典所有的鍵
8 dict.setdefault(key, default=None)get()類(lèi)似, 但如果鍵不存在于字典中扎即,將會(huì)添加鍵并將值設(shè)為default
9 dict.update(dict2)把字典dict2的鍵/值對(duì)更新到dict里
10 dict.values()以列表返回字典中的所有值
11 pop(key[,default])刪除字典給定鍵 key 所對(duì)應(yīng)的值吞获,返回值為被刪除的值。key值必須給出谚鄙。 否則各拷,返回default值。
12 popitem()隨機(jī)返回并刪除字典中的一對(duì)鍵和值闷营。

函數(shù)

函數(shù)是組織好的烤黍,可重復(fù)使用的,用來(lái)實(shí)現(xiàn)單一或者相關(guān)功能的代碼段傻盟。它能夠提高應(yīng)用的模塊性速蕊,以及代碼的重復(fù)利用率。我們已經(jīng)使用過(guò)很多內(nèi)建函數(shù)娘赴,比如print()规哲,但是,也可以創(chuàng)建用戶(hù)自定義函數(shù)诽表。

定義一個(gè)函數(shù)

定義一個(gè)函數(shù)非常簡(jiǎn)單唉锌,它有幾個(gè)規(guī)則:

  • 函數(shù)以def關(guān)鍵字開(kāi)頭,后接函數(shù)名稱(chēng)和():
  • 傳入?yún)?shù)和自變量必須放在()內(nèi)
  • 函數(shù)代碼塊的內(nèi)部第一行可以使用文檔字符串進(jìn)行函數(shù)說(shuō)明
  • return [表達(dá)式]用來(lái)結(jié)束函數(shù)竿奏,選擇是否返回值給調(diào)用者袄简,不帶表達(dá)式的return相當(dāng)于返回None

示例:

def sayhello(text):
    """
    這是一個(gè)說(shuō)你好的函數(shù)
    :param text: 打招呼內(nèi)容
    :return: 返回打招呼內(nèi)容
    """
    result = "你好," + text
    return result

sayhelllo('世界')

參數(shù)

參數(shù)類(lèi)型:

  • 必備參數(shù)
  • 關(guān)鍵字參數(shù)
  • 默認(rèn)參數(shù)
  • 不定長(zhǎng)參數(shù)

必備參數(shù)

必備參數(shù)必須以正確的順序傳入函數(shù)议双,調(diào)用的時(shí)候痘番,數(shù)量必須和聲明的一樣。

def printtext(text):
    print(text)
    return;

printtext('你好,世界')
# 報(bào)錯(cuò) TypeError: printtext() missing 1 required positional argument: 'text'
printtext()

關(guān)鍵字參數(shù)

使用關(guān)鍵字參數(shù)允許函數(shù)在調(diào)用時(shí)參數(shù)的順序與聲明時(shí)不一致汞舱。

def printmsg(text1, text2):
    print('text1是:', text1)
    print('text2是:', text2)
    return


printmsg(text2='世界', text1='你好')

缺省參數(shù)

調(diào)用函數(shù)時(shí)伍纫,如果缺省參數(shù)的值沒(méi)有傳入,那么會(huì)使用默認(rèn)值昂芜。

def printemployee(uid, name, salary=1000.00):
    print('Uid:', uid)
    print('Name:', name)
    print('Salary:', salary)
    return


printemployee('001', '張1', 2000.00)
printemployee('002', '張2')

不定長(zhǎng)參數(shù)

有的時(shí)候莹规,我們需要一個(gè)函數(shù),它能夠處理比當(dāng)初聲明時(shí)更多的參數(shù)泌神,這些參數(shù)叫做不定長(zhǎng)參數(shù)良漱。加了星號(hào)(*)的變量名會(huì)存放所有未命名的變量參數(shù)。

def printinfo(arg1, *args):
    print('輸出參數(shù):')
    print('arg1:', arg1)
    for arg in args:
        print('arg', arg)
    return


printinfo(1, 2)
printinfo(3, 4, 5, 6)

匿名函數(shù)

創(chuàng)建匿名函數(shù)的方法是使用lambda欢际。

示例:

sum = lambda x, y: x + y
print(sum(1, 2))

全局變量和局部變量

定義在函數(shù)內(nèi)部的是局部變量母市,擁有局部作用域;定義在函數(shù)外的變量是全局變量损趋,擁有全局作用域患久。調(diào)用函數(shù)時(shí),所有在函數(shù)內(nèi)聲明的變量名稱(chēng)都將被加入到作用域中浑槽。

示例:

# 全局變量
total = 0

def sum(x, y):
    total = x + y
    print('函數(shù)內(nèi)是局部變量:', total)
    return total

sum(11, 22)
print('函數(shù)外是全局變量:', total)

命名空間和作用域

變量就是一個(gè)名字(標(biāo)識(shí)符)蒋失,它指向了對(duì)象。命名空間是一個(gè)字典桐玻,它的鍵是變量名稱(chēng)篙挽,對(duì)應(yīng)的值是對(duì)象。

Python表達(dá)式可以訪問(wèn)局部命名空間和全局命名空間里面的變量镊靴。如果一個(gè)局部變量和一個(gè)全局變量重名铣卡,則局部變量會(huì)覆蓋全局變量。

每一個(gè)函數(shù)都有自己的命名空間邑闲,類(lèi)的方法的作用域的規(guī)則和一般的函數(shù)一樣算行。Python會(huì)智能地猜測(cè)變量是局部還是全局的,并且假設(shè)在函數(shù)內(nèi)賦值的變量都是局部的苫耸。

面向?qū)ο缶幊?/h2>

Python是一門(mén)面向?qū)ο笳Z(yǔ)言州邢,因此在Python中創(chuàng)建類(lèi)和對(duì)象是輕而易舉的事情。

面向?qū)ο蠛?jiǎn)介

概念 含義
類(lèi)褪子,Class 類(lèi)是一個(gè)集合量淌,描述了具有相同的屬性和方法的對(duì)象
實(shí)例化 就是創(chuàng)建類(lèi)的實(shí)例,類(lèi)的具體對(duì)象
類(lèi)變量 在實(shí)例化對(duì)象中嫌褪,類(lèi)變量是公用的呀枢;類(lèi)變量定義在類(lèi)內(nèi)部并且在函數(shù)體之外
數(shù)據(jù)成員 類(lèi)變量或者實(shí)例變量,用于處理類(lèi)及其實(shí)例對(duì)象的相關(guān)的數(shù)據(jù)
繼承 派生類(lèi)繼承基類(lèi)(父類(lèi))的字段和方法笼痛。允許把一個(gè)派生類(lèi)對(duì)象作為父類(lèi)對(duì)象對(duì)待裙秋。
方法重寫(xiě) 子類(lèi)從父類(lèi)繼承過(guò)來(lái)的方法琅拌,不能滿(mǎn)足子類(lèi)的需求,可以對(duì)其進(jìn)行重寫(xiě)(override)
方法 類(lèi)中的函數(shù)
對(duì)象 類(lèi)的實(shí)例摘刑,包括兩個(gè)數(shù)據(jù)成員(類(lèi)變量进宝、實(shí)例變量)和方法
實(shí)例變量 定義在方法中的變量

創(chuàng)建類(lèi)

示例:

class Employee:
    count = 0

    def __init__(self, name, age):
        self.name = name
        self.age = age
        Employee.count += 1

    def print_count(self):
        print("員工總數(shù)為:{}".format(Employee.count))

    def show_info(self):
        print("Name:{},Age:{}".format(self.name, self.age))

    def prt(self):
        print(self)
        print(self.__class__)
  • count是一個(gè)類(lèi)變量,它的值在這個(gè)類(lèi)的實(shí)例對(duì)象之間共享枷恕。
  • __init__()方法是一個(gè)特殊的方法党晋,叫做類(lèi)的構(gòu)造函數(shù)或者初始化方法,當(dāng)實(shí)例化該類(lèi)的對(duì)象時(shí)就會(huì)調(diào)用這個(gè)方法
  • self代表類(lèi)的實(shí)例徐块,在定義類(lèi)的方法時(shí)是必須的未玻,但在調(diào)用時(shí)不必傳入相應(yīng)的參數(shù)
  • 類(lèi)的方法與普通的函數(shù)只有一個(gè)區(qū)別,它必須有一個(gè)額外的第一個(gè)參數(shù)名稱(chēng)胡控,按照習(xí)慣昼激,它的名稱(chēng)是self
# 實(shí)例化對(duì)象
emp1 = Employee('張三', 18)
# 對(duì)象調(diào)用方法
emp1.print_count()
emp1.show_info()

emp2 = Employee('張四', 17)
emp2.print_count()
emp2.show_info()

# self是類(lèi)的實(shí)例,代表當(dāng)前對(duì)象的地址癣猾;self.__class__指向類(lèi)纷宇。
emp1.prt()

打印的結(jié)果為:

員工總數(shù)為:1
Name:張三,Age:18
員工總數(shù)為:2
Name:張四,Age:17
<__main__.Employee object at 0x1120564a8>
<class '__main__.Employee'>

一些訪問(wèn)屬性的函數(shù):

函數(shù) 含義
getattr(obj, name[,default]) 訪問(wèn)對(duì)象的屬性
hasattr(obj,name) 檢查是否存在一個(gè)屬性
setattr(obj,name,value) 設(shè)置一個(gè)屬性,如果屬性不存在蛾方,則創(chuàng)建一個(gè)新屬性
delattr(obj,name) 刪除屬性

內(nèi)置類(lèi)屬性

名稱(chēng) 含義
__dict__ 類(lèi)的屬性拓春,包含一個(gè)字典硼莽,由類(lèi)的數(shù)據(jù)屬性組成
__doc__ 類(lèi)的文檔字符串
__name__ 類(lèi)名
__module__ 類(lèi)所在的模塊懂鸵,全名為__main__className
__bases__ 類(lèi)的所有父類(lèi)構(gòu)成元素,包含一個(gè)由所有父類(lèi)組成的元組

示例:

print("Employee.__doc__:", Employee.__doc__)
print("Employee.__name__:", Employee.__name__)
print("Employee.__module__:", Employee.__module__)
print("Employee.__bases__:", Employee.__bases__)
print("Employee.__dict__:", Employee.__dict__)

輸出:

Employee.__doc__: 
    員工基類(lèi)
    
Employee.__name__: Employee
Employee.__module__: __main__
Employee.__bases__: (<class 'object'>,)
Employee.__dict__: {'__module__': '__main__', '__doc__': '\n    員工基類(lèi)\n    ', 'count': 2, '__init__': <function Employee.__init__ at 0x105180268>, 'print_count': <function Employee.print_count at 0x1051802f0>, 'show_info': <function Employee.show_info at 0x105180378>, 'prt': <function Employee.prt at 0x105180400>, '__dict__': <attribute '__dict__' of 'Employee' objects>, '__weakref__': <attribute '__weakref__' of 'Employee' objects>}

類(lèi)的繼承

代碼重用是面向?qū)ο缶幊處?lái)的主要好處之一终息,實(shí)現(xiàn)重用的方法之一就是繼承機(jī)制柳譬。

示例:

class Parent:
    parent_attr = 123

    def __init__(self):
        print("Parent構(gòu)造函數(shù)")

    def parentMethod(self):
        print("Parent方法")

    def setAttr(self, attr):
        Parent.parent_attr = attr

    def getAttr(self):
        print("父類(lèi)屬性:", Parent.parent_attr)


class Child(Parent):
    def __init__(self):
        print("子類(lèi)構(gòu)造函數(shù)")

    def childMethod(self):
        print("Child方法")


child1 = Child()
child1.childMethod()
child1.parentMethod()
child1.setAttr(456)
child1.getAttr()

輸出:

子類(lèi)構(gòu)造函數(shù)
Child方法
Parent方法
父類(lèi)屬性: 456

方法重載

如果父類(lèi)的方法的功能不能滿(mǎn)足你的需求征绎,在子類(lèi)中可以重寫(xiě)父類(lèi)的方法人柿。

示例:

class A:
    def myMethod(self):
        print("父類(lèi)方法")


class B(A):
    def myMethod(self):
        print("子類(lèi)方法")


b = B()
b.myMethod()

time模塊、datetime模塊哥放、json模塊甥雕、csv模塊使用方法

time 模塊

在編寫(xiě)Python程序時(shí),轉(zhuǎn)換日期時(shí)間是一個(gè)常見(jiàn)的功能峭弟。時(shí)間間隔是以秒為單位的浮點(diǎn)小數(shù)瞒瘸。每個(gè)時(shí)間戳都以自從1970年1月1日午夜(歷元)經(jīng)過(guò)了多長(zhǎng)時(shí)間來(lái)表示。

獲取當(dāng)前時(shí)間戳:

import time

ticks = time.time()
print("當(dāng)前的時(shí)間戳為:{}".format(ticks))

時(shí)間元組

struct_time元組谎柄,具有如下屬性:

序號(hào) 字段 屬性
0 4位年 tm_year 2018
1 tm_mon 1到12
2 tm_mday 1到31
3 小時(shí) tm_hour 0到23
4 分鐘 tm_min 0到59
5 tm_sec 0到61(60或61是潤(rùn)秒)
6 一周的第幾日 tm_wday 0到6(0是周一)
7 一年的第幾日 tm_yday 1到366
8 夏令時(shí) tm_isdst -1, 0, 1, -1是決定是否為夏令時(shí)的旗幟

獲取當(dāng)前時(shí)間

import time

localtime = time.localtime(time.time())
print("當(dāng)前本地時(shí)間為:{}".format(localtime))

輸出為:

當(dāng)前本地時(shí)間為:time.struct_time(tm_year=2018, tm_mon=8, tm_mday=13, tm_hour=21, tm_min=49, tm_sec=53, tm_wday=0, tm_yday=225, tm_isdst=0)

格式化時(shí)間

import time

localtime = time.asctime(time.localtime(time.time()))
print("格式化后的時(shí)間為:{}".format(localtime))

輸出:

格式化后的時(shí)間為:Mon Aug 13 21:52:20 2018

格式化日期

import time

# 格式化成2018-08-13 21:55:46形式
print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))

# 格式化成Mon Aug 13 21:52:20 2018形式
print(time.strftime("%a %b %d %H:%M:%S %Y", time.localtime()))

# 將格式字符串轉(zhuǎn)換為時(shí)間戳
a = "Mon Aug 13 21:52:20 2018"
print(time.mktime(time.strptime(a, "%a %b %d %H:%M:%S %Y")))

輸出:

2018-08-13 21:56:49
Mon Aug 13 21:56:49 2018
1534168340.0

datetime模塊

import datetime

i = datetime.datetime.now()
print("當(dāng)前的日期和時(shí)間是 %s" % i)
print("ISO格式的日期和時(shí)間是 %s" % i.isoformat())
print("當(dāng)前的年份是 %s" % i.year)
print("當(dāng)前的月份是 %s" % i.month)
print("當(dāng)前的日期是  %s" % i.day)
print("dd/mm/yyyy 格式是  %s/%s/%s" % (i.day, i.month, i.year))
print("當(dāng)前小時(shí)是 %s" % i.hour)
print("當(dāng)前分鐘是 %s" % i.minute)
print("當(dāng)前秒是  %s" % i.second)

json模塊

在使用Python進(jìn)行數(shù)據(jù)處理的過(guò)程中劈猿,我們經(jīng)常和json數(shù)據(jù)打交道揪荣。

JSON(JavaScript Object Notation)是一種輕量級(jí)的數(shù)據(jù)交換格式仗颈。

json模塊的兩個(gè)常用函數(shù)為:

函數(shù)名 含義
json.dumps 將Python對(duì)象編碼成JSON字符串
json.loads 將已編碼的JSON字符串解碼為Python對(duì)象

json.dumps

示例:

將Python對(duì)象(數(shù)組)編碼為JSON格式數(shù)據(jù):

import json

data = [{'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}]

json_str = json.dumps(data)
print(json_str)
print(type(json_str))

格式化輸出JSON數(shù)據(jù):

data = {'name': 'GitOPEN', 'salary': 70000.01}
json_str = json.dumps(data, sort_keys=True, indent=4, separators=(', ', ': '))
print(json_str)

python 原始類(lèi)型向 json 類(lèi)型的轉(zhuǎn)化對(duì)照表:

Python JSON
dict object
list, tuple array
str, unicode string
int, long, float number
True true
False false
None null

json.loads

用于解碼JSON數(shù)據(jù),返回Python字段的數(shù)據(jù)類(lèi)型肆捕。

示例:

import json

json_str = '{"a":1,"b":2,"c":3,"d":4,"e":5}'

text = json.loads(json_str)
print(type(text))
print(text)

csv模塊

csv庫(kù)可以幫助我們解決大多數(shù)CSV格式的數(shù)據(jù)讀寫(xiě)問(wèn)題。

讀數(shù)據(jù)

準(zhǔn)備一個(gè)csv格式的文件席纽,命名為data.csv

Uid,Name,Age,Score
1000,"張1",18,99.99
1001,"張2",19,89.99
1002,"張3",20,79.99
1003,"張4",21,69.99

示例:將這個(gè)數(shù)據(jù)文件讀取為一個(gè)元組序列:

import csv

with open('data.csv', 'r', encoding='utf-8') as f:
    f_csv = csv.reader(f)
    for row in f_csv:
        print(row)

注意:data.csv和py文件的編碼格式應(yīng)當(dāng)統(tǒng)一為utf-8胆筒。

輸出為:

['Uid', 'Name', 'Age', 'Score']
['1000', '張1', '18', '99.99']
['1001', '張2', '19', '89.99']
['1002', '張3', '20', '79.99']
['1003', '張4', '21', '69.99']

示例:將這個(gè)數(shù)據(jù)讀取為一個(gè)字典:

import csv

with open('data.csv', 'r', encoding='utf-8') as f:
    f_csv = csv.DictReader(f)
    for row in f_csv:
        print(type(row))
        print(row)

輸出:

<class 'collections.OrderedDict'>
OrderedDict([('Uid', '1000'), ('Name', '張1'), ('Age', '18'), ('Score', '99.99')])
<class 'collections.OrderedDict'>
OrderedDict([('Uid', '1001'), ('Name', '張2'), ('Age', '19'), ('Score', '89.99')])
<class 'collections.OrderedDict'>
OrderedDict([('Uid', '1002'), ('Name', '張3'), ('Age', '20'), ('Score', '79.99')])
<class 'collections.OrderedDict'>
OrderedDict([('Uid', '1003'), ('Name', '張4'), ('Age', '21'), ('Score', '69.99')])

寫(xiě)數(shù)據(jù)

示例:

import csv

headers = ['Uid', 'Name', 'Age', 'Score']
rows = [
    ('1000', '張1', '18', '99.99'),
    ('1001', '張2', '19', '89.99'),
    ('1002', '張3', '20', '79.99'),
    ('1003', '張4', '21', '69.99')
]
with open('data1.csv', 'w', newline='') as f:
    f_csv = csv.writer(f)
    f_csv.writerow(headers)
    f_csv.writerows(rows)

注意:newline=''這個(gè)參數(shù)矫渔,你會(huì)發(fā)現(xiàn)庙洼,如果不加油够,生成的csv文件中每一行下面總是會(huì)多一行空白行。

示例:

寫(xiě)入字典序列數(shù)據(jù)到csv文件中鬼悠。

import csv

headers = ['Uid', 'Name', 'Age', 'Score']
rows = [
    {'Uid': 1000, 'Name': '張1', 'Age': 18, 'Score': 99.99},
    {'Uid': 1001, 'Name': '張2', 'Age': 19, 'Score': 89.99},
    {'Uid': 1002, 'Name': '張3', 'Age': 20, 'Score': 79.99},
    {'Uid': 1003, 'Name': '張4', 'Age': 21, 'Score': 69.99}
]

with open('data2.csv', 'w', newline='') as f:
    f_csv = csv.DictWriter(f, headers)
    f_csv.writeheader()
    f_csv.writerows(rows)

實(shí)戰(zhàn)──搜索引擎首頁(yè)實(shí)戰(zhàn)

寫(xiě)好的GitOPEN搜索首頁(yè)如圖所示:

image

整個(gè)項(xiàng)目的結(jié)構(gòu)如圖所示蹬挺,項(xiàng)目源碼位置CrawlerLessons/codes/lesson01/SearchDemo

image

index.html源碼:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>GitOPEN搜索,最貼心搜索</title>
    <link rel="stylesheet" href="index.css">
</head>
<body>
<div id="root">
    <div id="header">
        <div id="links">
            <a  target="_blank">新聞</a>
            <a  target="_blank">hao123</a>
            <a  target="_blank">地圖</a>
            <a  target="_blank">視頻</a>
            <a href="table.html" target="_blank">員工</a>
            <a href="list.html" target="_blank">列表</a>
        </div>
    </div>
    <div id="content">
        <img src="images/logo.png" alt="GitOPEN搜索,最貼心搜索">
        <br>
        <form action="https://www.so.com/s?" method="get">
            <input id="input_search" type="text" name="q">
            <input id="btn_search" type="submit" value="搜索一下"/>
        </form>
    </div>
    <div id="footer">
        Powered by GitOPEN ? Hosted by <a  target="_blank">Vultr</a>
    </div>
</div>
</body>
</html>

index.css源碼:

* {
    margin: 0px;
    padding: 0px;
}

html, body {
    width: 100%;
    height: 100%;
}

#root {
    width: 100%;
    height: 100%;
    align-self: center;
}

#header {
    height: fit-content;
    text-align: right;
}

#header #links {
    padding: 10px;
}

#header #links a {
    color: black;
    font-size: 16px;
    font-weight: bold;
    margin-right: 16px;
}

#content {
    height: 70%;
    text-align: center;
    padding-top: 60px;
}

#content img {
    width: 300px;
}

#content #btn_search {
    height: 34px;
    width: 80px;
    padding: 5px;
    border: 0px;
    background-color: #3D5984;
    font-size: 16px;
    color: #FFFFFF;
}

#content #input_search {
    height: 34px;
    width: 500px;
    font-size: 18px;
    border-color: #3D5984;
}

#footer {
    height: 20%;
    text-align: center;
    font-style: oblique;
}

list.html源碼:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>列表示例</title>
</head>
<body>

<h3>無(wú)序列表</h3>
<ul>
    <li>張1</li>
    <li>張2</li>
    <li>張3</li>
    <li>張4</li>
</ul>
<hr>
<h3>有序列表</h3>
<ol>
    <li>張1</li>
    <li>張2</li>
    <li>張3</li>
    <li>張4</li>
</ol>
</body>
</html>

table.html源碼:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>員工信息</title>
    <style>
        table, th, td {
            border: 1px #2d78f4 dashed;
            border-collapse: collapse;
            text-align: center;
        }

        table {
            width: auto;
        }

        th, td {
            width: 90px;
        }

        th {
            color: crimson;
        }

        #total {
            color: blueviolet;
        }
    </style>
</head>
<body>

<table>
    <tr>
        <th>編號(hào)</th>
        <th>姓名</th>
        <th>月薪</th>
    </tr>
    <tr>
        <td>0001</td>
        <td>張1</td>
        <td>20000.00</td>
    </tr>
    <tr>
        <td>0002</td>
        <td>張2</td>
        <td>10000.00</td>
    </tr>
    <tr>
        <td>0003</td>
        <td>張3</td>
        <td>8000.00</td>
    </tr>
    <tr>
        <td colspan="2">總計(jì)</td>
        <td colspan="1" id="total">38000.00</td>
    </tr>
</table>

</body>
</html>

實(shí)戰(zhàn)──簡(jiǎn)易學(xué)生管理系統(tǒng)

這是一個(gè)玩具代碼項(xiàng)目起愈,用來(lái)練習(xí)剛剛學(xué)會(huì)的Python基礎(chǔ)知識(shí)捏题。

這個(gè)實(shí)戰(zhàn)例子我們不再做代碼演示休涤,請(qǐng)大家自行運(yùn)行代碼功氨,找出代碼的不足之處捷凄,寫(xiě)出自己的《簡(jiǎn)易學(xué)生管理系統(tǒng)》,要求具有的功能如下圖所示:

image

參考代碼位置:CrawlerLessons/codes/lesson01/StudentSystem桶错。

參考資料推薦

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市黎比,隨后出現(xiàn)的幾起案子演闭,更是在濱河造成了極大的恐慌米碰,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,464評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吴趴,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡撇叁,警方通過(guò)查閱死者的電腦和手機(jī)陨闹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,033評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)君账,“玉大人帖蔓,你說(shuō)我怎么就攤上這事塑娇∩诳校” “怎么了拳球?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,078評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵魔吐,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我辞色,道長(zhǎng)相满,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,979評(píng)論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮躲撰,結(jié)果婚禮上拢蛋,老公的妹妹穿的比我還像新娘。我一直安慰自己垃瞧,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,001評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布嗦锐。 她就那樣靜靜地躺著萎羔,像睡著了一般外驱。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上瓦哎,一...
    開(kāi)封第一講書(shū)人閱讀 52,584評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音犯助,去河邊找鬼。 笑死瞬哼,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的结胀。 我是一名探鬼主播,決...
    沈念sama閱讀 41,085評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼崔赌,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了秀姐?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 40,023評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎舷蟀,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體匈子,經(jīng)...
    沈念sama閱讀 46,555評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,626評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片通贞。...
    茶點(diǎn)故事閱讀 40,769評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖茎用,靈堂內(nèi)的尸體忽然破棺而出旭斥,到底是詐尸還是另有隱情,我是刑警寧澤菇爪,帶...
    沈念sama閱讀 36,439評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響削葱,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜首繁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,115評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧啸罢,春花似錦、人聲如沸衩匣。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,601評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)赎败。三九已至僵刮,卻和暖如春搞糕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背曼追。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,702評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工窍仰, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人礼殊。 一個(gè)月前我還...
    沈念sama閱讀 49,191評(píng)論 3 378
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像晶伦,于是被迫代替她去往敵國(guó)和親碟狞。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,781評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容