前言
今天给大家透露了我们这篇要说的牛逼利器
selenium + phantomjs
Python学习交流Q群:906715085### 如果你知道 selenium 是什么了 它能做到自动操作 比如我们上次说的自动百度苍老师
将带你爬取b站上的NBA形象大使蔡徐坤和他的球友们
但有时候
我们不想要让它打开浏览器去执行
能不能直接在代码里面运行呢
也就是说
有没有一个无形的浏览器呢
额
phantomJS 就是
它是一个基于 WebKit 的浏览器引擎
可以做到无声无息的操作各种动态网站
比如 js,css选择器,dom操作的
所以对于市面上大多通过 js 渲染的动态网站
难以解析的网站
想要爬取的话
就会使用到
selenium + phantomjs
那么怎么玩呢
这次
就带领你
使用它们来爬取b站上的 蔡徐坤和他的球友 们
接下来就是
学习 python 的正确姿势
这次,将带你爬取b站上的NBA形象大使蔡徐坤和他的球友们
如果你还不知道蔡徐坤是谁
那么 在这里给你介绍几点
你将会体会到人家有多么牛逼
首先比吴京帅
这次,将带你爬取b站上的NBA形象大使蔡徐坤和他的球友们
其次是他的微博动不动就被转发上亿次,还被央视点名表扬
唱得了歌
还跳得了舞
打得了篮球,当过 NBA 形象大使
除此之外
还有诸多优点
在这里就不说了
相信你已经和我一样
已经被他的优秀所折服了
正因为如此优秀
所以 b 站上很多 up 主向他学习打篮球
那么话不多说
开始爬取b站上的 蔡徐坤和他的球友 们
python爬虫11 | 这次,将带你爬取b站上的NBA形象大使蔡徐坤和他的球友们
首先来分析一下 b 站
打开
https://www.bilibili.com/
可以看到有一个搜索按钮
我们就输入「蔡徐坤 篮球」
按一下搜索
跳出来另一个窗口
在这个页面可以看到
我们需要的数据有
名称
视频地址
描述
观看次数
弹幕数量
发布时间
待会我们就把这些数据都爬下来
分析完之后
就开始撸代码了
首先我们要拿到浏览器的对象
browser = webdriver.Chrome()
接着开始访问 b 站
browser.get(\"https://www.bilibili.com/\")
获取到b站首页的输入框和搜索按钮
Python学习交流Q群:906715085### 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_handles browser.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_source soup = BeautifulSoup(html,\'lxml\') save_to_excel(soup)
解析爬取
Python学习交流Q群:906715085### 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()
这次我们再来运行项目
这次就是真正的不会打开任何有界面的浏览器了
看下我们抓到的数据
结束:
我们就把蔡徐坤给爬取下来了,今天的教程还是比较简单的,每一个操作步骤都给大家交代的明明白白,相信大家一定可以学会
的。当然,没有学会的小伙伴也不要害羞,要及时说出哪里不懂,评论留言就给你回复。最后,记得给我点赞鸭!!!
来源:https://www.cnblogs.com/123456feng/p/16170456.html
本站部分图文来源于网络,如有侵权请联系删除。