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. 牛客假日团队赛2 H.奶牛排序

    链接: https://ac.nowcoder.com/acm/contest/924/H 题意: 农夫JOHN准备把他的 N(1 <= N <= 10,000)头牛排队以便于行动.因为脾 ...

  2. NetCore1.1+Linux

    NetCore1.1+Linux部署初体验   1.环境准备 Centaos7+Win10 虚拟机 Win10安装VS2017 https://www.asp.net/downloads注意勾选下.N ...

  3. (转)nginx应用总结(1)--基础认识和应用参数优化配置

    在linux系统下使用nginx作为web应用服务,用来提升网站访问速度的经验已五年多了,今天在此对nginx的使用做一简单总结. 一.nginx服务简介Nginx是一个高性能的HTTP和反向代理服务 ...

  4. Could not load file or assembly 'Oracle.ManagedDataAccessDTC.DLL' or one of its dependencies.

    Could not load file or assembly 'Oracle.ManagedDataAccessDTC.DLL' or one of its dependencies.  不是有效的 ...

  5. Eclipse 在桌面创建快捷方式打开工作区

    创建eclipse快捷的方式,并Copy到桌面. 打开快捷方式的属性窗口,在[目标]栏,增加参数 –data 你的工作区目录

  6. WebApi访问方式配置

    之前公司使用webapi开发项目,只知道怎么用对于怎么配置一直不了解,最近这段时间没什么事然后自己建一个webapi项目,只知道怎么用对于怎么配置一直不了解,最近这段时间没什么事然后自己建一个weba ...

  7. IDEA Spring Boot 项目创建

    1.创建新项目 2.选择 Spring Initializr 3.选择默认项或者修改其名称也可,直接下一步 4.选择 web选项以及spring boot版本(我用的是2.0.2) 5.为项目创建名称 ...

  8. Reset CSS 页面初始化css

    CSS 初始化样式(Reset CSS 官网提供): /* http://meyerweb.com/eric/tools/css/reset/ v2.0 | 20110126 License: non ...

  9. Python+selenium之跳过测试和预期失败

    在运行测试时,需要直接跳过某些测试用例,或者当用例符合某个条件时跳过测试,又或者直接将测试用例设置为失败.unittest单元测试框架提供了实现这些需求的装饰器. 1.unittest.skip(re ...

  10. jmeter参考网址

    http://blog.csdn.net/dongdong9223/article/details/49248979 http://blog.csdn.net/hjh00/article/detail ...