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)
這樣就能較少很多工作量。
有興趣的小夥伴可以自己再修改一下我的代碼。嘻嘻嘻!我就不寫了。
小總結
我們在學習的過程中,不要一味地埋頭苦幹,能“偷懶”的儘量“偷懶”。有規律可循的就利用其規律。尤其是在爬蟲方面,找到源碼的規律後,爬取數據自然就不會很難了。