百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

python爬虫练习selenium+BeautifulSoup,爬b站搜索内容保存excel

off999 2024-12-01 02:18 30 浏览 0 评论

一、简介

前面文章已经介绍了selenium库使用,及浏览器提取信息相关方法。参考:python爬虫之selenium库

现在目标要求,用爬虫通过浏览器,搜索关键词,将搜索到的视频信息存储在excel表中。

二、创建excel表格,以及chrome驱动

n = 1
word = input('请输入要搜索的关键词:')
driver = webdriver.Chrome()
wait = WebDriverWait(driver,10)

excl = xlwt.Workbook(encoding='utf-8', style_compression=0)

sheet = excl.add_sheet('b站视频:'+word, cell_overwrite_ok=True)
sheet.write(0, 0, '名称')
sheet.write(0, 1, 'up主')
sheet.write(0, 2, '播放量')
sheet.write(0, 3, '视频时长')
sheet.write(0, 4, '链接')
sheet.write(0, 5, '发布时间')

三、创建定义搜索函数

里面有button_next 为跳转下一页的功能,之所有不用By.CLASS_NAME定位。看html代码可知

<button class="vui_button vui_pagenation--btn vui_pagenation--btn-side">下一页</button>

class名称很长,而且有空格,如果selenium用By.CLASS_NAME定位,有空格会报错:selenium.common.exceptions.NoSuchElementException: Message: no such element

所以这里用By.CSS_SELECTOR方法定位。

def search():
    driver.get("https://www.bilibili.com/")
    input = wait.until(EC.presence_of_element_located((By.CLASS_NAME, 'nav-search-input')))
    button = wait.until(EC.element_to_be_clickable((By.CLASS_NAME, 'nav-search-btn')))

    input.send_keys(word)
    button.click()
    print('开始搜索:'+word)
    windows = driver.window_handles
    driver.switch_to.window(windows[-1])
    get_source()
    #第1页跳转第2页
    button_next = driver.find_element(By.CSS_SELECTOR,'#i_cecream > div > div:nth-child(2) > div.search-content > div > div > div.flex_center.mt_x50.mb_x50 > div > div > button:nth-child(11)')
    wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '#i_cecream > div > div:nth-child(2) > div.search-content > div > div > div.video-list.row > div:nth-child(1) > div > div.bili-video-card__wrap.__scale-wrap')))
    button_next.click()
    get_source()

四、定义跳转下一页函数

这里有调转下一页函数,那为什么在上面搜索函数也有下一页功能,因为分析代码。

#第2页的CSS_SELECTOR路径
#i_cecream > div > div:nth-child(2) > div.search-content > div > div > div.flex_center.mt_x50.mb_x50 > div > div > button:nth-child(11)

#后面页面的CSS_SELECTOR路径
#i_cecream > div > div:nth-child(2) > div.search-content > div > div > div.flex_center.mt_x50.mb_lg > div > div > button:nth-child(11)

第1页的CSS_SELECTOR和后面的页面的CSS_SELECTOR的不一样,所以把第1页跳第2页单独加在了上面搜索函数中。

def next_page():
    button_next = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#i_cecream > div > div:nth-child(2) > div.search-content > div > div > div.flex_center.mt_x50.mb_lg > div > div > button:nth-child(11)')))
    button_next.click()
    wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '#i_cecream > div > div:nth-child(2) > div.search-content > div > div > div.video-list.row > div:nth-child(1) > div > div.bili-video-card__wrap.__scale-wrap')))
    get_source()

五、定义获取页面代码函数

上面定义的函数都有get_source()函数,这个函数就是现在需要创建的,用途获取页面代码,传入BeautifulSoup

def get_source():
    html = driver.page_source
    soup = BeautifulSoup(html, 'lxml')
    save_excl(soup)

六、获取元素并存到excel表

通过BeautifulSoup循环获取页面信息,并存到创建好的excel表中。

def save_excl(soup):
    list = soup.find(class_='video-list row').find_all(class_="bili-video-card")
    for item in list:
        # print(item)
        video_name = item.find(class_='bili-video-card__info--tit').text
        video_up = item.find(class_='bili-video-card__info--author').string
        video_date = item.find(class_='bili-video-card__info--date').string
        video_play = item.find(class_='bili-video-card__stats--item').text
        video_times = item.find(class_='bili-video-card__stats__duration').string
        video_link = item.find('a')['href'].replace('//', 'https://')
        print(video_name, video_up, video_play, video_times, video_link, video_date)

        global n

        sheet.write(n, 0, video_name)
        sheet.write(n, 1, video_up)
        sheet.write(n, 2, video_play)
        sheet.write(n, 3, video_times)
        sheet.write(n, 4, video_link)
        sheet.write(n, 5, video_date)

        n = n +1

七、定义main函数,循环获取跳转每一页

这里默认是10页的数据,后面就不获取了,可以自行调整页面数。最后保存表名。

def main():
    search()
    for i in range(1,10):
        next_page()
        i = i + 1
    driver.close()
if __name__ == '__main__':
    main()
    excl.save('b站'+word+'视频.xls')

八、最终代码执行效果

这里CSS_SELECTOR路径,我这里尽量的在最底层,所以比较长,因为短路径,经常性等待时间不够长,没有加载所有页面,提取不到信息而报错。

from selenium import webdriver
from selenium.webdriver.common.by import By
from bs4 import BeautifulSoup
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import xlwt
import time

n = 1
word = input('请输入要搜索的关键词:')
driver = webdriver.Chrome()
wait = WebDriverWait(driver,10)

excl = xlwt.Workbook(encoding='utf-8', style_compression=0)

sheet = excl.add_sheet('b站视频:'+word, cell_overwrite_ok=True)
sheet.write(0, 0, '名称')
sheet.write(0, 1, 'up主')
sheet.write(0, 2, '播放量')
sheet.write(0, 3, '视频时长')
sheet.write(0, 4, '链接')
sheet.write(0, 5, '发布时间')

def search():
    driver.get("https://www.bilibili.com/")
    input = wait.until(EC.presence_of_element_located((By.CLASS_NAME, 'nav-search-input')))
    button = wait.until(EC.element_to_be_clickable((By.CLASS_NAME, 'nav-search-btn')))

    input.send_keys(word)
    button.click()
    print('开始搜索:'+word)
    windows = driver.window_handles
    driver.switch_to.window(windows[-1])
    wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,
                                               '#i_cecream > div > div:nth-child(2) > div.search-content > div > div > div.video.i_wrapper.search-all-list')))
    get_source()
    print('开始下一页:')
    button_next = driver.find_element(By.CSS_SELECTOR,
                                      '#i_cecream > div > div:nth-child(2) > div.search-content > div > div > div.flex_center.mt_x50.mb_x50 > div > div > button:nth-child(11)')
    button_next.click()
    #time.sleep(2)
    wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '#i_cecream > div > div:nth-child(2) > div.search-content > div > div > div.video-list.row > div:nth-child(1) > div > div.bili-video-card__wrap.__scale-wrap > div > div > a > h3')))
    get_source()
    print("完成")

def next_page():
    button_next = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,
                                      '#i_cecream > div > div:nth-child(2) > div.search-content > div > div > div.flex_center.mt_x50.mb_lg > div > div > button:nth-child(11)')))
    button_next.click()
    print("开始下一页")
    #time.sleep(5)
    wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,
                                               '#i_cecream > div > div:nth-child(2) > div.search-content > div > div > div.video-list.row > div:nth-child(1) > div > div.bili-video-card__wrap.__scale-wrap > div > div > a > h3')))
    get_source()
    print("完成")
    
def save_excl(soup):
    list = soup.find(class_='video-list row').find_all(class_="bili-video-card")
    for item in list:
        # print(item)
        video_name = item.find(class_='bili-video-card__info--tit').text
        video_up = item.find(class_='bili-video-card__info--author').string
        video_date = item.find(class_='bili-video-card__info--date').string
        video_play = item.find(class_='bili-video-card__stats--item').text
        video_times = item.find(class_='bili-video-card__stats__duration').string
        video_link = item.find('a')['href'].replace('//', 'https://')
        print(video_name, video_up, video_play, video_times, video_link, video_date)

        global n

        sheet.write(n, 0, video_name)
        sheet.write(n, 1, video_up)
        sheet.write(n, 2, video_play)
        sheet.write(n, 3, video_times)
        sheet.write(n, 4, video_link)
        sheet.write(n, 5, video_date)

        n = n +1
        
def get_source():
    html = driver.page_source
    soup = BeautifulSoup(html, 'lxml')
    save_excl(soup)
    
def main():
    search()
    for i in range(1,10):
        next_page()
        i = i + 1
    driver.close()
    
if __name__ == '__main__':
    main()
    excl.save('b站'+word+'视频.xls')

执行输入MV执行结果:

在文件夹也生成了excel文件表

打开,信息保存完成

同理,输入其他关键词,也可以。

以上,简单爬取搜索信息就完成了,如果要在服务器上隐藏运行,参考我上篇文章:python爬虫之selenium库

相关推荐

小白一键装机u盘详细教程(小白一键重装系统u盘装机教程)
  • 小白一键装机u盘详细教程(小白一键重装系统u盘装机教程)
  • 小白一键装机u盘详细教程(小白一键重装系统u盘装机教程)
  • 小白一键装机u盘详细教程(小白一键重装系统u盘装机教程)
  • 小白一键装机u盘详细教程(小白一键重装系统u盘装机教程)
win10电脑经常蓝屏是什么原因

动不动就蓝屏,那说明整个系统是有问题的。建议重新安装一下,或者是装一个Win7试一下。老是蓝屏的话,直接影响到办公,生活,娱乐的感觉体验。并且系统不稳定,保存的文件随时都可能面临的崩溃,丢失的风险。...

360游戏个人中心(360游戏个人中心官网)

360游戏中心的实名认证信息一经注册或补充就是永久有效的,?不可以随意进行修改。360游戏中心认证具体流程:①打开电脑中的浏览器,然后登录到360网站,接着登录自己的360账号。②然后在【个人中心】中...

360极速浏览器使用方法(360极速浏览器使用技巧)

以下是设置360浏览器极速版的步骤:1.打开360浏览器极速版,在右上角的“设置”按钮下,选择“选项”或者直接按快捷键“Alt+F”。2.在“常规”选项卡下,可以设置浏览器的默认搜索引擎、启动...

联想电脑设置u盘启动的步骤(联想电脑设置成u盘启动)

联想电脑设置U盘启动两种方法方法一:通过启动快捷键1、如果是UEFI启动盘,可以通过启动快捷键选择U盘启动,首先插入UEFIU盘启动盘,然后启动过程中按下F12或Fn+F12组合键。2、这时候会弹出...

电脑桌面图标不见了怎么设置

方法一:1、首先按下快捷键“ctrl+shift+esc”打开任务管理器。2、然后点击左上角的文件,选择“运行新任务”。3、输入“explorer.exe”点击确定等待重启即可。方法二:1...

惠普暗影精灵7(惠普暗影精灵7配置)

惠普暗影精灵7的开机步骤如下:1.确保电源已连接并正常工作。将电源适配器插入电源插座,并连接到电脑上。2.打开电脑上的盖子。通常情况下,你需要打开盖子才能看到电源按钮。3.查找电源按钮。在大多数...

笔记本电脑开不了机怎么办如何解决

1、如果笔记本无法开机首先尝试调亮电脑屏幕亮度。2、开机按F2键,进入BIOS界面查看是否正常显示。3、外接显示器,按组合键切换显示。4、移除所有外接装置,取出加装的内存或其它硬件后再开机确认。如果以...

如何禁止电脑自动更新(怎么禁止电脑自动更新)

建议将自动更新关闭,用软件更新,自己的时间自己做主。下载超级兔子,让她帮助你下载补丁。你选择快速检测后,按安装按钮,她会自动帮助你下载安装,并且不需要重启。到目前为止,使用超级兔子打补丁全部成功(对于...

动态桌面软件下载(动态桌面主题下载)
  • 动态桌面软件下载(动态桌面主题下载)
  • 动态桌面软件下载(动态桌面主题下载)
  • 动态桌面软件下载(动态桌面主题下载)
  • 动态桌面软件下载(动态桌面主题下载)
如何重装系统win7视频教程(如何重装系统win7具体步骤)

不需要重装知识点延伸,更换CPU-BIOS设置1)未更改过bios设置,确认主板支持cpu型号直接插上即可,bios会自适应2)之前更改过bios设置,在更换cpu之前应需要将bios恢复出厂...

惠普售后维修官网电话(惠普官网维修中心电话)

要找到惠普的售后服务,你可以通过以下几种方式进行联系。首先,你可以访问惠普的官方网站,在网站上找到售后服务的相关信息,包括联系电话和在线支持。其次,你可以拨打惠普的客户服务热线,向客服人员咨询并安排售...

笔记本迈克菲怎么卸载(笔记本迈克菲怎么卸载不了)

戴尔笔记本电脑上的迈克菲中心可以卸载,迈克菲中心为一款杀毒软件,如果自身笔记本电脑不需要可以进行卸载。迈克菲中心卸载步骤:1、打开桌面“此电脑”。2、在“此电脑”界面中点击选择“卸载或更改程序”。3、...

windows10怎么进入修复模式(win10如何进入修复系统)

1、 进入WindowsRE恢复模式。非正常启动三次,可进入WindowsRE恢复模式。具体操作方法如下:按住电源按钮10秒钟以关闭设备。再次按电源按钮以打开设备。看到Windo...

现在哪个浏览器好用(现在哪种浏览器好用)

一、谷歌浏览器谷歌浏览器是公认最好用的,这个可以从市场占有率看出端倪,超过三分之二的用户使用谷歌浏览器。Chrome浏览器以简洁快速著称,不管是普通用户还是开发人员,chrome浏览器都是首选。Chr...

取消回复欢迎 发表评论: