python爬取b站搜索结果_python爬虫10 b站爬取使用 selenium+ phantomJS

但有时候

我们不想要让它打开浏览器去执行

能不能直接在代码里面运行呢

也就是说

有没有一个无形的浏览器呢

phantomJS 就是

它是一个基于 WebKit 的浏览器引擎

可以做到无声无息的操作各种动态网站

比如 js,css选择器,dom操作的

所以对于市面上大多通过 js 渲染的动态网站

难以解析的网站

想要爬取的话

就会使用到

selenium + phantomjs

那么怎么玩呢

在这个页面可以看到

我们需要的数据有

名称

视频地址

描述

观看次数

弹幕数量

发布时间

待会我们就把这些数据都爬下来

分析完之后

就开始撸代码了

首先我们要拿到浏览器的对象

browser = webdriver.Chrome()

接着开始访问 b 站

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

获取到b站首页的输入框和搜索按钮

input = WAIT.until(EC.presence_of_element_located((By.CSS_SELECTOR, "#banner_link > div > div > form > input")))submit = WAIT.until(EC.element_to_be_clickable((By.XPATH, '//*[@id="banner_link"]/div/div/form/button')))

在这里的

WAIT.until(EC.presence_of_element_located...

就是等到这个元素可操作的时候才会继续执行下一步

获取到输入框元素后输入「蔡徐坤 篮球」

接着点击搜索

input.send_keys('蔡徐坤 篮球')submit.click()

然而

不妙的事情发生了

b站弹出了一个登录框

正好挡住了我们要操作的搜索

浏览器自动点击搜索之后

这个时候会弹出一个新的窗口

这个窗口里的内容

就是我们要的搜索结果

所以我们要让我们当前的浏览器对象获取到当前的窗口

接着获取到第一页的所有数据

# 跳转到新的窗口print('跳转到新窗口')all_h = browser.window_handlesbrowser.switch_to.window(all_h[1])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)

获取到总页数之后

我们就开始循环

for i in range(2,int(total+1)):next_page(i)

如何获取下一页呢

当然是模拟点击「下一页按钮」的操作

我们获取「下一页按钮」的元素

然后点击

点击之后判断一下是否在我们当前的页数

然后获取数据

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)))get_source()

有时候可能网速卡

在刷到某一页的时候数据加载不出来

可以来个异常捕获

刷新一下

再递归一下嘿嘿

except TimeoutException:browser.refresh()return next_page(page_num)

获取资源很简单

我们已经用 selenium 跳转到我们要的页面了

那么就拿下当前页面的源码

然后用

来解析一下

最后把数据放到 excel 中

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_sourcesoup = 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').textitem_view = item.find(class_='so-icon watch-num').textitem_biubiu = item.find(class_='so-icon hide').textitem_date = item.find(class_='so-icon time').textprint('爬取:' + item_title)global nsheet.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

最后别忘了关闭浏览器哦

finally:browser.close()

来运行一下项目吧

640?wx_fmt=gif

数据到手

哦~ 对了

不是说还有一个叫做 phantomjs 的么?

简单简单

接下来我们就利用它来打造一个无痕的浏览器

首先我们要下载phantomjs

你可以到

http://phantomjs.org/download.html

这里去下载

下载完之后你需要配置一下环境变量哦

接着回到我们的代码

将 Chrome 换成 phantomjs

browser = webdriver.PhantomJS()

这次我们再来运行项目

640?wx_fmt=gif

这次就是真正的不会打开任何有界面的浏览器了

看下我们抓到的数据

ok~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值