在B站爬取坤坤的视频,并获取视频基本信息

打印 上一主题 下一主题

主题 916|帖子 916|积分 2748

在B站有许多坤坤的视频,作为一名ikun,让我们写个爬虫研究一下视频的视频的名字、链接、观看次数、弹幕、发布时间以及作者。我们用selenium来实现这个爬虫,由于要获取的数据比较多,我们写几个函数来实现这个爬虫。
先倒入需要用到的库,包括selenium, time ,BeautifulSoup ,ChromeDriverManager。
打开及搜索函数:在这段代码中,我们导入了 `webdriver` 和 `ChromeDriverManager` 模块,以便使用 ChromeDriver 控制 Chrome 浏览器,以及自动下载和安装最新版本的 ChromeDriver。同时,我们还导入了 `time` 模块,以便在代码中添加延迟,以便页面加载完成。最后,我们还导入了 `BeautifulSoup` 模块,以便从网页中提取信息。
  1.     from selenium import webdriver
  2.     from webdriver_manager.chrome import ChromeDriverManager
  3.     import time
  4.     from bs4 import BeautifulSoup
复制代码
先创建一个 ChromeDriver 实例,打开B站,在这里我们使用ChromeDriverManager().install()方法,他可以自动下载对应版本的chrome,防止因为Chrome版本不正确而报错。(PS:直接用webdriver.Chrome()会使用已下载Chrome游览器,他的版本可能与webdriver需要的版本不匹配这样打开chrome的时候会出现闪退报错)
  1.     url="哔哩哔哩 (゜-゜)つロ 干杯~-<a  href="https://www.zhihu.com/search?q=bilibili&search_source=Entity&hybrid_search_source=Entity&hybrid_search_extra=%7B%22sourceType%22%3A%22answer%22%2C%22sourceId%22%3A3060126417%7D" target="_blank" data-za-not-track-link="true" rel="noopener">bilibili</a>"
  2.     browser = webdriver.Chrome(ChromeDriverManager().install()) #创建一个 ChromeDriver 实例
  3.     browser.set_window_size(1400, 900) #设定页面大小
  4.     browser.get(url) #访问B站
复制代码
我们可以用xpath方法来获取目标操作的位置,chrome浏览器能够自动提取xpath链接。我们使用 `browser.window_handles` 方法获取当前窗口中的所有句柄,并切换到第二个窗口,以便获取搜索结果页面。
在打开B站首页的时候,会出现一个提示登陆的页面干扰我们,因此我们最好点击一下首页,刷新一下。
  1.     first_page = browser.<a  href="https://www.zhihu.com/search?q=find_element_by_xpath&search_source=Entity&hybrid_search_source=Entity&hybrid_search_extra=%7B%22sourceType%22%3A%22answer%22%2C%22sourceId%22%3A3060126417%7D" target="_blank" data-za-not-track-link="true" rel="noopener">find_element_by_xpath</a>("//*[@id='i_cecream']/div[2]/div[1]/div[1]/ul[1]/li[1]/a/span") #取得首页按钮的的位置
  2.     first_page.click() #点击首页进行刷新
复制代码
然后,我们模拟用户在网站上搜索蔡徐坤篮球相关的视频;点击搜索栏,输入"蔡徐坤 篮球",并进行搜索;最后定位到新页面。
  1.     input = browser.find_element_by_xpath("//*[@id='nav-searchform']/div[1]/input") #取得搜索栏的位置
  2.     input.send_keys('蔡徐坤 篮球') #输入内容
  3.     submit = browser.find_element_by_xpath("//*[@id='nav-searchform']/div[2]") #取得搜索按钮的位置  
  4.     submit.click() #点击搜索
  5.     all_h = browser.window_handles #取得新页面的代码
  6.     browser.switch_to.window(all_h[1]) #取得新页面的代码
复制代码
打开及搜索函数的完整代码:
  1. def search(url="哔哩哔哩 (゜-゜)つロ 干杯~-bilibili"):
  2.     try:
  3.         browser = webdriver.Chrome(ChromeDriverManager().install())
  4.         browser.set_window_size(1400, 900)
  5.         browser.get(url)
  6.         first_page = browser.find_element_by_xpath("//*[@id='i_cecream']/div[2]/div[1]/div[1]/ul[1]/li[1]/a/span")
  7.         first_page.click()
  8.         input = browser.find_element_by_xpath("//*[@id='nav-searchform']/div[1]/input")
  9.         input.send_keys('蔡徐坤 篮球')
  10.         submit = browser.find_element_by_xpath("//*[@id='nav-searchform']/div[2]")
  11.         submit.click()
  12.         all_h = browser.window_handles
  13.         browser.switch_to.window(all_h[1])
  14.         return browser
  15.     except TimeoutError:
  16.         return search(url)
复制代码
翻页函数:该函数使用 `find_element_by_xpath` 方法查找“下一页”按钮,并使用 `click` 方法单击该按钮。在单击“下一页”按钮之后,该函数使用 `browser.window_handles` 方法获取所有窗口句柄,并使用`browser.switch_to.window` 方法将焦点切换到搜索结果页面,以便我们可以继续提取视频信息,最后返回页面代码信息。如果没有找到“下一页”按钮,该函数会递归调用自身来查找“下一页”按钮,直到找到为止。
这里有一点需要注意,在取得下一页按钮的时候,最好利用“下一页”的文本进行匹配,如果根据浏览器提供的位置信息匹配,在某些页面下会出现位置不匹配而导致程序异常。
  1. `next = browser.find_element_by_xpath("//button[text()='下一页']")
复制代码
这段代码较为简单,直接给出完整代码。
  1.     def next_page(browser): #获取下一页
  2.       try:
  3.           next = browser.find_element_by_xpath("//button[text()='下一页']") #下一页按钮
  4.           next.click() #点击按钮
  5.           time.sleep(1) #听一秒等待刷新
  6.           all_h1 = browser.window_handles #取得新页面的代码
  7.           browser.switch_to.window(all_h1[1]) #取得新页面的代码
  8.           return browser
  9.       except:
  10.           next_page(browser)
复制代码
在这个函数中,我们首先使用 `browser.page_source` 方法获取当前页面的 HTML 代码,然后使用 `BeautifulSoup` 类解析 HTML 代码,以提取视频信息。接着,我们使用 `xlwt` 库将视频信息写入到 Excel 文件中。
我们还需要一个函数来提取页面信息,
先用BeautifulSoup解析页面,用find方法找到\标签,这里包含我们需要的所有视频,然后用find\_all方法找到每个视频的标签\,同时find\_all会帮助我们形成一个列表存储数据,也就是我用到的videos
  1.     html = browser.page_source
  2.     soup = BeautifulSoup(html, "lxml")
  3.     videos = soup.find(class_='video-list').find_all(class_='bili-video-card')
复制代码
遍历视频信息列表,提取信息(视频的名字、链接、观看次数、弹幕、发布时间以及作者),这里建议多尝试,多打印几次确保信息准确:
  1.             for item in videos:
  2.                 item_readers = item.find("span", class_="<a  href="https://www.zhihu.com/search?q=bili-video-card__stats--item&search_source=Entity&hybrid_search_source=Entity&hybrid_search_extra=%7B%22sourceType%22%3A%22answer%22%2C%22sourceId%22%3A3060126417%7D" target="_blank" data-za-not-track-link="true" rel="noopener">bili-video-card__stats--item</a>").span.string
  3.                 item_danmu = item.find_all("span", class_="bili-video-card__stats--item")[1].span.string
  4.                 item_time = item.find("span", class_="bili-video-card__stats__duration").string
  5.                 item_title = item.find("h3").get("title")
  6.                 item_author = item.find("span", class_="<a  href="https://www.zhihu.com/search?q=bili-video-card__info--author&search_source=Entity&hybrid_search_source=Entity&hybrid_search_extra=%7B%22sourceType%22%3A%22answer%22%2C%22sourceId%22%3A3060126417%7D" target="_blank" data-za-not-track-link="true" rel="noopener">bili-video-card__info--author</a>").string
  7.                 <a  href="https://www.zhihu.com/search?q=item_link&search_source=Entity&hybrid_search_source=Entity&hybrid_search_extra=%7B%22sourceType%22%3A%22answer%22%2C%22sourceId%22%3A3060126417%7D" target="_blank" data-za-not-track-link="true" rel="noopener">item_link</a> = item.find("a").get("href")[2:]
  8.                 print(item_title)
复制代码
最后一步是储存信息:
  1. sheet.write(n, 0, n)
  2. sheet.write(n, 1, item_title)
  3. sheet.write(n, 2, item_link)
  4. sheet.write(n, 3, item_readers)
  5. sheet.write(n, 4, item_danmu)
  6. sheet.write(n, 5, item_time)
  7. sheet.write(n, 6, item_author)
复制代码
获取信息和储存函数的完整代码:
  1.     def save_to_excel(browser,sheet,n,wb):
  2.         try:
  3.             html = browser.page_source
  4.             soup = BeautifulSoup(html, "lxml")
  5.             videos = soup.find(class_='video-list').find_all(class_='bili-video-card')
  6.             for item in videos:
  7.                 item_readers = item.find("span", class_="bili-video-card__stats--item").span.string
  8.                 item_danmu = item.find_all("span", class_="bili-video-card__stats--item")[1].span.string
  9.                 item_time = item.find("span", class_="<a  href="https://www.zhihu.com/search?q=bili-video-card__stats__duration&search_source=Entity&hybrid_search_source=Entity&hybrid_search_extra=%7B%22sourceType%22%3A%22answer%22%2C%22sourceId%22%3A3060126417%7D" target="_blank" data-za-not-track-link="true" rel="noopener">bili-video-card__stats__duration</a>").string
  10.                 item_title = item.find("h3").get("title")
  11.                 item_author = item.find("span", class_="bili-video-card__info--author").string
  12.                 item_link = item.find("a").get("href")[2:]
  13.                 print(item_title)
  14.                 sheet.write(n, 0, n)
  15.                 sheet.write(n, 1, item_title)
  16.                 sheet.write(n, 2, item_link)
  17.                 sheet.write(n, 3, item_readers)
  18.                 sheet.write(n, 4, item_danmu)
  19.                 sheet.write(n, 5, item_time)
  20.                 sheet.write(n, 6, item_author)
  21.                 n += 1
  22.             wb.save("cxk1.xls")
  23.             print(n)
  24.             return n
  25.         except TimeoutError:
  26.             save_to_excel(browser,sheet,n,wb) #存储函数
复制代码
最后写一个主程序调用三个函数,在主程序中,我们要记得先设置一下存储数据用到的EXCEL;
  1. import xlwt
  2. #设置excel
  3. wb = xlwt.Workbook(encoding="utf-8",style_compression=0)
  4. sheet = wb.add_sheet("b站爬去",cell_overwrite_ok=True)
  5. sheet.write(0,0,"序号")
  6. sheet.write(0,1,"名称")
  7. sheet.write(0,2,"链接")
  8. sheet.write(0,3,"观看次数")
  9. sheet.write(0,4,"弹幕")
  10. sheet.write(0,5,"时间")
  11. sheet.write(0,6,"作者")
复制代码
主程序完整代码
在调用主程序时,当我们进入收索信息的第一页时,可以先爬取第一信息,然后利用一个for循环取得其他页面信息。
  1. #设置excel
  2. wb = xlwt.Workbook(encoding="utf-8",style_compression=0)
  3. sheet = wb.add_sheet("b站爬去",cell_overwrite_ok=True)
  4. sheet.write(0,0,"序号")
  5. sheet.write(0,1,"名称")
  6. sheet.write(0,2,"链接")
  7. sheet.write(0,3,"观看次数")
  8. sheet.write(0,4,"弹幕")
  9. sheet.write(0,5,"时间")
  10. sheet.write(0,6,"作者")
  11. n = 1
  12. browser = search("哔哩哔哩 (゜-゜)つロ 干杯~-bilibili") #进入B站,并完成搜索
  13. all_h = browser.window_handles
  14. browser.switch_to.window(all_h[1]) #获取页面代码
  15. total = browser.find_element_by_xpath("//*[@id='i_cecream']/div/div[2]/div[2]/div/div/div/div[2]/div/div/button[9]").text #获取总页数,给for循环做准备
  16. # n = save_to_excel(browser,sheet,n,wb) #调用函数存储页面数据
  17. # browser = next_page(browser) #翻页
  18. for i in range(1,int(total)+1):
  19.     time.sleep(3) #等待加载
  20.     n = save_to_excel(browser,sheet,n,wb)  # 调用函数存储页面数据
  21.     browser = next_page(browser)  # 翻页
复制代码
完整代码地址:github.com/zhangaynami…

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

惊雷无声

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表