爬蟲-BeautifulSoup簡(jiǎn)單分析和學(xué)習(xí)

最近在學(xué)習(xí)py,整理一下自己的學(xué)習(xí)記錄,算是備忘了。
py新手,僅供新手小伙伴們學(xué)習(xí)
1.BeautifulSoup中文文檔地址https://www.crummy.com/software/BeautifulSoup/bs4/doc/index.zh.html#extract

概覽
Class Diagram.png

我們平常爬蟲了解這幾個(gè)類就可以了

上面這個(gè)圖 我們最常用用到的就是TagNavigableString

我們指導(dǎo)html是標(biāo)記語言,我們想爬的數(shù)據(jù)都是被格式各樣的標(biāo)簽嵌套的。
<head>數(shù)據(jù)</head>
而BeautifulSoup 簡(jiǎn)單的來說就是找標(biāo)簽取數(shù)據(jù),總體來說學(xué)習(xí)成本特別低,容易上手。

我們來一步一分分析 對(duì)象的創(chuàng)建 以及 返回的類型

1.BeautifulSoup 的初始化

soup = BeautifulSoup(content,'lxml')
soup 是一個(gè)BeautifulSoup類型,從上面的繼承關(guān)系看其實(shí)就是一個(gè)Tag類型。一個(gè)大Tag包含著無數(shù)的小Tag

2.初步定位tag

tag = soup.find('table')
返回的是一個(gè)也是tag類型
tags = soup.find_all('table')
返回的是一個(gè)ResultSet 其實(shí)就是一個(gè)list類型的子類,在bs4.element文件中有說明

3.具體定位tag

當(dāng)我們獲取大體的Tag對(duì)象時(shí),我們?nèi)绻氆@取其中子Tag的數(shù)據(jù)
這里要分2種情況
一 。。標(biāo)記有屬性標(biāo)記
直接再通過第二步的方法繼續(xù)獲取
二 。。沒有屬性標(biāo)記 如<td></td>
str_list = tag.contents
返回一個(gè)list對(duì)象
str_list_iterator = tag.children
返回一個(gè)list_iterator

4.獲取數(shù)據(jù)

首先要說一點(diǎn) 上面第三步說的獲取具體的tag,其實(shí)通過contents和children獲取的不只是Tag對(duì)象,還有NavigableString對(duì)象。這點(diǎn)一定要清楚。
直接通過string屬性來獲取就可以了

實(shí)戰(zhàn)

爬取ip代理網(wǎng)站(2種不同的類型),獲取代理ip。
1.西刺免費(fèi)代理IPhttp://www.xicidaili.com/nn

網(wǎng)頁源代碼 我就不貼在這邊了

源代碼 大家自己另開的網(wǎng)頁自己看下

通過分析源代碼,我們很清楚的發(fā)現(xiàn)我們數(shù)據(jù)實(shí)在table標(biāo)簽內(nèi)(而且頁面只有一個(gè)table標(biāo)簽)
1.初始化
soup = BeautifulSoup(res.content,'lxml')
2.定位大體的Tag(這一步可以省略)
table_tag = soup.find('table')
3.定位具體的Tag
tr_list = table_tag.find_all('tr')
4.得到數(shù)據(jù)

for index,tr_tag in enumerate(tr_list):
    if index > 1:
        td_list = list(filter(lambda x:x != '\n',tr_tag.contents))
        print('ip: ' + td_list[1].string + ':' + td_list[2].string)

我們分析源碼可以發(fā)現(xiàn) 第1,2個(gè)tr 是表頭,不包含我們想要的數(shù)據(jù),可以跳過。
在contents獲取或有子節(jié)點(diǎn)的時(shí)候,我們會(huì)發(fā)現(xiàn)返回的不只有tag對(duì)象還有‘\n’字符的None類型。所以我們要用filter過濾這些噪音數(shù)據(jù)。
在過濾之后,我們可以清楚的看到 第二個(gè)tag對(duì)象時(shí)ip地址,第二個(gè)是端口號(hào)。

import requests
from bs4 import BeautifulSoup

res = requests.get('http://www.xicidaili.com/nn',headers = { 'User-Agent': 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.20 (KHTML, like Gecko) Chrome/11.0.672.2 Safari/534.20' })

soup = BeautifulSoup(res.content,'lxml')
table_tag = soup.find('table')
tr_list = table_tag.find_all('tr')

for index,tr_tag in enumerate(tr_list):
    if index > 1:
        td_list = list(filter(lambda x:x != '\n',tr_tag.contents))
        print('ip: ' + td_list[1].string + ':' + td_list[2].string)

這里在請(qǐng)求數(shù)據(jù)的是時(shí)候,因?yàn)槲鞔逃蟹琅捞幚?。我們不能直接?qǐng)求。需要模擬客戶端,填寫一個(gè)header

最后

如果想要自動(dòng)翻頁爬取的話,已西刺為例。只要在爬取一頁完成,自動(dòng)切換下一頁就好

import requests
from bs4 import BeautifulSoup

for page in range(1,10):
    res = requests.get('http://www.xicidaili.com/%d'%page,headers = { 'User-Agent': 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.20 (KHTML, like Gecko) Chrome/11.0.672.2 Safari/534.20' })
    soup = BeautifulSoup(res.content,'lxml')
    table_tag = soup.find('table')
    tr_list = table_tag.find_all('tr')
    
    for index,tr_tag in enumerate(tr_list):
        if index > 1:
            td_list = list(filter(lambda x:x != '\n',tr_tag.contents))
            print('ip: ' + td_list[1].string + ':' + td_list[2].string)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • Beautiful Soup是一個(gè)可以從HTML或XML文件中提取數(shù)據(jù)的Python庫.它能夠通過你喜歡的轉(zhuǎn)換器實(shí)...
    LitOrange閱讀 5,407評(píng)論 0 4
  • 關(guān)于bs4,官方文檔的介紹已經(jīng)非常詳細(xì)了,傳送:Beautifulsoup 4官方文檔,這里我把它組織成自己已經(jīng)消...
    徐薇薇閱讀 5,916評(píng)論 0 1
  • 爬蟲框架 BeautifulSoup 功能BeautifulSoup是用來從HTML或XML中提取數(shù)據(jù)的Pytho...
    summer_lz閱讀 616評(píng)論 0 0
  • 今晚,被煩死了。9點(diǎn)多才下班,就想回來看書學(xué)習(xí),結(jié)果被嘮叨嘮叨個(gè)小時(shí),我不斷喊不要和我聊天了,還反復(fù)說。我只想安安...
    阿爾卑斯山上的小灰兔閱讀 1,694評(píng)論 0 1
  • 很久沒有想這樣心不在焉了,對(duì)外界失去興趣~ 成長(zhǎng)的時(shí)候來了,厲害的自己能很快走出迷茫的,對(duì)吧 人已經(jīng)很平靜了,平靜...
    阿立立哥閱讀 211評(píng)論 0 0

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