当前位置:   article > 正文

爬虫之Selenium_编写程序,查找所有名称为li的节点,并输出查找的结果

编写程序,查找所有名称为li的节点,并输出查找的结果

目录

基本用法

查找节点

查找单个节点

查找多个节点

节点交互

点击

 模拟鼠标移动

拖动节点

执行JavaScript代码

获取节点信息

管理cookie

改变节点属性值


基本用法

运行本例之前,需要将chromedriver或chromedriver.exe文件放在当前目录的webdriver子目录中。

运行程序,会立刻启动Chrome浏览器,并打开京东首页,然后在京东首页上方的搜索框中输入“Python从菜鸟到高手”

WebDriverWait类,该类是为了在执行的过程中等待一段时间,这里设置为4秒。、

按Enter键后,并不一定马上显示搜索结果,需要有一定的延长,但python程序不会等待搜索结果出来再往下执行,python程序会一直执行下去,所以如果不等待一定时间,就会造成python程序已经运行到处理搜索结果页面的位置时,搜索结果页面还没显示出来。所以就需要使用WebDriverWait类的until方法判断结果页面是否显示完成。

判断搜索结果页面是否显示完全:如果搜索页面加载完成,页面中所有的节点肯定已经加载完成了,所以只要随便获取页面中的某个节点,如果获取成功,说明已经加载完成。

  1. from selenium import webdriver
  2. from selenium.webdriver.common.keys import Keys
  3. from selenium.webdriver.common.by import By
  4. from selenium.webdriver.support.wait import WebDriverWait
  5. from selenium.webdriver.support import expected_conditions as ec
  6. browser=webdriver.Chrome('D:\chromedriver_win32\chromedriver')
  7. try:
  8. # 打开京东
  9. browser.get('https://www.jd.com/')
  10. # 根据id属性的值查找搜索框
  11. input1=browser.find_element(By.ID,'key')
  12. # 使用send_keys方法向搜索框输入"python从菜鸟到高明"文本
  13. input1.send_keys('python从菜鸟到高明')
  14. # 使用send_keys方法模拟按下<Enter>键
  15. input1.send_keys(Keys.ENTER)
  16. # 创建WebDriverWait对象,设置最长等待时间(4秒)
  17. wait=WebDriverWait(browser,4)
  18. # 等待搜索页面显示(通过查找id为goodsList的节点判断搜索页面是否显示)
  19. wait.until(ec.presence_of_all_elements_located((By.ID,'J_goodsList')))
  20. # 显示搜索页面的标题
  21. print(browser.title)
  22. # 显示搜索页面的URL
  23. print(browser.current_url)
  24. # 显示搜索页面的代码
  25. print(browser.page_source)
  26. # 关闭浏览器
  27. browser.close()
  28. except Exception as e:
  29. print(e)
  30. browser.close()

查找节点

查找单个节点

看源码可知,browser.find_element方法支持(id,name,class_name元素定位)

  1. def find_element(self, by=By.ID, value: Optional[str] = None)
  2. if by == By.ID:
  3. by = By.CSS_SELECTOR
  4. value = '[id="%s"]' % value
  5. elif by == By.CLASS_NAME:
  6. by = By.CSS_SELECTOR
  7. value = ".%s" % value
  8. elif by == By.NAME:
  9. by = By.CSS_SELECTOR
  10. value = '[name="%s"]' % value

查找多个节点

方法同上
区别:browser.find_elements返回一个列表,包含符合条件的所有节点,如果没有符合条件的节点,就会返回空列表(长度为0的列表)

节点交互

点击

click()

 模拟鼠标移动

使用actions.move_to_element方法,以下为ActionChains类常用方法

1、perform():执行所有ActionChains中存储的行为

2、context_click():右击

3、double_click():双击

4、move_to_element():悬停

5、drag_and_drop(source, target):拖动

最后都必须调用perform方法才能生效

  1. from selenium import webdriver
  2. from selenium.webdriver.common.by import By
  3. from selenium.webdriver import ActionChains
  4. import time
  5. browser=webdriver.Chrome('D:\chromedriver_win32\chromedriver')
  6. try:
  7. browser.get('https://www.jd.com/')
  8. # 创建ActionChains对象
  9. actions=ActionChains(browser)
  10. # 通过CSS选择器查找所有class属性值为cate_menu_item的li节点,每一个li节点是一个二级导航菜单
  11. li_list=browser.find_elements(By.CSS_SELECTOR,'.cate_menu_item')
  12. for li in li_list:
  13. actions.move_to_element(li).perform()
  14. time.sleep(1)
  15. except Exception as e:
  16. print(e)
  17. browser.close()

拖动节点

使用drag_and_drop方法拖到节点

  1. from selenium import webdriver
  2. from selenium.webdriver.common.by import By
  3. from selenium.webdriver import ActionChains
  4. browser=webdriver.Chrome('D:\chromedriver_win32\chromedriver')
  5. try:
  6. browser.get('https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable')
  7. # 切换到id属性值为iframeResult的iframe节点上
  8. browser.switch_to.frame('iframeResult')
  9. # 使用CSS选择器获取id属性值为draggable的拖动节点
  10. sourse=browser.find_element(By.CSS_SELECTOR,'#draggable')
  11. # 使用CSS选择器获取id属性值为droppable的接收节点
  12. target = browser.find_element(By.CSS_SELECTOR, '#droppable')
  13. # 创建ActionChains对象
  14. actions=ActionChains(browser)
  15. # 调用drag_and_drop方法拖动节点
  16. actions.drag_and_drop(sourse,target)
  17. # 调用perfrom方法让拖动生效
  18. actions.perform()
  19. except Exception as e:
  20. print(e)
  21. browser.close()

执行JavaScript代码

有些操作Selenium没有提供相应的API,例如下拉页面
可以使用Selenium得execute_script方法直接运行JavaScript代码,便于扩展Selenium功能

  1. from selenium import webdriver
  2. browser=webdriver.Chrome('D:\chromedriver_win32\chromedriver')
  3. browser.get('https://www.jd.com/')
  4. # 将京东商城首页滚动到最底端
  5. browser.execute_script('window.scrollTo(0,document.body.scrollHeight)')
  6. # 弹出对话框
  7. browser.execute_async_script('alert("已经到最底端")')
  8. time.sleep(10)

获取节点信息

如节点位置(相当于页面绝对坐标)、节点名称、节点尺寸(高和宽)、节点属性值

  1. from selenium import webdriver
  2. from selenium.webdriver.common.by import By
  3. options=webdriver.ChromeOptions()
  4. # 添加参数,不然Chrome浏览器显示,只在后台运行
  5. options.add_argument('headless')
  6. browser=webdriver.Chrome('D:\chromedriver_win32\chromedriver',chrome_options=options)
  7. browser.get('https://www.jd.com/')
  8. # 查找页面中id属性值为navitems-group1的第1个节点(是一个ul节点)
  9. ul=browser.find_element(By.ID,'navitems-group1')
  10. # 输出节点的文本
  11. print(ul.text)
  12. # 输出节点内部使用的id,注意,不是id属性值
  13. print('id','=',ul.id)
  14. # 输出节点的位置(相对于页面的绝对坐标)
  15. print('location','=',ul.location)
  16. # 输出节点的名称
  17. print('tag_name','=',ul.tag_name)
  18. # 输出节点的尺寸
  19. print('size','=',ul.size)
  20. # 搜索该节点内的所有名为li的节点
  21. li_list=ul.find_elements(By.TAG_NAME,'li')
  22. for li in li_list:
  23. # 输出li的类型
  24. print(type(li))
  25. # 输出li节点的文本和class属性值,如果属性没找到,返回None
  26. print('<',li.text,'>','class=',li.get_attribute('class'))
  27. # 查找li节点内名为a的子节点
  28. a=li.find_element(By.TAG_NAME,'a')
  29. # 输出a节点的href属性值
  30. print('href','=',a.get_attribute('class'))
  31. browser.close()

基于selenium的爬虫通常会加上headless选项、这样爬取数据过程就不会弹出Chrome浏览器,但是他会在后台进行页面加载、数据提取等工作

管理cookie

获取cookie,添加cookie,删除cookie

  1. from selenium import webdriver
  2. browser=webdriver.Chrome('D:\chromedriver_win32\chromedriver')
  3. browser.get('https://www.jd.com/')
  4. # 获取cookie列表
  5. print(browser.get_cookies())
  6. # 添加新的cookie
  7. browser.add_cookie({'name':'name','value':'jd','domain':'www.jd.com'})
  8. print(browser.get_cookies())
  9. # 删除所有的cookie
  10. browser.delete_all_cookies()
  11. print(browser.get_cookies())

改变节点属性值

selenium没有改变节点属性的API,所以要通过JavaScript代码改变
通过selenium获取的节点可以直接作为DOM使用,意味着在JavaScript代码使用查找到的节点
execute_script方法第1个参数用于指定JavaScript代码,后面的可变参数,可以为JavaScript代码传递参数。通过arguments变量获取每一个参数值,例如arguments[0]第一个参数arguments[0]第二个参数,以此类推

例子1:使用JavaScript代码改变百度搜索按钮的位置,让这个按钮多个位置移动,2秒一次

  1. from selenium import webdriver
  2. from selenium.webdriver.common.by import By
  3. import time
  4. browser=webdriver.Chrome('D:\chromedriver_win32\chromedriver')
  5. browser.get('https://www.baidu.com')
  6. # 查找百度搜索按钮
  7. search_button=browser.find_element(By.ID,'su')
  8. # 定义搜索按钮可以移动的x坐标的位置
  9. x_positions=[50,90,130,170]
  10. # 定义搜索按钮可以移动的y坐标的位置,与x坐标列表中元素的个数要相等
  11. y_positions=[100,120,160,90]
  12. # 迭代位置列表,每隔2秒移动一次搜索按钮
  13. for i in range(len(x_positions)):
  14. # 用于移动搜索按钮的JavaScript代码,arguments[0]就是搜索按钮对应的DOM
  15. js="""
  16. arguments[0].style.position="absolute";
  17. arguments[0].style.left="{}px"
  18. arguments[0].style.top="{}px";
  19. """.format(x_positions[i],y_positions[i])
  20. # 执行JavaScript代码,并开始移动搜索按钮
  21. browser.execute_script(js,search_button)
  22. time.sleep(2)

例子2:修改页面文本以及链接

  1. from selenium import webdriver
  2. from selenium.webdriver.common.by import By
  3. import time
  4. browser=webdriver.Chrome('D:\chromedriver_win32\chromedriver')
  5. browser.get('https://www.jd.com')
  6. # 查找id属性值为navitems-group1的节点
  7. ul=browser.find_element(By.ID,'navitems-group1')
  8. # 查找该节点下所有名为li的子节点
  9. li_list=ul.find_elements(By.TAG_NAME,'li')
  10. # 查找第1个li节点中第一个名为a的子节点
  11. a1=li_list[0].find_element(By.TAG_NAME,'a')
  12. # 查找第2个li节点中第一个名为a的子节点
  13. a2=li_list[1].find_element(By.TAG_NAME,'a')
  14. # 下面的JavaScript代码用于修改上面查找到的两个a节点的文本和链接(href属性值)
  15. js="""
  16. arguments[0].text='Python从菜鸟到高手'
  17. arguments[0].href='https://item.jd.com/12417265.html'
  18. arguments[1].text='极客起源'
  19. arguments[1].href='https://geekori.com'
  20. """
  21. browser.execute_script(js,a1,a2)
  22. time.sleep(5)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/在线问答5/article/detail/768245
推荐阅读
  

闽ICP备14008679号