通過前面章節的介紹,我們對什么是爬蟲有了初步的認識,同時對如何爬取網頁有了一個大概的了解,從本章起,我們將從理論走向實踐,結合實際操作來進一步深化理解,
由于使用python進行爬蟲抓取頁面可供使用的工具眾多,比如requests、scrapy、PhantomJS、Splash等,并且對于抓取的頁面決議的工具也很多,我們這里從最簡單的開始,使用requests庫和beautifSoup工具進行靜態頁面抓取和決議,
等基本功扎實之后,我們可以使用更靈活多變的工具,不僅可以靜態抓取,還可以動態抓取;不僅可以抓取單頁面,還可以遞回深度抓取,同時結合其他的渲染、存盤、機器學習等工具,我們可以對資料進行處理、加工、建模、展示,
廢話不多說,讓我們開始今天的例子,抓取安徒生童話故事中的名篇《丑小鴨》,“工欲善其事,必先利其器”,在開始之前我們需要把準備作業做好,下載pycharm,并安裝requests庫和beautifSoup,安裝結果如下:

開始爬蟲的第一步,找到含有《丑小鴨》這篇童話故事的鏈接,我們這里使用的鏈接是:https://www.ppzuowen.com/book/antushengtonghua/7403.html,

在找到我們的目標鏈接之后,第二步就是分析網頁,分析什么呢?當然是分析我們要爬取的內容在哪里,
根據我們前面的介紹,我們此次爬蟲的目的是爬取丑小鴨這篇課文,根據這一目標,我們需要先來研究網頁的構成,那么如何查看網頁呢?一般是在瀏覽器的開發者模式下進行,對于chrome瀏覽器,我們可以使用快捷鍵F12進行查看,如圖所示:

左邊的是網頁顯示的內容,右邊是網頁的HTML檔案,
通過對右邊頁面的分析,我們可以觀察到,我們需要抓取的頁面內容在一個<p></p>標簽中:

既然頁面找到了,需要抓取的內容的位置也找到了,那么現在我們需要解決的一個問題是:如何使用代碼快速的進行目標內容的位置定位?
在理想的情況下,我們希望這個<p></p>標簽有一個唯一的屬性(通常為id或class),那么我們就可以直接通過這個屬性進行位置定位,
但是很遺憾的是,在我們這個目標標簽<p></p>中,它沒有任何屬性,更別談唯一屬性了,既然直接訪問的愿望落空了,那么只能使用間接的,
通常間接的方法有兩種:第一種是找跟它相鄰的某個可以快速定位的標簽,然后再根據這兩個標簽tag之間的位置關系進行間接訪問,在本次操作中,我們很容易找到<p></p>標簽的父標簽div擁有唯一的class屬性articleContent;第二種方式是一次把所有<p></p>標簽都找出來,然后使用挨個遍歷的方式,找到目標的標簽,事實上,在實際爬取程序中,這兩種方式都有使用,
至于哪個更好,我們會根據實際情況進行分析、選擇,在這里我們對兩種方式都進行演示,
第一種方式:
我們根據<p></p>標簽的父標簽div擁有唯一的class屬性articleContent找到div標簽,然后根據父子關系找到p標簽,再通過正則運算式對無用內容進行過濾,得到最終結果,
# 請求庫
import requests
# 決議庫
from bs4 import BeautifulSoup
import re
# 爬取的網頁鏈接
url=r"https://www.ppzuowen.com/book/antushengtonghua/7403.html"
r= requests.get(url)
r.encoding=None
result = r.text
# 再次封裝,獲取具體標簽內的內容
bs = BeautifulSoup(result, 'lxml')
psg = bs.select('.articleContent > p')
title = bs.select('title')[0].text.split('_')[0]
# print(title)
txt = ''.join(str(x) for x in psg)
res = re.sub(r'<.*?>', "", txt)
result=res.split("(1844年)")[0]
print('標題:',title)
print('原文內容:',result)
最終的結果:

實作的代碼主要分為兩部分:第一部分是頁面的抓取,如:
# 爬取的網頁鏈接
url=r"https://www.ppzuowen.com/book/antushengtonghua/7403.html"
r= requests.get(url)
r.encoding=None
result = r.text
print(result)

這部分內容與我們之前在瀏覽器的開發者模式下看到的HTML原始碼是一摸一樣的,
第二部分是頁面的決議,
我們之前介紹過HTLML頁面本質上是一棵DOM樹,我們采用樹遍歷子節點的方式遍歷HTML頁面中的標簽,如:
# 再次封裝,獲取具體標簽內的內容
bs = BeautifulSoup(result, 'lxml')
psg = bs.select('.articleContent > p')
這里先將頁面資訊轉為xml的格式檔案(注:HTML檔案屬于一種特殊型別的xml檔案),然后根據css的語法找到p標簽的內容,
第二種方式:
我們按照最開始的方式寫成的代碼是這樣的:
# 請求庫
import requests
# 決議庫
from bs4 import BeautifulSoup
# 爬取的網頁鏈接
url=r"https://www.ppzuowen.com/book/antushengtonghua/7403.html"
r= requests.get(url)
r.encoding=None
result = r.text
# 再次封裝,獲取具體標簽內的內容
bs = BeautifulSoup(result,'html.parser')
# 具體標簽
print("---------決議后的資料---------------")
# print(bs.span)
a={}
# 獲取已爬取內容中的p簽內容
data=https://www.cnblogs.com/turing09/p/bs.find_all('p')
# 回圈列印輸出
for tmp in data:
print(tmp)
print('********************')
然后我們查看輸出的結果卻與預期并不相符,是這樣的:

獲取的內容是分段的,并且還夾雜很多其他的沒用的資訊,事實上,這些在實際爬取程序中都是常見的,不是每次爬取都是一步到位,需要不停的除錯,
經過分析,我們可以使用運算式對無用資訊進行過濾,同時使用字串拼接函式進行拼接,得到我們預期的內容,
最終的代碼如下:
# 請求庫
import requests
# 決議庫
from bs4 import BeautifulSoup
# 爬取的網頁鏈接
url=r"https://www.ppzuowen.com/book/antushengtonghua/7403.html"
r= requests.get(url)
r.encoding=None
result = r.text
# 再次封裝,獲取具體標簽內的內容
bs = BeautifulSoup(result,'html.parser')
# 具體標簽
print("---------決議后的資料---------------")
# print(bs.span)
a={}
# 獲取已爬取內容中的p簽內容
data=https://www.cnblogs.com/turing09/p/bs.find_all('p')
result=''
# 回圈列印輸出
for tmp in data:
if '1844年' in tmp.text:
break
result+=tmp.text
print(result)
以上我們通過兩種方式講解了如何爬取一些簡單的網頁資訊,當然,對于爬取的內容,我們有時不僅是輸出,可能還需要進行存盤,
通常存盤的方式采用的是檔案和資料庫形式,關于這些內容,我們將在后續進行詳細介紹,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/116867.html
標籤:Python
上一篇:初識HTML頁面
