本篇为爬虫辅助,解决一些反爬虫问题~
- 有的网站登录很复杂,验证码难以破解,比如大名鼎鼎的12306;
- 有的网站页面交互复杂,所使用的技术难以被爬取,比如,腾讯文档。
- 还有的网站,对 URL 的加密逻辑很复杂,URL的参数变量找起来费劲;
使用 selenium 可以解决上述问题,ta 是一个强大的 Python 库。
ta 可以用几行代码,控制浏览器,做出自动打开、输入、点击等操作,就像是有一个真正的用户在操作一样。
看视频,录下视频转换到gif,但没激活就有水印呢!写完博客,再找找破解版。
您可以看到,这些都是浏览器自动找到网页、输入账号、密码并自动登录~
from selenium import webdriver # 从 selenium 库中调用 webdriver 模块
import time
driver = webdriver.Chrome() # 设置引擎为Chrome,真实地打开一个Chrome浏览器
url = 'http://vip.biancheng.net/login.php'
driver.get(url)
time.sleep(1)
teacher = driver.find_element_by_id('username')
teacher.send_keys('Debroon') # 账号
assistant = driver.find_element_by_name('password')
assistant.send_keys('NoTXnorC1/2(XJ+Z)') # 密码,不染天下不染尘,半分行迹半分踪--诗句加数学文理结合-->NoTXnorC1/2(XJ+Z)。
time.sleep(0.5)
button = driver.find_element_by_id('submit')
time.sleep(0.5)
button.click()
driver.close()
这是用 selenium 实现爬虫时要用的解析提取数据,实例就是登录一个网站。现在您还不能玩,
selenium的脚本可以控制所有常见浏览器的操作,在使用之前,需要安装浏览器的驱动。
我的是Chrome浏览器就下载Chrome的安装包了,Windows和Mac都有,按说明书下载好。
链接 : https://localprod.pandateacher.com/python-manuscript/crawler-html/chromedriver/ChromeDriver.html
from selenium import webdriver # 从 selenium 库中调用 webdriver 模块
driver = webdriver.Chrome() # 设置引擎为Chrome,真实地打开一个 Chrome浏览器
driver.close() # 关闭浏览器
变量 driver 在这里是一个实例化的浏览器,因此,就是通过这个浏览器打开网页。
url = 'http://vip.biancheng.net/login.php' # C语言中文网登录界面的地址
driver.get(url)
time.sleep(1) # 暂停 1 s
我们登录网站,要输入用户名和密码。自动化也必须登录,模拟人的操作。我们首先找到用户名、密码、登录按钮分别对应的网页元素是哪一个。
这是用户名的,可以通过name 或 id 查找 username
这是密码框的,通过name 或 id 查找 password
这是登录按钮,能使用 id 或者 name 查找 submit
# 找到用户名框框
teacher = driver.find_element_by_id('username')
# 把提取到的位置信息赋值给teacher,然后再用teacher.send_keys()的方法输入你想填到这个空里的文本。
# 找到密码框框
assistant = driver.find_element_by_name('password')
# 找到登录按钮
button = driver.find_element_by_id('submit')
selenium 提取数据的方法有 5 种,是不是觉得有点麻烦,这也没办法因为网页不会有统一的写法。好在 TA 们的前缀是相同的 : find_element_by_ 译, 查找元素通过 --- 与 BeautifulSoup 中的 find 类似
方法 | 功能说明 |
find_element_by_tag_name | 查找元素通过标签名 |
find_element_by_class_name | 查找元素通过class属性 |
find_element_by_id | 查找元素通过id |
find_element_by_name | 查找元素通过name属性 |
find_element_by_link_text | 查找元素通过链接文本(元素:超链接) |
find_element_by_partial_link_text | 查找元素通过部分链接文本(元素超链接) |
如果想要提取多个数据,find_element_by_ 要改成 find_elements_by_ , 复数形式,与 BeautifulSoup 中的 find_all 类似。
现在这些框都找到了,接下来是输入和点击。
# .send_keys() # 模拟按键输入,自动填写表单
# .click() # 点击元素
# .clear() # 清除元素内容
teacher.send_keys('Debroon') # 输入账号
assistant.send_keys('NoTXnorC1/2(XJ+Z)') # 输入密码,不染天下不染尘,半分行迹半分踪--诗句加数学文理结合-->NoTXnorC1/2(XJ+Z)。
button.click() # 点击按钮
这些学会了,那么上面的完整代码看懂是没问题了。
另外,还可以把自己电脑中的Chrome浏览器设置为静默模式,也就是说,让浏览器只是在后台运行,并不在电脑中打开它的可视界面。因为在做爬虫时,通常不需要打开浏览器,爬虫的目的是爬到数据,而不是观看浏览器的操作过程,在这种情况下,就可以使用浏览器的静默模式。
# 本地Chrome浏览器的静默默模式设置:
from selenium import webdriver #从selenium库中调用webdriver模块
from selenium.webdriver.chrome.options import Options # 从options模块中调用Options类
chrome_options = Options() # 实例化Option对象
chrome_options.add_argument('--headless') # 把Chrome浏览器设置为静默模式
driver = webdriver.Chrome(options = chrome_options) # 设置引擎为Chrome,在后台默默运行
完整代码:
# 本地Chrome浏览器的静默默模式设置:
import time
from selenium import webdriver #从selenium库中调用webdriver模块
from selenium.webdriver.chrome.options import Options # 从options模块中调用Options类
chrome_options = Options() # 实例化Option对象
chrome_options.add_argument('--headless') # 把Chrome浏览器设置为静默模式
driver = webdriver.Chrome(options = chrome_options) # 设置引擎为Chrome,在后台默默运行
# driver = webdriver.Chrome() # 如果用上这一句可视化界面会覆盖后台静默模式 #
url = 'http://vip.biancheng.net/login.php'
driver.get(url)
time.sleep(1)
teacher = driver.find_element_by_id('username')
teacher.send_keys('Debroon') # 账号
assistant = driver.find_element_by_name('password')
assistant.send_keys('NoTXnorC1/2(XJ+Z)') # 密码 ,不染天下不染尘,半分行迹半分踪 -- 诗句加数学,文理结合 --> NoTXnorC1/2(XJ+Z) 。
time.sleep(0.5)
button = driver.find_element_by_name('submit')
time.sleep(0.5)
button.click()
time.sleep(3)
driver.close()
总结:
Selenium是一个强大的网络数据采集工具,它的优势是简单直观,而它当然也有不足。
由于是真实地模拟人操作浏览器,需要等待网页缓冲的时间,在爬取大量数据的时候,速度会比较慢。
分享:
除了可用selenium解析与提取数据,还有可使用selenium获取网页,然后交给BeautifulSoup解析和提取。
selenium 有一个获取到渲染完整的网页源代码,driver的一个方法:page_source。
HTML源代码字符串 = driver.page_source
BeautifulSoup把字符串格式的网页源代码解析为BeautifulSoup对象,然后再从中提取数据,那么用BeautifulSoup解析和提取数据。
使用 selenium WebElement类对象 也可以达到 BeautifulSoup 的Tag类的功能。
WebElement类 | Tag类 | 功能说明 |
WebElement.text | Tag.text | 提取文字 |
WebElement.get_attribute() | Tag['属性名'] | 输入参数: 属性名(可提取的属性值) |
.get_attribute() 举例,
定位到上图中标亮的元素,然后提取出type这个属性的值submit。
BeautifulSoup的工作方式