Python入門:網(wǎng)站爬蟲基礎(chǔ)

10.1 什么是爬蟲?

爬蟲是自動化幫我們獲取網(wǎng)頁數(shù)據(jù)的程序
如果把互聯(lián)網(wǎng)想像成一張大網(wǎng)甚亭,那么爬蟲就是一只為我們工作的蜘蛛
它可以按照我們寫好的程序,自動化地在網(wǎng)上獵取我們需要的獵物(數(shù)據(jù))

from urllib.request import urlopen
my_first_spider = urlopen("https://assets.baydn.com/baydn/public/codetime/0.0.1/hello_human.html")
print(my_first_spider.read())
# 輸出:
<html>
<head>
<title>Spider's Home</title>
</head>
<body>
<h1>Hello, human.</h1>

</body>
</html>

10.2 爬蟲的原理

剛才說了,爬蟲是自動化幫我們獲取網(wǎng)頁數(shù)據(jù)的程序赘方。那么究竟是如何獲取網(wǎng)頁數(shù)據(jù)的缰泡?

將網(wǎng)絡(luò)通信與打電話做一個類比:當(dāng)我們想訪問某個網(wǎng)址(URL)時刀荒,網(wǎng)址(URL)就類似于電話號碼,而電腦棘钞、智能手機這樣的客戶端(client)也就類似于電話缠借。我們通過客戶端的瀏覽器(browser)發(fā)送訪問請求(request),就好比用電話撥打電話號碼宜猜。接收請求的一方叫做服務(wù)器(web server)泼返,如果服務(wù)器運行正常并且同意我們的請求,則會向客戶端發(fā)送回答(response)姨拥,回答的內(nèi)容會放在HTML文件里绅喉。這時,瀏覽器又可以幫我們解析HTML文件叫乌,讓它變成我們通巢窆蓿看到的網(wǎng)頁的模樣。

?
來源扇貝編程

?

向網(wǎng)址https://assets.baydn.com/baydn/public/codetime/1/scrape_py.html發(fā)送請求憨奸,查看輸出

from urllib.request import urlopen
web_response = urlopen("https://assets.baydn.com/baydn/public/codetime/1/scrape_py.html")
print(web_response)
# 輸出: <Response>

輸出:<Response>革屠,這代表我們成功獲得了對方網(wǎng)址給我們的回答。但究竟回答的具體內(nèi)容是什么呢排宰?我們在代碼中看到的 urllib 又是什么呢似芝?

10.3 urllib模塊

urllib 是Python 中用于獲取網(wǎng)頁數(shù)據(jù)的模塊,通過 import 調(diào)用它板甘,并讓它(urllib.request)幫我們向網(wǎng)址發(fā)送請求党瓮,接收回答。我們剛剛得到的<Response>相當(dāng)于目標(biāo)網(wǎng)址給我們一封尚未拆封的信盐类,而接下來要做的是用 urllib 中的 read()寞奸,來讀這封信的具體內(nèi)容痕寓。

from urllib.request import urlopen
web_response = urlopen("https://assets.baydn.com/baydn/public/codetime/1/scrape_py.html")
print(web_response.read())  # 這里添加.read()

?

?

10.4 HTML基本結(jié)構(gòu)

HTML文件的基本組成部分是:head 和 body
head 一般存放網(wǎng)頁的標(biāo)題(title)等信息
body一般承載網(wǎng)頁的主體信息

<head>                  #head部分開頭
<title>......</title>   #該HTML的標(biāo)題
</head>                 #head部分結(jié)尾
<body>                  #body部分開頭
</body>                 #body部分結(jié)尾

10.5 如何查看網(wǎng)頁HTML

將瀏覽器打開至目標(biāo)網(wǎng)頁,點擊鼠標(biāo)右鍵蝇闭,在菜單中選中 “檢查”(注:有的系統(tǒng)中叫做“審查元素”或“檢查元素”)呻率,點擊 “檢查” 之后,便能在屏幕上看見當(dāng)前網(wǎng)頁的HTML結(jié)構(gòu)呻引。

?
image

?

10.6 篩選信息

定位標(biāo)題

from urllib.request import urlopen
web_response = urlopen("https://web.shanbay.com/codetime/home?")
html_file = web_response.read().decode()
# 找到 "<title>" 的索引位置
start = html_file.find("<title>")
# 找到 "</title>" 的索引位置
end = html_file.find("</title>")
# 輸出標(biāo)題字符串
title = html_file[start+len("<title>"):end]
print(title)

10.7 re 模塊

調(diào)用re模塊來使用正則表達式
正則表達式:正則表達式使用單個字符串來描述礼仗、匹配一系列符合某個句法規(guī)則的字符串
官方文檔:re — Regular expression operations

re.search()篩選數(shù)據(jù)

import re
record = ["老張@小明老師","小王阿強的同學(xué)","@阿強"]
for item in record:
    if re.search("@",item):
        print(item)
# 輸出:
老張@小明老師
@阿強

re.findall()將目標(biāo)字符串中符合某個規(guī)則的部分都找出來,一并存在列表里

import re
record = "老張@小明老師@小王@阿強的同學(xué)@阿強"
find_at = re.findall("@",record)
print(find_at)
# 輸出: ['@', '@', '@', '@']

符號匹配

^:匹配字符串的開頭

import re
record = ["老張@小明老師","小王阿強的同學(xué)","@阿強"]
for item in record:
    if re.search("^@",item):
        print(item)
#輸出:@阿強

$:匹配字符串結(jié)尾

email_addr = ["woxuepython@qq.com","20190401_xuexi@168.cn","python_learn.cn",\
              "aixuepython@163.com","python_good_com@hotmail.cn","python_365_cn@foxmail.com"]
for email in email_addr:
    if re.search("com$",email):
        print(email)
# 輸出:
woxuepython@qq.com
aixuepython@163.com
python_365_cn@foxmail.com

.:匹配任意字符
*:表示任意次(從0到無限)
+:表示至少一次或任意次數(shù)

import re
email_addr = ["woxuepython@qq.com",
              "20190401_xuexi@168.cn",
              "python_learn.cn",
              "aixuepython@163.com",
              "python_good@hotmail.cn",
              "python_365@foxmail.com"]
for email in email_addr:
    if re.search("@.*cn",email):
        print(email)
# 輸出
20190401_xuexi@168.cn
python_good@hotmail.cn

數(shù)字和字母

[0-9]代表 從0至9共十個數(shù)字中的任意一個
[a-z]代表 從小寫a到z逻悠,26個字母中的一個
[A-Z] 代表 從大寫A到Z元践,26個字母的一個

如果規(guī)則中的字母并不多,也可以將其一個個敲出來:
比如 "[abc]" 代表符合 abc 三個字母中的一個

#輸出其中首字母為 M 或者 P 的人名
import re
names = ["Joe","Jasmine","Mike","Pessilia","Pong","Sophie"]
for name in names:
    if re.search("^[MP]",name):
        print(name)
# 輸出:
Mike
Pessilia
Pong

貪婪匹配原則

在默認情況下*+符號返回的字符串為符合條件下的最大值

print(re.findall("a.*b","aabbabaabaa"))
# 輸出:['aabbabaab']

如何避免貪婪匹配童谒?我們可以使用符號 ?

print(re.findall("a.*?b","aabbabaabaa"))
#輸出:['aab', 'ab', 'aab']

10.8 爬蟲詳細教程實例

入門:Python爬蟲詳細教程:統(tǒng)計扇貝網(wǎng)站打卡數(shù)據(jù)
進階:Python爬蟲:統(tǒng)計扇貝單詞書

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末单旁,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子饥伊,更是在濱河造成了極大的恐慌象浑,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件琅豆,死亡現(xiàn)場離奇詭異愉豺,居然都是意外死亡,警方通過查閱死者的電腦和手機茫因,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門蚪拦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人冻押,你說我怎么就攤上這事驰贷。” “怎么了洛巢?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵括袒,是天一觀的道長。 經(jīng)常有香客問我狼渊,道長箱熬,這世上最難降的妖魔是什么类垦? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任狈邑,我火速辦了婚禮,結(jié)果婚禮上蚤认,老公的妹妹穿的比我還像新娘米苹。我一直安慰自己,他們只是感情好砰琢,可當(dāng)我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布蘸嘶。 她就那樣靜靜地躺著良瞧,像睡著了一般。 火紅的嫁衣襯著肌膚如雪训唱。 梳的紋絲不亂的頭發(fā)上褥蚯,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天,我揣著相機與錄音况增,去河邊找鬼赞庶。 笑死,一個胖子當(dāng)著我的面吹牛澳骤,可吹牛的內(nèi)容都是我干的歧强。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼为肮,長吁一口氣:“原來是場噩夢啊……” “哼摊册!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起颊艳,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤茅特,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后棋枕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體温治,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年戒悠,在試婚紗的時候發(fā)現(xiàn)自己被綠了熬荆。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡绸狐,死狀恐怖卤恳,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情寒矿,我是刑警寧澤突琳,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站符相,受9級特大地震影響拆融,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜啊终,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一镜豹、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蓝牲,春花似錦趟脂、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽已卸。三九已至,卻和暖如春硼一,著一層夾襖步出監(jiān)牢的瞬間累澡,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工般贼, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留永乌,地道東北人。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓具伍,卻偏偏與公主長得像翅雏,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子人芽,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,037評論 2 355

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