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(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模塊來使用正則表達(dá)式
正則表達(dá)式:正則表達(dá)式使用單個字符串來描述、匹配一系列符合某個句法規(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

貪婪匹配原則

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

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

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

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

10.8 爬蟲詳細(xì)教程實例

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容