在进行网页爬取时,有些网页比较难分析,应用的很多动态特性;还有可能会在header中封装了很多奇奇怪怪的不知道怎么获取的数据;这时候可能会想如果能用程序吊起浏览器来,自动执行点击,拖动等动作就好了
selenium就是这样一个工具包
-
先看一个例子
上面所有的操作都是selenium程序控制执行的,当然,执行遇到了问题,卡在了图片验证上,这个之后再说,先看一下上述操作是怎么完成的
from selenium import webdriver import time options = webdriver.ChromeOptions() driver = webdriver.Chrome( executable_path=r'D:\Anaconda3\envs\others\Lib\site-packages\selenium\webdriver\chrome\chromedriver.exe', options=options ) # driver = webdriver.Firefox() driver.get("http://www.jd.com") driver.find_element_by_link_text("你好,请登录").click() # 就是你在页面上看到的可点击元素 time.sleep(2) # 限于网络环境需要适当延迟等网页刷新页面 driver.find_element_by_link_text("账户登录").click() driver.find_element_by_name("loginname").send_keys('123456') # 通过查看源码获得的html元素中的name属性 driver.find_element_by_name("nloginpwd").send_keys('mimamima') driver.find_element_by_id("loginsubmit").click() # # 通过查看源码获得的html元素中的name属性 time.sleep(5)
-
selenium安装
现在很多包的安装已经很容易了,直接
pip install selenium
即可
-
初始化一个selenium.webdirver对象
后面所有的操作浏览器动作将通过这个对象来完成,主要语法如下
driver = webdriver.Chrome( executable_path=r'D:\Anaconda3\envs\others\Lib\site-packages\selenium\webdriver\chrome\chromedriver.exe', options=options )
其中
executable_path
需要传入一个本地的浏览器驱动路径,webdirver对象将通过它来操作浏览器,关于谷歌的这个驱动,可以参见https://blog.csdn.net/weixin_43746433/article/details/95237254 这篇博客进行下载,我测试时并没有跟我环境对应的64位驱动,我下载了32位的也可用options
是用来设置这个对象的操作属性的,它应该这么定义options = webdriver.ChromeOptions() # 可以给options添加一些选项 options.add_experimental_option('excludeSwitches', ['enable-automation']) # 上面这个设置意为以开发者模式启动浏览器 # 一些网站能够识别selenium并进行针对性拒绝访问,这里设置options为开发者模式,防止被网站识别出来使用了Selenium # 我实际用了几次(比如在淘宝和CSDN的登录上)已经没有效果了,应该是反爬机制又升级了 options.add_argument('--headless') # 不启动浏览器操作(默认会启动浏览器窗口)
注意options的声明要在webdriver之前
当然,也可以声明 其他浏览器的webdriver对象,such as
# driver = webdriver.Firefox()
-
这个dirver怎么用
-
跳转到一个网页
driver.get("http://www.jd.com")
-
定位到一个html元素
driver.find_element_by~~~ # or dirver.find_elements_by~~~
-
定位到元素后如何操作
such as
driver.find_element_by_link_text("账户登录").click() # 找到之后点击 driver.find_element_by_name("loginname").send_keys('123456') # 这是向输入框里输入数据 driver.find_element_by_name("nloginpwd").send_keys('mimamima') driver.find_element_by_id("loginsubmit").click() # 点击登录按钮
-
如果从网页中获取多媒体资源
使用bs4.BeautifulSoup可以方便的对网页进行解析,这里以获取页面内京东的logo为例进行程序说明
background = driver.find_element_by_id('logo').find_element_by_tag_name('img') url = background.get_property('src') # url被卸载了style属性中 print(url) r = requests.get(url) # 这里通过requests来获取这张图片,当然driver也是可以的,但是driver之后当前的dirver处理页面就变成了这张图片 # 再找元素就找不到了,转回来也会比较麻烦 with open('./data/logo.png', 'wb') as f: # 注意文件处理模式为‘wb’(以二进制写入) f.write(r.content) # r.content获取r的二进制形式
这样图片就被保存了下来
顺便也获取一下上面的图片验证的那张图,这张图费了些周折,京东的这个页面弄得七转八绕的,可以在F12分析源码的时候通过Ctrl+F搜索.png来快速定位到这张图片,而且这样图不是直接给了他url,是以base64的形式直接出现在html源码中的
src = img.get_attribute('src') b64 = src.split(',')[-1] # 从src内容中拆解出图片的base64码 imgdata = base64.b64decode(b64) file = open('data/verify.png', 'wb') file.write(imgdata) file.close()
这个图片验证怎么通过呢,我之后应该会再写一些东西,有兴趣的可以关注一下
-
-
参考文献