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库
金灿灿的鸷鸟讲述着秦人的故事鸷鸟形金饰片四鸟纹金饰片金饰片兽面纹盾形金饰片盘龙纹金饰片口唇纹鳞形金饰片目云纹圭形金饰片目云纹窃曲形金饰片先秦时的文物,给人的印象总是青铜器居多,青铜鼎青铜簋青铜盉青铜敦青铜器造
专为孩子设计的影院,有声投影AI交互,趣学伴儿童故事放映机体验数码产品现在无处不在,孩子放学回家写完作业,出去玩上一会,回到家不是看电视就是玩手机,有时候碰上孩子爱看的视频或者爱玩的游戏,拉都拉不走只能在争吵声中强制关闭。这些带娱乐性的电子设
生命的旅程,你我的相遇是为了遇见更多美好的事生命的旅程,你我的相遇是为了在这个世界上遇见更多美好的事。我在年轻时都会想,人无法面对,情不知所起,一切的一切都会烟消云散。看到它落幕的时候,苦苦的感觉,无人陪伴。可是我还是这样看
恭喜辽篮!2米08大外援即将汇合,加盟年薪曝光,李洪庆立功了目前CBA联赛如火如荼进行中,在一场焦点比赛中辽宁男篮迎战吉林男篮。经过四节比赛激烈角逐,辽篮以11789大胜对手,并以9胜1负与浙江稠州男篮并列排名联盟第一位,而随后的比赛中广东
山上有青草,绿草如茵山上有青草,绿草如茵。我走在四月份的小路上,静静的看着湛蓝的天空,想像着儿时的事儿。小路上的草儿绿得有些发黑。路没有尽头,寂寞也不知道,它到底是在哪一棵树儿下默默地看着我。一条路依
我眼中的山东小吃我即兴而作的拙文我眼中的鲁菜在齐鲁壹点刊载后,由于视角独特,立场观点相对客观理性,引发了餐饮圈和周边同事朋友的关注,热情鼓励者有之,友善探讨者有之,都给了我莫大的感动,激励我在餐饮
零元转会费!哈维回归首笔签约出现,解放11名伤病球员带来最强阵相信看了上一场巴萨比赛的球迷都已经得了不少心脏相关疾病,不是因为熬夜造成的,而是因为领先三球被读秒绝平给气的。不过,据悉哈维的首笔签约已经浮现,这位新援的到来不仅可以化解大家的心病
今日立冬,养生莫踩这5个雷区倏忽秋又尽,今日恰立冬,伴随着大范围寒潮的来袭,气温急剧下降,全国多地体验了一夜入冬的感觉。立冬是二十四节气中第十九个节气,常被认为是冬季之始。从立冬到立春,俗称冬仨月,是一年里最
立冬,人生静美如秋时光荏苒,岁月如朔。在花草树木颜色变动中,我们欣赏着四季的缤纷绚烂,感受着生命的变换与美好,同时,也要面对所有的叶落归根的无奈和伤感,体会迎来送往的五味杂陈。四季轮回,生生不息。抬
立冬丨10种食物有益健康立冬节气立冬是农历二十四节气之一,时间点在公历每年11月78日之间。立冬过后,日照时间将继续缩短,正午太阳高度继续降低。中国民间以立冬为冬季之始,立冬期间,有需进补以度严冬的食俗。
立冬日市民宅家吃饺子涮火锅,商超电商订单增长加大生鲜供应刚刚过去的这个周末恰逢立冬,受降温和下雪影响,市民减少外出,对蔬菜饺子等民生商品需求大增,超市和生鲜电商线上订单大幅增加,京城商超和生鲜电商纷纷加大货源供应,提前准备好各类入冬商品