静态网页 : 用html写出的网页,就是静态网页
。我们使用BeautifulSoup爬取这类型网页,因为网页源代码中就包含着网页的所有信息
,因此,网页地址栏的URL就是网页源代码的URL。
动态网页 : 要爬取的数据不在HTML源代码中,而是在json中
,你就不能直接使用网址栏的URL了,而需要找到json数据的真实URL。
不论数据存在哪里,浏览器总是在向服务器发起各式各样的请求,当这些请求完成后,它们会一起组成开发者工具的Elements中所展示的,渲染完成的网页源代码。
在遇到页面交互复杂或是URL加密逻辑复杂的情况时,selenium就派上了用场,它可以真实地打开一个浏览器,等待所有数据都加载到Elements中之后,再把这个网页当做静态网页爬取就好了。
由于要真实地运行本地浏览器,打开浏览器以及等待网渲染完成需要一些时间,selenium的工作不可避免地牺牲了速度和更多资源,不过,至少不会比人慢。
官方文档 :
https://seleniumhq.github.io/selenium/docs/api/py/api.html
1.设置浏览器引擎
selenium的脚本可以控制所有常见浏览器的操作,在使用之前,需要安装浏览器的驱动。这里使用的是Chrome浏览器
打开Mac终端terminal ,输入命令:
curl -s https://localprod.pandateacher.com/python-manuscript/crawler-html/chromedriver/chromedriver-for-Macos.sh | bash
参考 : https://localprod.pandateacher.com/python-manuscript/crawler-html/chromedriver/ChromeDriver.html
启动代码 :
# 本地Chrome浏览器设置方法
from selenium import webdriver #从selenium库中调用webdriver模块
driver = webdriver.Chrome() # 设置引擎为Chrome,真实地打开一个Chrome浏览器
把Chrome浏览器设置为引擎,然后赋值给变量driver。driver是实例化的浏览器,在后面你会总是能看到它的影子,这也可以理解,因为我们要控制这个实例化的浏览器为我们做一些事情。
2.获取数据
# 本地Chrome浏览器设置方法
from selenium import webdriver #从selenium库中调用webdriver模块
driver = webdriver.Chrome() # 设置引擎为Chrome,真实地打开一个Chrome浏览器
driver.get('https://localprod.pandateacher.com/python-manuscript/hello-spiderman/') # 打开网页
time.sleep(1)
driver.close() # 关闭浏览器
其实就是等待浏览器加载完成
3.解析与提取数据
用selenium把网页打开,所有信息就都加载到了Elements那里,之后,就可以把动态网页用静态网页的方法爬取了
driver.get('https://localprod.pandateacher.com/python-manuscript/hello-spiderman/') # 访问页面
time.sleep(2) # 等待2秒
label = driver.find_element_by_tag_name('label') # 解析网页并提取第一个<lable>标签
print(label.text) # 打印label的文本
driver.close() # 关闭浏览器
解析数据是由driver自动完成的,提取数据是driver的一个方法。

提取数据的方法都是英文直译的意思。举例给你看看它们的用法,请仔细阅读下面代码的注释:
# 以下方法都可以从网页中提取出'你好,蜘蛛侠!'这段文字
find_element_by_tag_name:通过元素的名称选择
# 如<h1>你好,蜘蛛侠!</h1>
# 可以使用find_element_by_tag_name('h1')
find_element_by_class_name:通过元素的class属性选择
# 如<h1 class="title">你好,蜘蛛侠!</h1>
# 可以使用find_element_by_class_name('title')
find_element_by_id:通过元素的id选择
# 如<h1 id="title">你好,蜘蛛侠!</h1>
# 可以使用find_element_by_id('title')
find_element_by_name:通过元素的name属性选择
# 如<h1 name="hello">你好,蜘蛛侠!</h1>
# 可以使用find_element_by_name('hello')
#以下两个方法可以提取出超链接
find_element_by_link_text:通过链接文本获取超链接
# 如<a href="spidermen.html">你好,蜘蛛侠!</a>
# 可以使用find_element_by_link_text('你好,蜘蛛侠!')
find_element_by_partial_link_text:通过链接的部分文本获取超链接
# 如<a href="https://localprod.pandateacher.com/python-manuscript/hello-spiderman/">你好,蜘蛛侠!</a>
# 可以使用find_element_by_partial_link_text('你好')
提取出的数据属于WebElement类(<class 'selenium.webdriver.remote.webelement.WebElement'>)对象,如果直接打印它,返回的是一串对它的描述。
WebElement类对象与Tag对象类似,它也有一个方法,可以通过属性名提取属性的值,这个方法是.get_attribute() :

总结 :

提取多个元素的方法:
把刚才的element换成复数elements就好了。

第二种方法:
除了用selenium解析与提取数据,还有一种解决方案,那就是,使用selenium获取网页,然后交给BeautifulSoup解析和提取。
HTML源代码字符串 = driver.page_source
4.自动操作浏览器(自动填充文本)
方法:
.send_keys() # 模拟按键输入,自动填写表单
.click() # 点击元素
案例:
driver.get('https://localprod.pandateacher.com/python-manuscript/hello-spiderman/') # 访问页面
time.sleep(2) # 暂停两秒,等待浏览器缓冲
teacher = driver.find_element_by_id('teacher') # 找到【请输入你喜欢的老师】下面的输入框位置
teacher.send_keys('必须是吴枫呀') # 输入文字
assistant = driver.find_element_by_name('assistant') # 找到【请输入你喜欢的助教】下面的输入框位置
assistant.send_keys('都喜欢') # 输入文字
button = driver.find_element_by_class_name('sub') # 找到【提交】按钮
button.click() # 点击【提交】按钮
time.sleep(1)
driver.close() # 关闭浏览器
除了输入和点击的两个方法,经常配合它们会用到的,还有一个方法.clear(),用于清除元素的内容。

案例练习 :登录博客人人都是蜘蛛侠。
然后,在文章《未来已来(三)——同九义何汝秀》中,发表一个评论,这个评论中必须要带有“selenium”这个词。
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get('https://wordpress-edu-3autumn.localprod.forc.work/wp-login.php')
time.sleep(1)
#登录
driver.find_element_by_id('user_login').send_keys('spiderman')
driver.find_element_by_id('user_pass').send_keys('crawler334566')
driver.find_element_by_id('wp-submit').click()
time.sleep(2)
con = '千喜学习selenium'
driver.find_element_by_link_text('未来已来(三)——同九义何汝秀').click()
time.sleep(1)
driver.find_element_by_id('comment').send_keys(con)
driver.find_element_by_id('submit').click()
driver.close()
网友评论