ITPub博客

首页 > 应用开发 > Python > 调用浏览器的爬虫——selenium

调用浏览器的爬虫——selenium

原创 Python 作者:ckxllf 时间:2020-03-27 16:45:40 0 删除 编辑

  分类目录——爬虫

  在进行网页爬取时,有些网页比较难分析,应用的很多动态特性;还有可能会在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~~~

  

find

  定位到元素后如何操作

  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/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2019-08-16

  • 博文量
    204
  • 访问量
    262637