首页 > 应用开发 > Python > 调用浏览器的爬虫——selenium
分类目录——爬虫
在进行网页爬取时,有些网页比较难分析,应用的很多动态特性;还有可能会在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 郑州看妇科那个医院好 http://www.120zzzy.com/
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()
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69945560/viewspace-2682947/ ,如需转载,请注明出处,否则将追究法律责任。