python版本:3.8
pip install BeautifulSoup4
pip install selenium
pip install requests

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from bs4 import BeautifulSoup
import time 
import requests

#选择浏览器驱动(还可以选择webdriver.Firefox;webdriver.Ie;相关浏览器的驱动需要自行下载)
driver = webdriver.Chrome(executable_path="F:\code\简书\chromedriver")
driver.get("http://www.baidu.com")

#下一行是用assert的方式确认标题是否包含“Python”一词
assert "百度" in driver.title

#如果某些元素不是立即可用的,隐式等待是告诉WebDriver去等待一定的时间后去查找元素。 默认等待时间是0秒,一旦设置该值,隐式等待是设置该WebDriver的实例的生命周期。
driver.implicitly_wait(5) # seconds

#在浏览器搜索栏插入python
driver.find_element_by_id('kw').send_keys('python')

# 模拟回车操作 ,开始搜索
driver.find_element_by_id('su').send_keys(Keys.ENTER)
driver.implicitly_wait(3) # seconds

#此处如果不sleep,下面获取到的数据可能为空 (https://blog.csdn.net/manmanxiaowugun/article/details/89646135)
time.sleep(3)

# 使用BeautifulSoup解析搜索结果
#bsobj = BeautifulSoup(driver.page_source, features="html.parser")

# 获取搜索结果队列
#search_results = bsobj.find_all('div', {'class': 'result c-container'})

"""
此处使用的是find_elements_by_css_selector,
根据其右键“下一页”的检查获取到其js path并进行修改:document.querySelector("#page > div > a:nth-child(12)")
pop() 函数用于获取列表中的一个元素(默认为最后一个元素),并且返回该元素 的值。pop()或 pop(-1)默认获取一组元素中的最后一个
driver.find_elements_by_css_selector("#page > div > *").pop().click()

driver.find_element_by_css_selector("#page > div > a.[nth-last-child(1)]")不知为何不生效???????????
"""

def get_real_url(url):
   try:
      #如果不设置timeout,会导致下面出结果较慢,超时后直接返回百度的链接(example:http://www.baidu.com/link?url=TMx1usYKo-ncZAXpBq4rjaJ535T9G78lQyuxANxqHAQ9Ckwt7JVh4s89C1yEJ6a7vsGuef6Qa2dWMuXinJnpBa)
      real_url=requests.get(url, timeout=1).url 
      return real_url
   except:
      return url

#取前两页的标题和链接地址
for i in range(2):
   driver.implicitly_wait(3) # seconds
   bsobj = BeautifulSoup(driver.page_source, features="html.parser")
   search_results = bsobj.find_all('div', {'class': 'result c-container'})
   for iteam in search_results:
      print (iteam.h3.a.get_text(strip=True) + " " + get_real_url(iteam.h3.a.get('href')))

   #刷新当前页面要不然获取下一页元素是会报错(" stale element reference: element is not attached to the page document" 陈旧元素引用:元素没有附加到页面文档中)
   print ('\n')
   driver.refresh()
   driver.find_elements_by_css_selector("#page > div > *").pop().click()


"""
当你向通过CSS选择器查找元素时使用这个。 在该策略下,页面中第一个匹配该CSS 选择器的元素 会被匹配并返回。如果找不到任何元素,会抛出 NoSuchElementException 异常。
作为示例,页面元素如下所示:
<html>
 <body>
  <p class="content">Site content goes here.</p>
</body>
<html>
"""
#driver.find_element_by_css_selector('div.result')

"""
#test用
time.sleep(5)

#实例化函数
elem = driver.find_element_by_id('kw')
#清空搜索项
elem.clear()
#插入搜索项目
elem.send_keys("pycon")
#回车
elem.send_keys(Keys.RETURN)
assert "No results found." not in driver.page_source
"""
driver.close()

最终输出结果:
image.png
关于页面元素的获取:

  1. 在所需要位置右键点击检查image.png
  2. 自动跳转到你需要的元素信息位置,可以通过移动鼠标到其他元素信息上看到对应页面的内容image.png
  3. 获取元素位置image.png

根据不同的种类可以使用Selenium不同的方法


PokerLi
1 声望0 粉丝