爬虫Day11-Selenium魔法师 Vs bilibili

前言

B站可谓是个资源丰富的地方,对我来说,它就是一个学习网站,里面啥都有。。。我们今天使用selenium 爬取B站信息,实现 关键词 抓取 的需求。

对于selenium 我们之前已经介绍过: 爬虫Day8-Selenium魔法师


实战

url = https://www.bilibili.com/

使用 selenium ,当然是先需要获取我们对应点击的节点,进行模拟操作了。


拿着之前的文章,这不是小意思嘛,欻欻的写出了下面这段代码:

代码v1.0

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
from selenium import  webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
import time


browser = webdriver.Chrome()
wait = WebDriverWait(browser, 20)
url = 'https://www.bilibili.com/'
KEYWORD = '大仙'

def get_page():
browser.get(url)

# 点击首页刷新一下网页,防止有验证码登录
index = '#primary_menu > ul > li.home > a'
can_click = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,index)))
can_click.click()


# 找出文字搜索框
botton = '#banner_link > div > div > form > input'
input = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, botton)))

# 找出提交按钮
search = '#banner_link > div > div > form > button'
wait_search = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, search)))

input.send_keys(KEYWORD) # 发送关键字
wait_search.click() # 点击按钮


ok…接着我们运行一下代码测试一下,然后就来到了这个页面

  • 发现所有的视频内容都包括在一个 class = “all-contain”的 div 中
  • 我们使用 find 方法将其匹配出来。

代码v1.1

1
2
3
4
5
6
7
8
9
10
11
def get_page():
... # 以上省略的代码

input.send_keys(KEYWORD)
wait_search.click()

# 页面跳转
browser.switch_to_window(browser.window_handles[1])

html = browser.page_source
return html
  • 为什么有一个页面跳转的步骤呢? 因为啊,我们的浏览器发送关键词搜索之后,页面已经切换了,而我们后续需要使用page_source 属性获取响应信息,如果没有页面切换,那么得到的响应内容是原页面的内容,这不是我们想要的。

解析

我们调用 爬虫Day6-Beautiful介绍 这个库 进行代码解析并写入文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def parser(html):
soup = BeautifulSoup(html,'lxml')
results = soup.find(class_='contain').find_all(class_='info')
with open('daxian.txt', 'w', encoding='utf-8') as f:
for result in results:
title = result.find(class_='des hide').text.split()
watch_frequency = result.find(class_='so-icon watch-num').text.split()
put_time = result.find(class_='so-icon time').text.split()
the_up = result.find(class_='up-name').text.split()
f.write(str(title)+ '\n')
f.write(str(watch_frequency) + '\n')
f.write(str(put_time) + '\n')
f.write(str(the_up) + '\n')
f.write('='*50 + '\n')

运行结果如下:



后记

这一次的selenium实战就介绍到这里了, 如果想实现多页爬取,同样道理,利用 EC.element_to_be_clickable() 显示等待 “下一页”节点加载出来,然后模拟点击即可。

用没用感受到selenium的魅力呢? 什么反爬什么加密统统不在话下!这可不是吹的~