python爬虫11 | 这次,将带你爬取b站上的NBA形象大使蔡徐坤和他的球友们

在上一篇中

 

python爬虫10 | 网站维护人员:真的求求你们了,不要再来爬取了!!

 

小帅b给大家透露了我们这篇要说的牛逼利器

 

selenium + phantomjs

 

如果你看了

 

python爬虫09 | 上来,自己动 !这就是 selenium 的牛逼之处

 

那么你应该知道 selenium 是什么了

 

它能做到自动操作

 

比如我们上次说的自动百度苍老师

 

 

但有时候

 

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

 

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

 

也就是说

 

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

 

 

phantomJS 就是

 

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

 

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

 

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

 

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

 

难以解析的网站

 

想要爬取的话

 

就会使用到

 

selenium + phantomjs

 

那么怎么玩呢

 

这次

 

小帅b就带领你

 

使用它们来爬取b站上的 蔡徐坤和他的球友 

 

 

接下来就是

 

学习 python 的正确姿势

 

 

 

如果你还不知道蔡徐坤是谁

 

那么 小帅b 在这里给你介绍几点

 

你将会体会到人家有多么牛逼

 

首先比吴京帅

 

 

 

其次是他的微博动不动就被转发上亿次,还被央视点名表扬

 

 

 

 

唱得了歌

 

还跳得了舞

 

打得了篮球,当过 NBA 形象大使

 

除此之外

 

还有诸多优点

 

在这里就不说了

 

相信你已经和我一样

 

已经被他的优秀所折服了

 

(蔡徐坤本蔡)

 

正因为如此优秀

 

所以 b 站上很多 up 主向他学习打篮球

 

那么话不多说

 

开始爬取b站上的 蔡徐坤和他的球友 

 

 

首先来分析一下 b 站

 

打开

 

https://www.bilibili.com/

 

可以看到有一个搜索按钮

 

我们就输入「蔡徐坤 篮球」

 

 

按一下搜索

 

跳出来另一个窗口

 

 

 

在这个页面可以看到

 

我们需要的数据有

 

名称

视频地址

描述

观看次数

弹幕数量

发布时间

 

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

 

分析完之后

 

就开始撸代码了

 

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

 

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站弹出了一个登录框

 

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

 

 

 

 

 

 

那么就在搜索之前

 

点击一下首页刷新一下再输入吧

 

 # 被那个破登录遮住了index = WAIT.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "#primary_menu > ul > li.home > a")))index.click()

 

这样登录框就不会出来了

(当然,你在这里也可以使用模拟登录,但这个,小帅b往后说)

 

 

ok..

 

浏览器自动点击搜索之后

 

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

 

这个窗口里的内容

 

就是我们要的搜索结果

 

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

 

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

 

# 跳转到新的窗口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 跳转到我们要的页面了

 

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

 

然后用

 

python爬虫07 | 有了 BeautifulSoup ,妈妈再也不用担心我的正则表达式了

 

来解析一下

 

最后把数据放到 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').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

 

最后别忘了关闭浏览器哦

 

 finally:        browser.close()

 

来运行一下项目吧

 

 

数据到手

 

 

 

哦~ 对了

 

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

 

简单简单

 

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

 

首先我们要下载phantomjs 

 

你可以到

 

http://phantomjs.org/download.html

 

这里去下载

 

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

 

 

 

接着回到我们的代码

 

将 Chrome 换成 phantomjs

 

browser = webdriver.PhantomJS()

 

这次我们再来运行项目

 

 

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

 

看下我们抓到的数据

 

 

 

ok~

 

 

本篇的源代码和爬取到的数据已经放到公众号了

 

在「学习python的正确姿势」公众号发送 bb 获取

 

 

本篇完

 

近期文章

 

python爬虫10 | 网站维护人员:真的求求你们了,不要再来爬取了!!

 

python爬虫09 | 上来,自己动 !这就是 selenium 的牛逼之处

 

 

扫一扫

学习 Python 没烦恼

 

 

 

    

posted @ 2019-05-08 15:34  学习python的正确姿势  阅读(669)  评论(0编辑  收藏  举报