今天开始学习新的爬虫分支,selenuim。selenuim 是一个自动化测试的工具,但是也时长用于爬虫实战。
#能不能让我们的程序连接到浏览器,让浏览器完成各种复杂的操作,我们只用接受最终的结果 #selenium,自动化测试工具 #可以打开浏览器,像人一样操作浏览器 #程序员可以从selenuim上提取网页中的各种信息 #让selenium启动谷歌浏览器
上代码:
from selenium.webdriver import Chrome
from selenium.webdriver.common.keys import Keys
import time
#2022年selenuim更新之后,webdriver的语法有更改,这里需要从webdriver.common导入By
from selenium.webdriver.common.by import By
后面是练习环节
#登录网站
web= Chrome()
web.get("http://www.lagou.com")
#点击选项
el=web.find_element_by_xpath('//*[@id="changeCityBox"]/ul/li[4]/a')
el.click()#点击事件
#为了防止点击事件结束后程序继续执行后面代码,产生冲突错误,这里设置睡眠时间
time.sleep(2)
#找到输入框,输入:python,回车或者点击搜索
web.find_element_by_xpath('//*[@id="search_input"]').send_keys("python",Keys.ENTER)
time.sleep(1)
web.find_element_by_xpath('//*[@id="jobList"]/div[1]/div[1]/div[1]/div[1]/div[1]/a').click()
#如何进入到新窗口中提取信息?
#注意,在selenuim中默认是不把视角切换到新窗口当中的
web.switch_to.window(web.window_handles[-1])
#在新窗口当中提取内容
job_desc=web.find_element_by_xpath('//*[@id="job_detail"]/dd[2]/div').text
print(job_desc)
#关掉子窗口
web.close()
#回到selenuim的主窗口视角
web.switch_to.window(web.window_handles[0])
#验证已经回到主窗口
print(web.find_element_by_xpath('//*[@id="jobList"]/div[1]/div[1]/div[1]/div[1]/div[1]/a').text)
#查找存放的数据,进行数据提取
#找到页面存放的数据的div
div_list=web.find_elements_by_xpath('//*[@id="jobList"]/div[1]/div')
for div in div_list:
job_salary=div.find_element_by_xpath('./div/div/div[2]/span').text
job_name_loca=div.find_element_by_xpath('./div/div/div[1]/a').text
company=div.find_element_by_xpath('./div/div[2]/div[1]/a').text
print(job_name_loca,job_salary,company)
上述的代码主要实在lagou网进行的,下面再从91看剧试试
#91看剧实战
web.get("http://www.91kanju2.com/vod-play/541-2-1.html")
iframe=web.find_element(by=By.XPATH,value='//*[@id="player_iframe"]')
web.switch_to.frame(iframe)
#web.switch_to.default_content()#切换回原页面
time.sleep(3)
mian_message=web.find_element(by=By.XPATH,value='//*[@id="main-message"]/h1/span').text
print(mian_message)
总结:selenuim的优点相较于传统的requests请求好在它是让程序连接到浏览器,让程序像人一样使用浏览器去访问网站。因此所见即所得。时常我们遇到客户端渲染,很多信息,服务器是不写进源代码里面的,因此我们打印respose的时候经常找不到我们想要的信息和数据。从而我们需要抓包然后一点点去分析。而selenuim的过程就更加的拟人。可以通过验证,可以输入关键词搜索,最重要的是我们可以直接得到客户端渲染之后的数据。但是selenuim也是有其短板,就是访问的过程比较慢,处理时长较长。尤其进行大规模数据爬取的时候效率绝对没有requests高,而且启动浏览器也比较占内存。
后面我们选择91看剧实战是因为它的html结构有些许不同。视频一般封装在iframe里面,找到iframe之后,我们还需要让selenuim把视角聚焦在iframe内部。使用web.switch_to_frame。然后回到原页面即主页面可以使用web.switch_to_default_content