python爬虫练习seleniumBeautifulSoup,爬b站搜索内容保存excel
一、简介
前面文章已经介绍了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代码可知
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 > p > p:nth-child(2) > p.search-content > p > p > p.flex_center.mt_x50.mb_x50 > p > p > button:nth-child(11)") wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "#i_cecream > p > p:nth-child(2) > p.search-content > p > p > p.video-list.row > p:nth-child(1) > p > p.bili-video-card__wrap.__scale-wrap"))) button_next.click() get_source()四、定义跳转下一页函数
这里有调转下一页函数,那为什么在上面搜索函数也有下一页功能,因为分析代码。#第2页的CSS_SELECTOR路径 #i_cecream > p > p:nth-child(2) > p.search-content > p > p > p.flex_center.mt_x50.mb_x50 > p > p > button:nth-child(11) #后面页面的CSS_SELECTOR路径 #i_cecream > p > p:nth-child(2) > p.search-content > p > p > p.flex_center.mt_x50.mb_lg > p > p > 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 > p > p:nth-child(2) > p.search-content > p > p > p.flex_center.mt_x50.mb_lg > p > p > button:nth-child(11)"))) button_next.click() wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "#i_cecream > p > p:nth-child(2) > p.search-content > p > p > p.video-list.row > p:nth-child(1) > p > p.bili-video-card__wrap.__scale-wrap"))) get_source()五、定义获取页面代码函数
上面定义的函数都有get_source()函数,这个函数就是现在需要创建的,用途获取页面代码,传入BeautifulSoupdef 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 > p > p:nth-child(2) > p.search-content > p > p > p.video.i_wrapper.search-all-list"))) get_source() print("开始下一页:") button_next = driver.find_element(By.CSS_SELECTOR, "#i_cecream > p > p:nth-child(2) > p.search-content > p > p > p.flex_center.mt_x50.mb_x50 > p > p > button:nth-child(11)") button_next.click() #time.sleep(2) wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "#i_cecream > p > p:nth-child(2) > p.search-content > p > p > p.video-list.row > p:nth-child(1) > p > p.bili-video-card__wrap.__scale-wrap > p > p > a > h3"))) get_source() print("完成") def next_page(): button_next = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "#i_cecream > p > p:nth-child(2) > p.search-content > p > p > p.flex_center.mt_x50.mb_lg > p > p > button:nth-child(11)"))) button_next.click() print("开始下一页") #time.sleep(5) wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "#i_cecream > p > p:nth-child(2) > p.search-content > p > p > p.video-list.row > p:nth-child(1) > p > p.bili-video-card__wrap.__scale-wrap > p > p > 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库
IGN9分遗忘之城源于上古卷轴的剧情游戏佳作一次循环,无尽轮回。在光和影的变换间,领略沉淀着数千年人文历史的古典建筑与艺术,探索苏美尔埃及希腊与罗马神话的光辉,感受真实历史中哲学的魅力。一人作恶,众人受难。在死亡的黄金律下,
玩WarfaceGO闪退,网络连接失败怎么办?简单解决办法玩WarfaceGO闪退,网络连接失败怎么办?简单解决办法来自闻名世界的Warface射击游戏宇宙,具备无限动态战斗系统!玩家可以享受多样战斗模式,控制方法简单易学,图像质量出色惊
FAKER完美的小说男主李相赫96年出生于一个普通的单亲家庭,性格内向喜欢玩游戏,11年底开始玩lol,天赋点满S2以2500分成为韩服路人王,13年加入SKTT12队,开始了小说男主一般的职业生涯。职业
骑马与砍杀2俘虏作用介绍骑马与砍杀2俘虏是游戏中玩家在战胜敌人之后可能会获得的单位,很多新手玩家在获得了俘虏之后不知道有什么用,能用来干什么,下面小编就给大家整理了具体的作用介绍,有需要的玩家一起来看看吧
原神挑战者成就原创小金游戏触地小金游戏锄地202210231719发表于四川全什么外壳来着用大剑或岩属性的角色破一个岩史莱姆的盾特斯拉球还流行吗用冰元素破一个雷莹术士的盾谁的节奏天国破任意一个深
光遇欧若拉季毕业了?氪金800左右,被人举报开挂了光遇欧若拉季毕业了?氪金800左右,被人举报开挂了前言大家好,我是喜欢玩游戏聊游戏的孟婆小叔。欧若拉季,真的很过分!需要400季蜡才能毕业,但是官方离谱的是,季节时长只给了74天。
T1水龙魂被翻盘,Deft一箭救主,Faker脸都黑了,北枫意料之中苦瓜原创,翻版必究!苦瓜电竞让你体验不一样的电竞主播圈!S12总决赛如约而至,作为此次世界赛的压轴大戏,DRX和T1的对决,让人期待,两位快十年的老将之间的对决,真的让每一个LOL
看完赛博朋克边缘行者多少人装回了赛博朋克2077?(1)在动画赛博朋克边缘行者播出一周后,Steam上赛博朋克2077的在线人数久违地突破了8万,也是目前Steam在线玩家数前十名里唯一的单机游戏。2077当下的宣传页面也正是边缘行者的
新乡市中医说手脚冰凉可能是这个问题一入冬,不少人都感觉全身发冷,手脚更是冰凉像冰棍样,尤其身材娇小的女性,哪怕是不停地喝热水穿再多的衣服,依然不得缓解,这究竟是为什么呢?中医认为,手脚冰凉主要有两种原因。1。阳气内
补脑别只会吃核桃!这6种食物,才是真正的补脑高手工作学习社交运动无论干啥没有不需要脑力的。社畜们感叹最多的就是哎呀,我这个脑子呀!每天大脑都要高速运转来处理各种事情,真是快被抽干了!有没有什么食物,吃了能补脑呀?嗯还真有!这就跟
慢性肺病患者如何安全过冬?医生坦言4个小妙招,值得学习立冬,是冬季的第一个节气,于每年公历11月78日之间交节。立冬,意味着生气开始闭蓄,万物进入休养收藏状态,气候也由秋季少雨干燥向阴雨寒冻的冬季气候渐变。立冬后,日照时间将继续缩短,
下学而上达孔子生命境界的展开作者梁世和(河北省社会科学院哲学研究所研究员)孔子感叹没有人了解自己,并说不怨天,不尤人。下学而上达。知我者其天乎!(论语宪问)于此提出一个重要命题下学而上达。孔安国注曰下学人事,
广东优秀公益广告推介致敬中国军人视频加载中作品名称致敬中国军人制作单位广东多多影视传媒有限公司作品类别视频类作品时长120秒活动简介2022年度重大主题广播电视公益广告精品征评活动由广东省广播电视局主办,广州市广
人到老年,不管多么有能力,都不要做这两件事前言进入老年状态的生活,我们一定要好好考虑,不要总是人生很复杂,有些事情真的很简单,如果过多的想的话就会导致一些事情的发生,其实在更多的时候真的是很美好的。人到老年,不管多么有能力
把生态高值功能农业打造成乡村特色产业党的二十大报告提出发展乡村特色产业,拓宽农民增收致富渠道。产业振兴是乡村全面振兴的基础和关键。随着我国城乡居民消费水平的提高和消费结构的升级,农业与现代信息技术加速融合与创新,农业
面对ChatGPT聊天机器人,我承认我焦虑了ChatGPT中国应用社区ChatGPT有多神奇ChatGPT带来的惊喜与焦虑人工智能这两天人工智能实验室OpenAI开发的聊天机器人ChatGPT各种刷屏。简要介绍这款人工智能程
家电市场回归理性消费,切实解决痛点方能赢得用户芳心回望2022年的家电消费市场可以发现,消费者变得更为理性。他们对于企业赋予产品的各种层出不穷的新名词新概念,已然趋近免疫。对于现在的消费者来说,过度营销已稍显多余,只有能够充分满足
浙江台州这一地区竟然正月十四过元宵,有什么讲究呢?这个地方就是浙江天台县,天台县,隶属浙江省台州市。位于浙江省东中部,东接三门县,南邻临海市,西枕磐安县,北连新昌县,东北接壤宁海县,西南濒临仙居县,1总面积1431。66平方公里。
岳飞被奸人害死时,为何十万岳家军无动于衷?众所周知,绍兴十二年,岳飞因为莫须有的罪名,被赐死风波亭。一代英雄豪杰就此殒命,有人欢喜有人忧。喜的是朝廷的那些主和派,包括秦桧黄潜善等人,甚至连宋高宗本人,也是一名彻头彻尾的主和
为什么李世民敢向李渊造反,而朱棣却不敢向朱元璋造反?俗话说最是无情帝王家,自从秦始皇建立秦朝开始,就意味着执掌天下的皇帝家族中,再也没有亲情可言,因为那君临天下的皇帝宝座实在是太过诱人,而历朝皇帝无不是儿孙满堂,在这种强大的竞争关系
浅析万邦来朝的盛唐覆灭的直接原因和根本原因唐朝曾写出了中国古代封建历史的辉煌,曾经的不夜城长安,街上经常看到异国的使者,万邦来贺的壮景,处处体现着唐朝的繁荣昌盛,只是物极必反月盈则亏,唐朝也没有逃脱掉亡国的宿命,只留下斑驳
哈登17130失误,主导大逆转!76人豪强七连胜,大帝爆锤约基奇在MVP两连庄的西部第一中锋约基奇率领下,丹佛掘金队在常规赛阶段的表现非常抢眼,前49场比赛战罢取得了34胜15负的战绩,高居西部第一,如今的掘金队正处于连续客场的征程当中,在1分