爬蟲筆記(四) 基於bs4

2022-06-24 19:21:11 字數 3156 閱讀 2833

爬取  詩詞名句**中,《三國演義》全部內容。基於bs4,而不是正則。bs4相對於正則簡單一些,但是正則更加精準。準確的說是基於bs4中的beautifulsoup。

同樣操作步驟:匯入包requests和bs4

headers--ua偽裝

text是返回的資訊,也就是url中的原碼。

可以print測試一下,和網頁原始碼內容一樣的,下邊就需要對網頁原始碼內容分析。

所有節目錄的title和url都在同乙個標籤中, div class=「book-mulu」  ----->   ul    ----->     li,具體的章節title和url在   li----->  a  中。

所以下一步應該把所有的url和title都獲取到。

很明顯,可以用正則,但是為了練習bs4,選擇bs4。

通過beautifulsoup例項化物件soup,beautifulsoup引數第乙個是要分析的字串,可以來自本地,可以來自requests。第二個是直譯器,常用『lxml』。

為了篩選網頁原始碼中的需要內容,使用soup的select方法。select方法是選擇器,可以通過標籤、id、類(class內容)、層選擇,詳細可以參考:

我選擇通過類查詢,定位到需要內容的上上級標籤,再通過「>」 逐級向下查詢,找到li層。也可以選擇".book-mulu li",表示跨層,不逐級躍層。

最後soup.select,返回是乙個list,這個很重要。

soup = bs4.beautifulsoup(text,'

lxml')

list = soup.select("

.book-mulu > ul > li

") #

".book-mulu li" 空格表示跨層

第一次選擇的是通過soup.findall()尋找 li標籤,寫法就是soup.findall(name = 'li'),發現返回的是list,list中除了需要的內容,還有其他沒用的li標籤,還需要再次篩選,所以放棄。

列印一下list前5個元素:

"

/book/sanguoyanyi/1.html

">第一回·宴桃園豪傑三結義 斬黃巾英雄首立功

"/book/sanguoyanyi/2.html

">第二回·張翼德怒鞭督郵 何國舅謀誅宦豎

"/book/sanguoyanyi/3.html

">第三回·議溫明董卓叱丁原 饋金珠李肅說呂布

"/book/sanguoyanyi/4.html

">第四回·廢漢帝陳留踐位 謀董賊孟德獻刀

"/book/sanguoyanyi/5.html

">第五回·發矯詔諸鎮應曹公 破關兵三英戰呂布

確實是需要的內容。

下一步就是提取url和title,發現url並不是完整的url,前邊少了一些內容,也要想辦法補全。

url_list =

for i in

list:

''+i.a['

href

']) #

補全url

最後就是對每乙個章節的url訪問,提取標籤中的所需內容,儲存到本地。

soup_detail.find('div',class_ = 'card bookmark-list')    用find方法找到第乙個屬性為「card bookmark-list」 div標籤,實際上也可以通過id找。

第一次寫時,順手把find寫成了findall,報錯。原因在於findall返回的是乙個list,而find是第乙個匹配的str。

find.text是將所有的,該標籤以及該標籤的子標籤,的內容返回。還有乙個是.string,只能返回該標籤內容,不包含子標籤。

最後用檔案with open,追加 『a』,的方式儲存成乙個txt檔案。

for i in

url_list:

text_detail = requests.get(url = i,headers =headers).text

soup_detail = bs4.beautifulsoup(text_detail, '

lxml')

content = soup_detail.find('

div',class_ = '

card bookmark-list

').text

with open(

'./sanguoyanyi.txt

','a

',encoding= '

utf-8

') as fp:

fp.write(content)

fp.write('\n

')

最後是這個樣子

總結:bs4確實要比正則靈活一些,可以利用屬性、方法直接定位到想要獲取的內容。

當天爬的次數過多,直接把家裡網路ip瘋掉了,把隨身的兩個手機ip也瘋掉了。隨之又開始查如何使用**ip。**ip直接**買,1塊錢10w個,短效的,大部分都能用。   我買的是這家的。給的是乙個url,直接訪問,返回的就是乙個ip。可以使用爬蟲直接訪問這個url,接受返回的訊息,就可以得到ip,而且對url再次重新整理,也就是再次訪問,又可以獲得乙個新的ip。獲取ip的方式是對乙個固定的url進行訪問,好像很多家**都是這樣弄的。

因為**ip一般都是短效的,所以需要解決一旦ip失效,要切換ip的問題。思路已經想好,利用try except 捕獲異常,重新訪問獲取**ip的url,得到新的ip。設定requests中的timeout引數可以設定訪問時間。

第二天想這樣做,發現**又給我解封家裡的ip了。。。so,暫時放棄,但是一定可以實現。

爬蟲架構 bs4

方便解析html xml等格式的原始碼,快速查詢 修改等操作,節省數小時乃至更多的工作時間 官網文件 from bs4 import beautifulsoup print path beautifulsoup path 非真實網頁 html doc 夏日炎炎,要你幹嘛 print soup.hea...

爬蟲 bs4模組

安裝 pip3 install beautifulsoup4 解析html和xml,修改html和xmlimport requests from bs4 import beautifulsoup 文件容錯能力,不是乙個標準的html也能解析 soup beautifulsoup html doc,l...

爬蟲 資料解析 bs4

正規表示式實現資料解析 需求 爬取糗事百科中糗圖資料 import requests headers 方式1 url img data requests.get url url,headers headers content content返回的是byte型別的資料 方式2 方式2不可以使用ua偽裝...