selenium+phantomjs爬取bilibili

首先我们要下载phantomjs 你可以到 http://phantomjs.org/download.html 这里去下载 下载完之后解压到你想要放的位置 你需要配置一下环境变量哦

如下图:


首先,我们怎么让浏览器模拟操作,也就是我们自己先分析好整个操作过程,哪个地方有什么问题,把这些问题都提前测试好,没问题了再进行写代码。

打开bilibili网站 https://www.bilibili.com/ 发现下图登陆弹窗

那么这里我们就得先把这个弹窗去除,怎么去呢?你刷新一下或者点一下 首页 就不会出现了,所以这里我们可以模拟再刷新一次或者点击首页。

接下来搜索关键词 蔡徐坤 打球 这时就涉及到搜索输入框和搜索按钮

点击搜索后我们看到了下列内容,其中圈起来的就是要爬的信息啦 这时就涉及到页面源码获取,数据元素定位

那么上面这个过程走完了的话 我们也可以选择写入xls格式,同时这里还少了一个事,那就是我现在才爬了一页,那难道不写个自动化爬取全部吗?

那此时就得解决循环获取和写入xls 更重要的事怎么去操作页数和下一页按钮

大致的思路就是这样子了!!!

先导入这些模块

from selenium import webdriver
from selenium.common.exceptions import TimeoutException #一条命令在足够的时间内没有完成则会抛出异常
from selenium.webdriver.common.by import By #支持的定位器分类
from selenium.webdriver.support.ui import WebDriverWait #等待页面加载完成,找到某个条件发生后再继续执行后续代码,如果超过设置时间检测不到则抛出异常
from selenium.webdriver.support import expected_conditions as EC #判断元素是否加载
from bs4 import BeautifulSoup
import xlwt

定义一个浏览器对象并设置其他功能

browser = webdriver.Chrome() #初始化浏览器对象
WAIT = WebDriverWait(browser,10) #显式等待,等待的时间是固定的,这里为10秒 元素在指定时间内不可见就引发异常TimeoutException
browser.set_window_size(1400,900) #设置浏览器窗口大小

创建excel文件,再创建一张工作表,名为 蔡徐坤篮球,并且设置支持覆盖原数据!

book=xlwt.Workbook(encoding='utf-8',style_compression=0) #创建excel文件,设置utf-8编码,这样就可以在excel中输出中文了
sheet=book.add_sheet('蔡徐坤篮球',cell_overwrite_ok=True) #添加一张工作表 cell_overwrite_ok=True 时可以覆盖原单元格中数据。
sheet.write(0,0,'名称')
sheet.write(0,1,'地址')
sheet.write(0,2,'描述')
sheet.write(0,3,'观看次数')
sheet.write(0,4,'弹幕数')
sheet.write(0,5,'发布时间')

打开网站

browser.get('https://www.bilibili.com/')

寻找 “首页” 元素

index = WAIT.until(EC.element_to_be_clickable((By.CSS_SELECTOR,'#primary_menu > ul > li.home > a')))
# 配合WebDriverWait类的until()方法进行灵活判断 进行下一步操作
# 通过EC进行判断某个元素中是否可见并且是enable的 这样的话叫clickable(可点击)
# 使用CSS选择器选中页面中的 首页 进行点击 目的为了第一次有个登录弹窗 刷新就没有 那就点击下首页来实现刷新
index.click() #点击!

先判断是否加载 输入框 再判断搜索按钮是否能点击 达到条件后输入内容进行搜索

input = WAIT.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#banner_link > div > div > form > input'))) #判断某个元素是否被加到DOM树里,并不代表该元素一定可见(元素可以是隐藏的)
submit = WAIT.until(EC.element_to_be_clickable((By.XPATH,'//*[@id="banner_link"]/div/div/form/button'))) #判断搜索按钮是否能点击,这里使用Xpath来寻找元素
input.send_keys('蔡徐坤 篮球') #用send_keys()方法进行搜索输入框中输入内容
submit.click() #点击搜索!

这时搜索完 是弹出新的窗口 这时就得获取窗口句柄 实现标签页跳转

all_h = browser.window_handles #获取所有窗口句柄
browser.switch_to.window(all_h[1]) #switch_to.window 标签页跳转

接下来就是获取页面源码了(此处非全部源码)

WAIT.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#server-search-app > div.contain > div.body-contain > div > div.result-wrap.clearfix'))) #坚持是否加载完所有搜索结果
html = browser.page_source #page_source方法可以获取到页面源码

然后搜索元素并提取内容进行保存

	#遍历所有搜索信息 并保存
list = soup.find(class_='all-contain').find_all(class_='info')
for item in list:
item_title = item.find('a').get('title')
item_link = item.find('a').get('href')
item_dec = item.find(class_='des hide').text
item_view = item.find(class_='so-icon watch-num').text
item_biubiu = item.find(class_='so-icon hide').text
item_date = item.find(class_='so-icon time').text print('爬取:' + item_title)

再最后就是循环获取每一页提取数据最后写入xls文件!!!

下面就直接贴出代码了

from selenium import webdriver
from selenium.common.exceptions import TimeoutException #一条命令在足够的时间内没有完成则会抛出异常
from selenium.webdriver.common.by import By #支持的定位器分类
from selenium.webdriver.support.ui import WebDriverWait #等待页面加载完成,找到某个条件发生后再继续执行后续代码,如果超过设置时间检测不到则抛出异常
from selenium.webdriver.support import expected_conditions as EC #判断元素是否加载
from bs4 import BeautifulSoup
import xlwt browser = webdriver.Chrome() #初始化浏览器对象
WAIT = WebDriverWait(browser,10) #显式等待,等待的时间是固定的,这里为10秒 元素在指定时间内不可见就引发异常TimeoutException
browser.set_window_size(1400,900) #设置浏览器窗口大小 book=xlwt.Workbook(encoding='utf-8',style_compression=0) #创建excel文件,设置utf-8编码,这样就可以在excel中输出中文了
sheet=book.add_sheet('蔡徐坤篮球',cell_overwrite_ok=True) #添加一张工作表 cell_overwrite_ok=True 时可以覆盖原单元格中数据。
sheet.write(0,0,'名称')
sheet.write(0,1,'地址')
sheet.write(0,2,'描述')
sheet.write(0,3,'观看次数')
sheet.write(0,4,'弹幕数')
sheet.write(0,5,'发布时间')
n = 1 def seach():
try:
print('开始访问b站....')
browser.get('https://www.bilibili.com/') index = WAIT.until(EC.element_to_be_clickable((By.CSS_SELECTOR,'#primary_menu > ul > li.home > a')))
# 配合WebDriverWait类的until()方法进行灵活判断 进行下一步操作
# 通过EC进行判断某个元素中是否可见并且是enable的 这样的话叫clickable(可点击)
# 使用CSS选择器选中页面中的 首页 进行点击 目的为了第一次有个登录弹窗 刷新就没有 那就点击下首页来实现刷新
index.click() #点击! input = WAIT.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#banner_link > div > div > form > input'))) #判断某个元素是否被加到DOM树里,并不代表该元素一定可见(元素可以是隐藏的)
submit = WAIT.until(EC.element_to_be_clickable((By.XPATH,'//*[@id="banner_link"]/div/div/form/button'))) #判断搜索按钮是否能点击,这里使用Xpath来寻找元素
input.send_keys('蔡徐坤 篮球') #用send_keys()方法进行搜索输入框中输入内容
submit.click() #点击搜索! print('跳转到新窗口')
all_h = browser.window_handles #获取所有窗口句柄
browser.switch_to.window(all_h[1]) #switch_to.window 标签页跳转 get_source()
total = WAIT.until(EC.presence_of_element_located((By.CSS_SELECTOR,"#server-search-app > div.contain > div.body-contain > div > div.page-wrap > div > ul > li.page-item.last > button"))) #等待加载后获取所有页数按钮
return int(total.text) #返回页码数量
except TimeoutException:
return seach() def get_source():
WAIT.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#server-search-app > div.contain > div.body-contain > div > div.result-wrap.clearfix'))) #坚持是否加载完所有搜索结果
html = browser.page_source #page_source方法可以获取到页面源码
soup = BeautifulSoup(html,'lxml')
save_to_excel(soup) def save_to_excel(soup):
#遍历所有搜索信息 并保存
list = soup.find(class_='all-contain').find_all(class_='info')
for item in list:
item_title = item.find('a').get('title')
item_link = item.find('a').get('href')
item_dec = item.find(class_='des hide').text
item_view = item.find(class_='so-icon watch-num').text
item_biubiu = item.find(class_='so-icon hide').text
item_date = item.find(class_='so-icon time').text print('爬取:' + item_title) global n sheet.write(n, 0, item_title)
sheet.write(n, 1, item_link)
sheet.write(n, 2, item_dec)
sheet.write(n, 3, item_view)
sheet.write(n, 4, item_biubiu)
sheet.write(n, 5, item_date) n = n + 1 def next_page(page_num):
try:
print('获取下一页数据')
next_btn = WAIT.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '#server-search-app > div.contain > div.body-contain > div > div.page-wrap > div > ul > li.page-item.next > button')))
#等待加载 下一页 按钮
next_btn.click() #点击下一页!
WAIT.until(EC.text_to_be_present_in_element((By.CSS_SELECTOR,'#server-search-app > div.contain > div.body-contain > div > div.page-wrap > div > ul > li.page-item.active > button'),str(page_num)))
#判断某个元素中的text是否包含了预期的字符串
get_source() except TimeoutException:
browser.refresh() #刷新页面
return next_page(page_num) def main():
try:
total = seach() for i in range(2,int(total+1)):
next_page(i) finally:
browser.close()
browser.quit() if __name__ == '__main__':
main()
book.save(u'蔡徐坤篮球.xls') #在字符串前加r,声明为raw字符串,这样就不会处理其中的转义了。否则,可能会报错

selenium+phantomjs爬取bilibili的更多相关文章

  1. Python3.x:Selenium+PhantomJS爬取带Ajax、Js的网页

    Python3.x:Selenium+PhantomJS爬取带Ajax.Js的网页 前言 现在很多网站的都大量使用JavaScript,或者使用了Ajax技术.这样在网页加载完成后,url虽然不改变但 ...

  2. selenium+phantomjs爬取京东商品信息

    selenium+phantomjs爬取京东商品信息 今天自己实战写了个爬取京东商品信息,和上一篇的思路一样,附上链接:https://www.cnblogs.com/cany/p/10897618. ...

  3. python+selenium+PhantomJS爬取网页动态加载内容

    一般我们使用python的第三方库requests及框架scrapy来爬取网上的资源,但是设计javascript渲染的页面却不能抓取,此时,我们使用web自动化测试化工具Selenium+无界面浏览 ...

  4. selenium + PhantomJS 爬取js页面

    from selenium import webdriver import time _url="http://xxxxxxxx.com" driver = webdriver.P ...

  5. Selenium+PhantomJs 爬取网页内容

    利用Selenium和PhantomJs 可以模拟用户操作,爬取大多数的网站.下面以新浪财经为例,我们抓取新浪财经的新闻版块内容. 1.依赖的jar包.我的项目是普通的SSM单间的WEB工程.最后一个 ...

  6. selenium + phantomjs 爬取落网音乐

    题记: 作为一个业余程序猿,最大的爱好就是电影和音乐了,听音乐当然要来点有档次的.落网的音乐的逼格有点高,一听听了10年.学习python一久了,于是想用python技术把落网的音乐爬下来随便听. 目 ...

  7. Python3.x:Selenium+PhantomJS爬取带Ajax、Js的网页及获取JS返回值

    前言 现在很多网站的都大量使用JavaScript,或者使用了Ajax技术.这样在网页加载完成后,url虽然不改变但是网页的DOM元素内容却可以动态的变化.如果处理这种网页是还用requests库或者 ...

  8. 看我怎么扒掉CSDN首页的底裤(python selenium+phantomjs爬取CSDN首页内容)

    这里只是学习一下动态加载页面内容的抓取,并不适用于所有的页面. 使用到的工具就是python selenium和phantomjs,另外调试的时候还用了firefox的geckodriver.exe. ...

  9. selenium+phantomjs爬取动态页面数据

    1.安装selenium pip/pip3 install selenium 注意依赖关系 2.phantomjs for windows 下载地址:http://phantomjs.org/down ...

随机推荐

  1. luogu P4145 上帝造题的七分钟2 / 花神游历各国 维护区间和&&区间开根号

    因为开根号能使数字减小得非常快 所以开不了几次(6次?)很大的数就会变成1..... 所以我们可以维护区间最大值,若最大值>1,则继续递归子树,暴力修改叶节点,否则直接return (好像也可以 ...

  2. A.dreamstart的催促

    题目描述 有一天集训队的学弟们正在计算一堆数,但是dreamstart感觉他们算的太慢了,就让他们坐在一起想出一个快速计算的方法,但是由于他们一时想不出来,想让你帮助他们.他们说现在有一个数列,要算出 ...

  3. Codeforces Round #432 (Div. 2, based on IndiaHacks Final Round 2017) D

    Arpa has found a list containing n numbers. He calls a list bad if and only if it is not empty and g ...

  4. 不可见类有抽象父类,spring配置子类bean,注入父类,aop就可以切父类的方法

    public class TestBeanChild { int b = 1; public TestBean createDefault() { return new TestBeanDefault ...

  5. Spring boot中应用jpa jpa用法

    https://blog.csdn.net/u012582402/article/details/78717705

  6. eShopOnContainers(一)

    微软微服务架构eShopOnContainers(一) 为了推广.Net Core,微软为我们提供了一个开源Demo-eShopOnContainers,这是一个使用Net Core框架开发的,跨平台 ...

  7. Codeforces Round #377 (Div. 2) 被坑了

    http://codeforces.com/contest/732/problem/B 题目要求任意两个连续的日子都要 >= k 那么如果a[1] + a[2] < k,就要把a[2]加上 ...

  8. 《从0到1学习Flink》—— Mac 上搭建 Flink 1.6.0 环境并构建运行简单程序入门

    准备工作 1.安装查看 Java 的版本号,推荐使用 Java 8. 安装 Flink 2.在 Mac OS X 上安装 Flink 是非常方便的.推荐通过 homebrew 来安装. brew in ...

  9. mysql通过sql语句判断某个字段在一张表中是否存在

    应用场景: 我有一张表,表里面都是用户用来激活游戏的激活码,当用户在前端页面输入激活码时,要查询数据表中是否有这条激活码,如果有就返回"1",没有则返回"0". ...

  10. Windows2

    windows如何打开dvd, iso镜像文件 .iso后缀的文件是一个压缩文件, 使用Winrar等压缩工具即可打开 windows7如何下载Visual Studio 2010(2010是流行的开 ...