乐趣区

关于selenium:python自动爬取百度搜索结果

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()

最终输入后果:

对于页面元素的获取:

  1. 在所须要地位右键点击查看
  2. 主动跳转到你须要的元素信息地位,能够通过挪动鼠标到其余元素信息上看到对应页面的内容
  3. 获取元素地位

依据不同的品种能够应用 Selenium 不同的办法

退出移动版