详细介绍一下Python中如何使用来创建爬虫?
Selenium是一个用来对Web应用程序进行测试的自动化测试工具,能够模拟出用户在浏览器中的各种行为,通过自动化的操作来执行任务,例如说可以模拟用户点击按钮、填写表单、抓取网页内容等,虽然是一个自动化测试工具,但是被很多开发者用来构建网络爬虫,尤其是在一些使用了动态技术进行交互的页面中,这个工具的效果非常好的。可以与多种浏览器兼容,支持了各种的编程语言。
??下面我们以谷歌浏览器为例来演示如何使用Selenium
安装Selenium
??想要使用Selenium,就必须要先安装Selenium,如下所示。
pip install selenium
??此外,Selenium还需要WebDriver来控制浏览器的行为,一般的比较常用的WebDriver有ChromeDriver、GeckoDriver(Firefox)等,这里以ChromeDriver为例,可以在下面的这个连接中获取。
https://storage.googleapis.com/chrome-for-testing-public/131.0.6778.264/win64/chromedriver-win64.zip
设置WebDriver
??Selenium的工作原理是通过WebDriver来控制浏览器行为,来模拟一些用户操作,如下所示。
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
# 设置ChromeDriver路径
chrome_driver_path = 'H:/python-mini-script-warehouse/Selenium/chromedriver-win64/chromedriver.exe'
# 创建Service对象,并传入ChromeDriver路径
service = Service(chrome_driver_path)
# 使用WebDriver启动浏览器
driver = webdriver.Chrome(service=service)
# 访问网站
driver.get('https://www.baidu.com')
# 执行其他操作
driver.quit()
加载网页并获取网页内容
??接下来我们就来通过Selenium来加载网页并且模拟用户操作,如下所示,我们可以通过driver.get()方法加载一个页面,之后可以通过不同的方法获取网页内容。
# 获取网页标题
title = driver.title
print(title)
# 获取网页源代码
html_source = driver.page_source
print(html_source)
??在Selenium中还提供了很多的方法来获取网页上的元素,如下所示。
查找单个元素
element = driver.find_element_by_id('element_id') # 通过ID查找
# 获取元素的文本内容
print(element.text)
# 通过类名查找
element = driver.find_element_by_class_name('class_name')
查找多个元素
elements = driver.find_elements_by_class_name('class_name')
for element in elements:
print(element.text)
??当然还有一些其他的查询操作,如下所示。
- find_element_by_name()
- find_element_by_xpath()
- find_element_by_css_selector()
??从名称上也可以看出了分别是通过名称查找、通过xpath查找、通过Class选择器查找。
处理动态内容
??在上面的介绍中我们提到过Selenium的优势就在于对于JavaScript动态渲染的内容的处理,下面我们就来详细介绍一下。
显式等待
??可以通过WebDriverWait来显式等待某个元素加载完成,如下所示。
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# 等待某个元素出现(如,等待id为"element_id"的元素可见)
element = WebDriverWait(driver, 10).until(
EC.visibility_of_element_located((By.ID, "element_id"))
)
print(element.text)
滚动页面
??在很多页面操作中,内容是需要滚动页面才能进行加载的,这个时候,我们就可以通过JavaScript来执行滚动操作。
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
模拟交互
??通过Selenium我们也可以模拟出一些用户的交互行为,例如点击按钮,输入表单等,如下所示。
# 输入框输入文本
input_box = driver.find_element_by_name('q')
input_box.send_keys('Python Selenium')
# 点击按钮
submit_button = driver.find_element_by_name('btnK')
submit_button.click()
关闭浏览器
??在模拟操作完成之后,我们可以通过如下的操作来关闭浏览器。
driver.quit()
完整的百度搜索实现
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.keys import Keys
import time
# 设置ChromeDriver路径
chrome_driver_path = './Selenium/chromedriver-win64/chromedriver.exe'
# 创建Service对象,并传入ChromeDriver路径
service = Service(chrome_driver_path)
# 使用WebDriver启动浏览器
driver = webdriver.Chrome(service=service)
# 访问网站
driver.get('https://www.baidu.com')
input_box = driver.find_element(By.ID,"kw")
input_box.send_keys('Python')
# 提交搜索(模拟按下回车键)
input_box.send_keys(Keys.RETURN)
# 等待搜索结果加载
time.sleep(2)
# 获取搜索结果并打印
results = driver.find_elements(By.CSS_SELECTOR, '.result.c-container')
for index, result in enumerate(results[:5], start=1): # 获取前5个结果
title = result.find_element(By.CSS_SELECTOR, 'h3').text
link = result.find_element(By.CSS_SELECTOR, 'a').get_attribute('href')
print(f'{index}. Title: {title}, Link: {link}')
# 关闭浏览器
driver.quit()
总结
??Selenium是一个功能强大的浏览器自动化工具,尤其适用于处理动态内容或需要与页面进行交互的场景。尽管它比传统的requests和BeautifulSoup等爬虫库要慢一些,但它能够更好地模拟用户行为,适用于复杂的网页爬取任务。