首先要了解html標簽,標簽有主有次,大致了解以一下,主標簽是根標簽,也是所有要爬取的標簽的結合體

先了解一下待會要使用代碼屬性
#獲取屬性
a.attrs 獲取a所有的屬性和屬性值,回傳一個字典
a.attrs['href'] 獲取href屬性
a['href'] 也可簡寫為這種形式
#獲取內容
a.string 獲取a標簽的直系文本
注意:如果標簽還有標簽,那么string獲取到的結果為None,而其它兩個,可以獲取文本內容
a.text 這是屬性,獲取a子類的所有文本
a.get_text() 這是方法,獲取a標簽子類的所有文本
#find 主要用于找到第一個符合要求的標簽
a.find('a') 找到第一個符合要求的
a.find('a', title="xxx") 具有title=a屬性的
a.find('a', alt="xxx")
a.find('a', class_="xxx")
a.find('a', id="xxx")
#find_all 用于找到所有符合要求的標簽
a.find_all('a')
a.find_all(['a','b']) 找到所有的a和b標簽
a.find_all('a', limit=2) 限制前兩個
#根據選擇器選擇指定的內容
a.select('#feng')
我們今天要爬取的是bilibili網站,主要是作為一個練習,也沒有太主要的作用,爬取的內容分別是
排名、視頻名、視頻集數、播放量、點贊量及視頻鏈接,爬取完后要存盤到csv檔案內

直接上代碼
# -*- coding: utf-8 -*-
import requests
from bs4 import BeautifulSoup
r = requests.get('https://www.bilibili.com/v/popular/rank/guochan') #要爬取的網站鏈接
html = r.content
soup = BeautifulSoup(html,'html.parser') #html.parser是決議器
div_people_list = soup.find('div', attrs={'class': 'rank-list-wrap'})
div_people_list_list = div_people_list.find('ul', attrs={'class': 'rank-list pgc-list'})
a_s = div_people_list.find_all('li', attrs={'class': 'rank-item'})
for a in a_s: #排名
for b in a.find_all('div', attrs={'class': 'info'}):
for c in b.find_all('a', attrs={'target': '_blank'}): #名稱及鏈接
for d in b.find('span', attrs={'class': 'data-box'}): #獲取視頻集
for e in b.find_all('span', attrs={'class': 'data-box'})[1:][:1]: #回圈播放數
for f in b.find_all('span', attrs={'class': 'data-box'})[2:][:2]: # 回圈點贊量
web = a['data-rank'] # 排名
name = c.string # 名稱
name_2 = d.string # 全集
name_2_1 = name_2.replace(" ", "").replace("\t", "").strip() # 去除多余空格
name_3 = e.get_text() # 播放量
data_1 = name_3.replace(" ", "").replace("\n", "").replace("\t", "")
name_4 = f.get_text() # 點贊量
data_2 = name_4.replace(" ", "").replace("\n", "").replace("\t", "")
url = c['href'] # 鏈接
print(web + '\t' + name + '\t\t\t' + name_2_1 + '\t\t\t\t' + data_1 + '\t\t\t\t'+ data_2+'\t\t\t\t' + f'http:{url}')
效果如下:
其實我在做一個爬蟲的時候遇到很多的錯誤,就是html里的標簽重復,需要使用[1:][:1]來選擇標簽,有的時候不是難,就是專案做的少

我們現在來加上這個代碼,把爬取的內容保存下來
import csv
f = open('爬取檔案.csv','w',encoding='gbk',newline='') #寫入檔案
#基于檔案物件構建 csv寫入物件
csv_writer = csv.writer(f)
csv_writer.writerow(['排行','影片', '篇集','播放量','點贊量','視頻鏈接'])
csv_writer.writerow([web, name, n,d,g,f'http:{url}'])
可以看到內容都存盤到了csv檔案內了,不是很亂,和剛剛dos視窗里的相比好了很多

完整代碼如下:
# -*- coding: utf-8 -*-
import requests
from bs4 import BeautifulSoup
import csv
f = open('爬取檔案.csv','w',encoding='gbk',newline='') #寫入檔案
#基于檔案物件構建 csv寫入物件
csv_writer = csv.writer(f)
csv_writer.writerow(['排行','影片', '篇集','播放量','點贊量','視頻鏈接'])
r = requests.get('https://www.bilibili.com/v/popular/rank/guochan') #要爬取的網站鏈接
html = r.content
soup = BeautifulSoup(html,'html.parser') #html.parser是決議器
div_people_list = soup.find('div', attrs={'class': 'rank-list-wrap'})
div_people_list_list = div_people_list.find('ul', attrs={'class': 'rank-list pgc-list'})
a_s = div_people_list.find_all('li', attrs={'class': 'rank-item'})
#a_s_2 = a_s.find_all('div', attrs={'class': 'info'})
for a in a_s: #排名
for b in a.find_all('div', attrs={'class': 'info'}):
for c in b.find_all('a', attrs={'target': '_blank'}): #名稱及鏈接
for d in b.find('span', attrs={'class': 'data-box'}): #獲取視頻集
for e in b.find_all('span', attrs={'class': 'data-box'})[1:][:1]: #回圈播放數
for f in b.find_all('span', attrs={'class': 'data-box'})[2:][:2]: # 回圈點贊量
web = a['data-rank'] # 排名
name = c.string # 名稱
name_2 = d.string # 全集
name_2_1 = name_2.replace(" ", "").replace("\t", "").strip() # 去除多余空格
name_3 = e.get_text() # 播放量
data_1 = name_3.replace(" ", "").replace("\n", "").replace("\t", "")
name_4 = f.get_text() # 點贊量
data_2 = name_4.replace(" ", "").replace("\n", "").replace("\t", "")
url = c['href'] # 鏈接
n = name_2.replace(" ", "").replace("\t", "").strip() # 去除多余空格
d = name_3.replace(" ", "").replace("\t", "")
g = name_4.replace(" ", "").replace("\t", "")
#構建串列頭
csv_writer.writerow([web, name, n,d,g,f'http:{url}'])
喜歡的別忘了關注一下
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/402590.html
標籤:其他
上一篇:西南交通大學計算機圖形學期末復習
