柚子快報邀請碼778899分享:爬蟲:靜態(tài)網(wǎng)頁的爬取
柚子快報邀請碼778899分享:爬蟲:靜態(tài)網(wǎng)頁的爬取
一、引言
1、靜態(tài)網(wǎng)頁
首先我們來了解一下什么是靜態(tài)網(wǎng)頁,有一種說法是這樣的:
靜態(tài)網(wǎng)頁是標(biāo)準(zhǔn)的HTML文件,它的文件擴(kuò)展名是.htm、.html,可以包含文本、圖像、聲音、FLASH動畫、客戶端腳本和ActiveX控件及JAVA小程序等。靜態(tài)網(wǎng)頁是相對于動態(tài)網(wǎng)頁而言,是指沒有后臺數(shù)據(jù)庫、不含程序和不可交互的網(wǎng)頁。
2、爬蟲
網(wǎng)絡(luò)爬蟲又稱網(wǎng)絡(luò)蜘蛛和網(wǎng)絡(luò)機(jī)器人,也是一種程序或腳本、它可以自動請求萬維網(wǎng)網(wǎng)站并提取網(wǎng)絡(luò)數(shù)據(jù),但需要遵守一定的規(guī)則。
今天用Python中的爬蟲來爬取一個靜態(tài)網(wǎng)頁,其實爬蟲并非Python獨有,其他語言也可以寫爬蟲,比如Java,PHP等等,但Python相對來說比較簡單一些
3.robots協(xié)議
Robots協(xié)議(也稱為爬蟲協(xié)議、機(jī)器人協(xié)議等)的全稱是“網(wǎng)絡(luò)爬蟲排除標(biāo)準(zhǔn)”(Robots Exclusion Protocol),它的作用很簡單,就是告訴爬蟲,在這個網(wǎng)頁什么內(nèi)容你可以爬取,什么東西你不應(yīng)該去爬取,市面上主流搜索引擎都會遵守Robots協(xié)議,因為搜索引擎本質(zhì)是也可以說是爬蟲。
二、requests
1、requests的簡介
今天使用一個簡便的爬蟲庫:requests,先來簡單認(rèn)識一下它,?requests?庫是一個原生的?HTTP?庫,比起其他一些庫更為容易使用。 它可以發(fā)送原生的?HTTP 1.1?請求,讓使用者不用手動為?URL?添加查詢串, 也不需要對 POST?數(shù)據(jù)進(jìn)行表單編碼
2、實踐
先上代碼
以中國氣象局天氣預(yù)報為例子
#導(dǎo)入模塊
import requests
#該模塊作用是使打印出來的json格式化
import pprint
#請求的URL路徑
url = "https://weather.cma.cn/api/now/59287"
#發(fā)送一個請求
requests = requests.get(url)
#進(jìn)行編碼,主要作用是防止亂碼
requests.encoding='utf-8'
#該變量作用是將數(shù)據(jù)儲存起來
re_data = requests.json()
#讓打印出來的json格式化
pprint.pprint(re_data)
print("城市:" + re_data['data']['location']['name'])
print("風(fēng)向:" + re_data['data']['now']['windDirection'])
這里用和城市和風(fēng)向做例子,將有效信息從一堆字符串里提取出來,結(jié)果如下:
雖然代碼看起來簡單,但是我這種做法能爬取到的信息少之又少,不過這只是對requests庫的淺嘗輒止,畢竟都用到爬蟲了,這點信息自然是不夠的。但俗話說:“工欲善其事,必先利其器”,先來認(rèn)識一下新的庫。
三.BeautifulSoup
1、簡介
還是簡單介紹一下BeautifulSoup,BeautifulSoup是一個可以從HTML或XML文件中提取數(shù)據(jù)的Python庫。這個庫能夠通過你喜歡的轉(zhuǎn)換器實現(xiàn)慣用的文檔導(dǎo)航,查找,修改文檔的方式。它是一個解析器,可以特定的解析出內(nèi)容,省去了我們編寫正則表達(dá)式的麻煩。同時,Beautiful Soup支持多種格式和語法,可以通過不同的解析器快速解析和查找網(wǎng)頁文檔.。
四、正則表達(dá)式
先粗略認(rèn)識一下:
正則表達(dá)式是一種用于匹配字符串中特定模式的強(qiáng)大工具。它可以用來檢查一個字符串是否符合某種特定的格式,例如電子郵件地址、電話號碼、網(wǎng)址等。正則表達(dá)式由一系列字符組成,這些字符可以表示特定的字符、元字符和操作符。
元字符是正則表達(dá)式中具有特殊含義的字符,例如:
.?匹配任意單個字符(除了換行符)*?匹配前面的字符零次或多次+?匹配前面的字符一次或多次??匹配前面的字符零次或一次[ ]?匹配方括號內(nèi)的任意一個字符{n}?匹配前面的字符恰好n次^?匹配字符串的開頭$?匹配字符串的結(jié)尾\?轉(zhuǎn)義特殊字符
1、(三+四)實踐
接下來我們試著將整個靜態(tài)網(wǎng)頁的HTML代碼全提取出來,先把代碼放上來:
import requests
from bs4 import BeautifulSoup
url = 'https://weather.cma.cn/web/weather/map.html' # 需要爬取的網(wǎng)頁URL
response = requests.get(url)
html_content = response.text
soup = BeautifulSoup(html_content, 'html.parser')
print(soup.prettify())
依舊還是中國氣象局天氣預(yù)報這個網(wǎng)站,如下圖所示,我們提取了一整個網(wǎng)頁的HTML代碼:
(篇幅原因,只能展示部分)
可以看到一整頁的代碼很多,我們可以按照一定規(guī)則提取有有的信息:
import requests
from bs4 import BeautifulSoup # 網(wǎng)頁解析,獲取數(shù)據(jù)
import re # 正則表達(dá)式,進(jìn)行文字匹配
findLink = re.compile(r'
url = 'https://weather.cma.cn/web/text/HN/AGD.html' # 需要爬取的網(wǎng)頁URL
response = requests.get(url)
html = response.text
soup = BeautifulSoup(html, 'html.parser')#解析數(shù)據(jù)
#輸出原來整個網(wǎng)頁的HTML源碼,測試是否爬取成功
#print(soup.prettify())
for item in soup.find_all('tr', class_="odd"): # 查找符合要求的字符串
item = str(item)#將獲取到的item變成字符串
link = re.findall(findLink, item) # 通過正則表達(dá)式查找
print(link)
通過一定的規(guī)則(正則表達(dá)式)將數(shù)據(jù)進(jìn)行處理后,得到的數(shù)據(jù)價值提升了許多,如下圖: (篇幅原因,只能展示部分)
這一張?zhí)幚磉^后的數(shù)據(jù),看起來不止比整個HTML頁面舒服多了,就數(shù)據(jù)方面的提升也是一眼就可以看出來,但可以看見,第一個數(shù)據(jù)和最后一個數(shù)據(jù)有還是有標(biāo)頭,而且還有重復(fù)的部分,所以我們接下來要進(jìn)行數(shù)據(jù)再處理,最后將數(shù)據(jù)存表。
五.數(shù)據(jù)存表
1、真·完整代碼:
import requests
from bs4 import BeautifulSoup # 網(wǎng)頁解析,獲取數(shù)據(jù)
import re # 正則表達(dá)式,進(jìn)行文字匹配
#將數(shù)據(jù)存進(jìn)xlsx表
from openpyxl import Workbook
excel = Workbook()
work = excel.active
#列表第一行
work.append(['城市','白日天氣現(xiàn)象','白日風(fēng)向','白日風(fēng)力','當(dāng)天最高溫度','夜晚天氣現(xiàn)象','夜晚風(fēng)向','夜晚風(fēng)力','當(dāng)天最低溫度'])
# 正則表達(dá)式
findLink = re.compile(r'
findTitle = re.compile(r'
head={
"User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36"
}
url = 'https://weather.cma.cn/web/text/HN/AGD.html' # 需要爬取的網(wǎng)頁URL
response = requests.get(url)
html = response.text
soup = BeautifulSoup(html, 'html.parser') # 解析數(shù)據(jù)
# 輸出原來整個網(wǎng)頁的HTML源碼,測試是否爬取成功
#print(soup.prettify())
for item in soup.find_all('tr', class_="odd"): # 查找符合要求的字符串
item = str(item) # 將獲取到的item變成字符串
titles = re.findall(findTitle, item) # 通過正則表達(dá)式查找
link = re.findall(findLink,item)[0]
#對獲取的數(shù)據(jù)進(jìn)一步處理
pattern = r'(.*?)<\/a>'
# 使用re.findall來查找所有匹配的項
matches = re.findall(pattern, link)
#字符串相加
s = matches+titles[1:-1]
#存表
work.append(s)
excel.save("天氣預(yù)報.xlsx")
print(matches,titles[1:-1])
結(jié)果:
在上面這張圖我們可以看見,我將城市的名字從標(biāo)頭 #對獲取的數(shù)據(jù)進(jìn)一步處理 pattern = r'(.*?)<\/a>' # 使用re.findall來查找所有匹配的項 matches = re.findall(pattern, link) #字符串相加 s = matches+titles[1:-1] 因為得出來的結(jié)果為兩個字符串,所以將他們相加在一起,方便下面存表。 2、表數(shù)據(jù) 代碼執(zhí)行完畢之后,在pycharm的左上角,項目的位置上會出現(xiàn)一個xlsx文件: 文件內(nèi)容如下: 六、結(jié)語 本文使用了與爬蟲有關(guān)三個庫來爬取一篇靜態(tài)網(wǎng)頁,也初步展示了怎么處理拿到手的數(shù)據(jù),使其變得更加美觀,更具價值,還有怎么將數(shù)據(jù)存進(jìn)xlsx表中。想要獲取高質(zhì)量的網(wǎng)頁數(shù)據(jù),可以在開始爬取數(shù)據(jù)前,通過選擇合適的爬蟲框架、建設(shè)爬取的流程等,都可以提高爬蟲程序的效率和準(zhǔn)確性。 此外,爬蟲還具有數(shù)據(jù)清洗和處理的能力,它能去除噪聲數(shù)據(jù)、過濾無用信息,并將數(shù)據(jù)轉(zhuǎn)換為可用的格式,為后續(xù)的分析和應(yīng)用做好準(zhǔn)備。 最后,爬蟲可以整合和分析數(shù)據(jù),這對于大規(guī)模數(shù)據(jù)的分析和研究至關(guān)重要。 好了,到此為止了。 柚子快報邀請碼778899分享:爬蟲:靜態(tài)網(wǎng)頁的爬取 好文推薦
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。