實踐操作Beautiful soup庫

Beautiful Soup 的簡介

Beautiful Soup是一個Python庫,用於從HTML和XML文件中提取數據。它與您最喜歡的解析器一起使用,提供了導航,搜索和修改解析樹的慣用方式。通常可以節省程序員數小時或數天的工作時間。這些說明通過示例說明了Beautiful Soup 4的所有主要功能。我將向您展示該庫有什麼用處,它的工作原理,如何使用它,如何使它做您想要的事情以及在違反您的期望時該怎麼做。【更多詳情】
在這裏插入圖片描述

Beautiful Soup 的下載

pip install bs4 -i http://pypi.tuna.tsinghua.edu.cn/simple
# 使用清華鏡像下載速度更快,之後要安裝的庫都可這樣下載安裝

Beautiful Soup 的實際操作

需要準備的模塊

bs4(需安裝), requests(需安裝), pprint(無需安裝), lxml(需安裝)

# 按裝一個requests庫
pip install requests -i http://pypi.tuna.tsinghua.edu.cn/simple
# 安裝一個解析器lxml
pip install lxml -i http://pypi.tuna.tsinghua.edu.cn/simple
## pprint 庫 是爲了美化數據,看數據時更舒服些

準備爬取的網站

白蘇文學網https://www.baisu.com一個界面很乾淨的網站,非常好用來做各種實驗。
在這裏插入圖片描述
在這裏插入圖片描述

PS(查看源碼時,可以看出這個網站建立者很想拉廣告。。)
在這裏插入圖片描述

完整代碼

import requests
import pprint
from bs4 import BeautifulSoup
headers={'User-Agent':
             'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
             'Chrome/74.0.3729.169 Safari/537.36'}

def GetText(url):
    try:
        r = requests.get(url, headers=headers)
        r.encoding = r.apparent_encoding
        r.raise_for_status()
        print("響應狀態碼:", r.status_code)
        return r.text
    except:
        print("無法訪問")
        return ''

def GetUrl(text, count, url_dict):
    soup = BeautifulSoup(text, 'lxml')
    for link in soup.find_all('h4'):
        # print(link)
        # print(link.a.get('href'))
        # print(link.a.string)
        # print("*" * 30)
        values = {
            count: {
                '主題': link.a.string,
                '網址': 'https://www.baisu.com/' + link.a.get('href'),
                '摘要': '',
                '文章': ''
            }
        }
        url_dict.update(values)
        count += 1
    return count, url_dict

def Get_ans(url_dict, Text, count):
    soup = BeautifulSoup(Text, 'lxml')
    st1 = soup.find(attrs= 'content_l_abs')
    # print(soup.find(attrs= 'content_l_abs').text)
    st = ''
    for str in soup.find_all('p'):
        # print(str.text)
        st += str.text
    url_dict[count]['摘要'] = st1.text
    url_dict[count]['文章'] = st
    # print("*"* 50)

def main():
    li = ['jingxuan.html', 'daquan.html', 'rizhi.html', 'xinshang.html']
    count = 1
    url_dict = dict()
    # 用字典存放數據
    for title in li:
        url = 'https://www.baisu.com/'+title
        text = GetText(url)
        count, url_dict = GetUrl(text, count, url_dict)

    cnt = 1
    flag = 1
    while flag:
        try:
            Url = url_dict[cnt]['網址']
            Text = GetText(Url)
            Get_ans(url_dict, Text, cnt)
            cnt += 1
        except:
            flag = 0
    pprint.pprint(url_dict)

if __name__ == '__main__':
    main()

爬取完之後,可以發現其實不用像我寫的那麼複雜,這個網站結構實在太簡單了。
在這裏插入圖片描述
在這裏插入圖片描述

這個網站總共才24篇文章。
稍微修改一下就能減少很多工作量。

for page in range(1,25):
    url = 'https://www.baisu.com/Detail_Pages_{0}.html'.format(page)

這樣就能較少很多工作量。
有興趣的小夥伴可以自己再修改一下我的代碼。嘻嘻嘻!我就不寫了。

小總結

我們在學習的過程中,不要一味地埋頭苦幹,能“偷懶”的儘量“偷懶”。有規律可循的就利用其規律。尤其是在爬蟲方面,找到源碼的規律後,爬取數據自然就不會很難了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章