0


Python之Selenium自动化爬虫

文章目录

Python之Selenium自动化爬虫

0.介绍

Selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开发的,Selenium 可以直接运行在浏览器上,它支持所有主流的浏览器(包括PhantomJS这些无界面的浏览器(2018年开发者说暂停开发,chromedriver也可以实现同样的功能)),可以接收指令,让浏览器自动加载页面,获取需要的数据,甚至页面截屏。

1.安装

  1. pip install selenium -i https://pypi.tuna.tsinghua.edu.cn/simple

2.下载浏览器驱动

这里用的谷歌浏览器

http://npm.taobao.org/mirrors/chromedriver/

查看自己的浏览器版本下载对应的驱动。

在这里插入图片描述

把解压后的驱动放在自己的python.exe 目录下。

3.实例

我之前写过3个实例

  1. https://harris.blog.csdn.net/article/details/116406200

4.开启无头模式

是否开启无头模式(即是否需要界面)

  1. from selenium.webdriver import Chrome
  2. from selenium.webdriver.chrome.options import Options
  3. option = Options()# 实例化option对象
  4. option.add_argument("--headless")# option对象添加无头参数
  5. option.headless =True#这种方式也可以if __name__ =='__main__':
  6. web = Chrome(executable_path='D:\PyProject\spider\venv\Scripts\chromedriver.exe',options=option)# 指定驱动位置,否则从python解释器目录下查找.
  7. web.get("https://baidu.com")print(web.title)

5.保存页面截图

  1. from selenium.webdriver import Chrome
  2. from selenium.webdriver.chrome.options import Options
  3. option = Options()# 实例化option对象
  4. option.add_argument("--headless")# option对象添加无头参数if __name__ =='__main__':
  5. web = Chrome()
  6. web.maximize_window()# 浏览器窗口最大化
  7. web.get("https://baidu.com")print(web.title)
  8. web.save_screenshot('baidu.png')# 保存当前网页的截图 保存到当前文件夹下
  9. web.close()# 关闭当前网页

6.模拟输入和点击

  1. from selenium.webdriver import Chrome
  2. from selenium.webdriver.chrome.options import Options
  3. option = Options()# 实例化option对象
  4. option.add_argument("--headless")# option对象添加无头参数if __name__ =='__main__':
  5. web = Chrome()
  6. web.maximize_window()# 浏览器窗口最大化
  7. web.get("https://baidu.com")
  8. el = web.find_element_by_id('kw')
  9. el.send_keys('Harris-H')
  10. btn = web.find_element_by_id('su')
  11. btn.click()# web.close() # 关闭当前网页

貌似现在百度可以识别出selenium,还需要图片验证。

a.根据文本值查找节点

  1. # 找到文本值为百度一下的节点
  2. driver.find_element_by_link_text("百度一下")
  3. # 根据链接包含的文本获取元素列表,模糊匹配
  4. driver.find_elements_by_partial_link_text("度一下")

b.获取当前节点的文本

  1. ele.text # 获取当前节点的文本
  2. ele.get_attribute("data-click") # 获取到属性对应的value

c.打印当前网页的一些信息

  1. print(driver.page_source) # 打印网页的源码
  2. print(driver.get_cookies()) # 打印出网页的cookie
  3. print(driver.current_url) # 打印出当前网页的url

d.关闭浏览器

  1. driver.close() # 关闭当前网页
  2. driver.quit() # 直接关闭浏览器

e.模拟鼠标滚动

  1. from selenium.webdriver import Chrome
  2. import time
  3. if __name__ =='__main__':
  4. driver = Chrome()
  5. driver.get("https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=78000241_12_hao_pg&wd=selenium%20js%E6%BB%91%E5%8A%A8&fenlei=256&rsv_pq=8215ec3a00127601&rsv_t=a763fm%2F7SHtPeSVYKeWnxKwKBisdp%2FBe8pVsIapxTsrlUnas7%2F7Hoo6FnDp6WsslfyiRc3iKxP2s&rqlang=cn&rsv_enter=1&rsv_dl=tb&rsv_sug3=31&rsv_sug1=17&rsv_sug7=100&rsv_sug2=0&rsv_btype=i&inputT=9266&rsv_sug4=9770")# 1.滚动到网页底部
  6. js ="document.documentElement.scrollTop=1000"# 执行js
  7. driver.execute_script(js)
  8. time.sleep(2)# 滚动到顶部
  9. js ="document.documentElement.scrollTop=0"
  10. driver.execute_script(js)# 执行js
  11. time.sleep(2)
  12. driver.close()

7.ChromeOptions

  1. options = webdriver.ChromeOptions()
  2. options.add_argument("--proxy-server=http://110.52.235.176:9999")# 添加代理
  3. options.add_argument("--headless")# 无头模式
  4. options.add_argument("--lang=en-US")# 网页显示英语
  5. prefs ={"profile.managed_default_content_settings.images":2,'permissions.default.stylesheet':2}# 禁止渲染
  6. options.add_experimental_option("prefs", prefs)
  7. driver = webdriver.Chrome(executable_path="D:\ProgramApp\chromedriver\chromedriver73.exe",chrome_options=options)
  8. driver.get("http://httpbin.org/ip")

8.验证滑块移动

  1. """
  2. 目标:滑动验证码
  3. 1.定位按钮
  4. 2.按住滑块
  5. 3.滑动按钮
  6. """import time
  7. from selenium import webdriver
  8. if __name__ =='__main__':
  9. chrome_obj = webdriver.Chrome()
  10. chrome_obj.get('https://www.helloweba.net/demo/2017/unlock/')# 1.定位滑动按钮
  11. click_obj = chrome_obj.find_element_by_xpath('//div[@class="bar1 bar"]/div[@class="slide-to-unlock-handle"]')# 2.按住# 创建一个动作链对象,参数就是浏览器对象
  12. action_obj = webdriver.ActionChains(chrome_obj)# 点击并且按住,参数就是定位的按钮
  13. action_obj.click_and_hold(click_obj)# 得到它的宽高
  14. size_ = click_obj.size
  15. width_ =298- size_['width']# 滑框的宽度 减去 滑块的 宽度 就是 x轴移动的距离(向右)print(width_)# 3.定位滑动坐标
  16. action_obj.move_by_offset(298-width_,0).perform()# 4.松开滑动
  17. action_obj.release()
  18. time.sleep(6)
  19. chrome_obj.quit()

9.打开多窗口和页面切换

有时候窗口中有很多子tab页面。这时候肯定是需要进行切换的。selenium提供了一个叫做switch_to_window来进行切换,具体切换到哪个页面,可以从driver.window_handles中找到

  1. from selenium import webdriver
  2. if __name__ =='__main__':
  3. driver = webdriver.Chrome()
  4. driver.get("https://www.baidu.com/")
  5. driver.implicitly_wait(2)
  6. driver.execute_script("window.open('https://www.douban.com/')")
  7. driver.switch_to.window(driver.window_handles[1])print(driver.page_source)

第二个实例

  1. if __name__ =='__main__':from selenium import webdriver
  2. import time
  3. driver = webdriver.Chrome()
  4. start_url ='https://www.baidu.com'
  5. start_url_1 ='https://www.csdn.net'
  6. driver.get(start_url)
  7. time.sleep(5)"""通过执行js代码,打开浏览器窗口,访问地址"""
  8. js ='window.open("{}")'.format(start_url_1)
  9. driver.execute_script(js)
  10. time.sleep(5)"""获取浏览器所有窗口:注意点:窗口的切换是通过下标控制的"""
  11. win = driver.window_handles
  12. # 执行切换
  13. driver.switch_to.window(win[0])
  14. time.sleep(2)
  15. driver.switch_to.window(win[1])
  16. time.sleep(2)
  17. driver.switch_to.window(win[0])
  18. time.sleep(2)
  19. driver.switch_to.window(win[1])# 浏览器窗口的关闭
  20. driver.close()# 退出浏览器
  21. driver.quit()

有时候网页会内嵌另一个html。一般称为iframe

  1. from selenium import webdriver
  2. driver = webdriver.Chrome()
  3. start_url ='https://mail.163.com/'
  4. driver.get(start_url)"""定位不成功,在有的情况是因为有页面的嵌套导致的
  5. 在一个html源码中有多个html页面,示例:一个html嵌套一个html
  6. 以上:又称之为iframe的嵌套
  7. """# 定位嵌套位置iframe
  8. el_iframe = driver.find_elements_by_tag_name('iframe')# 执行iframe的切换
  9. driver.switch_to.frame(el_iframe[0])# 标签定位
  10. driver.find_element_by_name('email').send_keys('邮箱账号')
  11. driver.find_element_by_name('password').send_keys('你的邮箱密码')
  12. driver.find_element_by_id('dologin').click()

10.Cookie操作

  1. # 1.获取所有的cookie:for cookie in driver.get_cookies():print(cookie)# 2.根据cookie的key获取value:
  2. value = driver.get_cookie(key)# 3.删除所有的cookie
  3. driver.delete_all_cookies()# 4.删除某个cookie
  4. driver.delete_cookie(key)# 添加cookie
  5. driver.add_cookie({"name":"password","value":"111111"})

11.模拟登录

这里模拟登录我们学校教务处。

  1. from selenium.webdriver import Chrome
  2. if __name__ =='__main__':
  3. web = Chrome()
  4. web.get('http://bkjx.wust.edu.cn/')
  5. username = web.find_element_by_id('userAccount')
  6. username.send_keys('xxxxxxx')# 这里填自己的学号
  7. password = web.find_element_by_id('userPassword')
  8. password.send_keys('xxxxxxx')# 这里填自己的密码
  9. btn = web.find_element_by_xpath('//*[@id="ul1"]/li[4]/button')
  10. btn.click()# do something

因为没有滑块啥的验证,所以就很简单qwq。然后后面进行自己的操作即可。


12.使用代理

  1. from selenium import webdriver
  2. import time
  3. options = webdriver.ChromeOptions()
  4. options.add_argument('--proxy-server=http://ip地址')# 代理IP:端口号# ${chromedriver_path}: chromedriver驱动存放路径
  5. driver = webdriver.Chrome(options=options)
  6. driver.get("https://dev.kdlapi.com/testproxy")# 获取页面内容print(driver.page_source)# 延迟3秒后关闭当前窗口,如果是最后一个窗口则退出
  7. time.sleep(3)
  8. driver.close()

14.更换UA

  1. from selenium import webdriver
  2. import time
  3. agent ='Mozilla/5.0 (iPad; CPU OS 11_0 like Mac OS X) AppleWebKit/604.1.34 (KHTML, like Gecko) Version/11.0 Mobile/15A5341f Safari/604.1'
  4. options = webdriver.ChromeOptions()
  5. options.add_argument('--user-agent='+ agent)# ${chromedriver_path}: chromedriver驱动存放路径
  6. driver = webdriver.Chrome(options=options)
  7. driver.get("https://www.baidu.com")# 获取页面内容print(driver.page_source)# 延迟3秒后关闭当前窗口,如果是最后一个窗口则退出
  8. time.sleep(3)

15.鼠标悬停

  1. if __name__ =='__main__':from selenium import webdriver
  2. from selenium.webdriver.common.action_chains import ActionChains
  3. driver = webdriver.Chrome()import time
  4. start_url ='https://lceda.cn/'
  5. driver.get(start_url)# 定位到需要悬停的标签
  6. move = driver.find_element_by_xpath('//*[@id="headerNav"]/li[1]/a/span')# //*[@id="headerNav"]/li[1]/a/span# 悬停之后需要点击的标签
  7. a = driver.find_element_by_xpath('/html/body/div[1]/div[2]/div[1]/div[1]/div[3]/div[1]/a[2]')# //*[@id="headerNav"]/li[1]/div/a[2]# /html/body/div[1]/div[2]/div[1]/div[1]/div[1]/div/div/div[1]/ul/li[1]/div/a[2]# 悬停点击执行# 创建事件对象
  8. actions = ActionChains(driver)
  9. time.sleep(1)# 记录操作
  10. actions.move_to_element(move)
  11. time.sleep(1.5)# 悬停的点击
  12. actions.click(a)
  13. time.sleep(1)# 开始执行事件
  14. actions.perform()

16.优缺点

selenium能够执行页面上的js,对于js渲染的数据和模拟登陆处理起来非常容易。
selenium由于在获取页面的过程中会发送很多请求,所以效率非常低,所以在很多时候需要酌情使用。

标签: python 爬虫 selenium

本文转载自: https://blog.csdn.net/weixin_45750972/article/details/122611986
版权归原作者 Harris-H 所有, 如有侵权,请联系我们删除。

“Python之Selenium自动化爬虫”的评论:

还没有评论