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)呻引。
??
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)計扇貝單詞書