Python爬虫实战之用selenium爬取某旅游网站是一个比较常见的应用场景。下面我将详细讲解这个完整攻略的实现过程,包括环境配置、代码编写和执行。在过程中我也提供两条示例说明。
环境配置
在使用selenium之前我们需要确保已经安装了最新版的chromedriver,这个在使用selenium的过程中是必不可少的。
下载chromedriver
由于不同的系统版本,需要下载相应的chromedriver:
- 如果你使用的是Linux系统,打开终端并运行如下命令:
bash
wget https://chromedriver.storage.googleapis.com/78.0.3904.105/chromedriver_linux64.zip
- 如果你使用的是MacOS系统,打开终端并运行如下命令:
bash
wget https://chromedriver.storage.googleapis.com/78.0.3904.105/chromedriver_mac64.zip
- 如果你使用的是Windows系统,直接从官网下载相应版本的chromedriver即可。
安装selenium
我们可以使用pip来安装selenium:
pip install selenium
代码编写
在进行爬虫编写之前,我们首先需要分析一下网站的结构和数据来源。在这里我们使用一个旅游网站作为例子,经过分析,我们发现数据来自于网页中的JavaScript代码。这就需要使用selenium来对JavaScript进行模拟。
导入selenium模块
在代码中导入selenium模块,使用webdriver操作浏览器,模拟用户在浏览器中的操作。
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
打开网页
使用selenium模拟浏览器打开网页,代码如下:
driver = webdriver.Chrome('/path/to/chromedriver') # chromedriver的路径
driver.get('https://www.example.com') # 页面的URL
查找元素
在selenium中,我们通过查找元素来实现操作网页的功能。chrome浏览器有个F12
的快捷键,用于打开开发者工具。通过开发者工具就可以找到需要爬取的数据所在的标签和类名(CSS Selector)。
使用selenium进行元素查找,代码如下:
search_box = driver.find_element_by_name('q') # 通过元素名称查找元素
search_box = driver.find_element_by_css_selector('input.gbqfif') # 通过CSS Selector查找元素
操作元素
找到对应的元素之后,我们也可以对元素进行各种操作,例如点击、输入等。使用selenium操作元素,代码如下:
search_box.send_keys('python selenium') # 向输入框中输入文字
search_box.send_keys(Keys.RETURN) # 模拟按下回车键
等待元素加载
如上所述,在爬取动态页面的时候,使用selenium需要等待元素加载完成后再进行操作,否则会出现获取元素失败等各种问题。使用selenium等待元素加载,代码如下:
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "element_id"))
)
示例说明
示例一:获取某旅游网站的酒店信息
在网站中,酒店信息是动态加载的,需要使用selenium等待元素加载完成后再进行爬取。通过浏览器开发者工具查找元素的方式,我们可以确定酒店名称、价格、地址等信息所在的标签和类名(CSS Selector)。
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
hotel_info = []
driver = webdriver.Chrome('/path/to/chromedriver')
driver.get('https://www.example.com/hotels')
try:
# 等待列表加载完成
WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.CSS_SELECTOR, ".list-item"))
)
# 获取列表项
items = driver.find_elements(By.CSS_SELECTOR, ".list-item")
for item in items:
# 获取酒店名称
name = item.find_element(By.CSS_SELECTOR, ".name").text
# 获取酒店价格
price = item.find_element(By.CSS_SELECTOR, ".price").text
# 获取酒店地址
address = item.find_element(By.CSS_SELECTOR, ".address").text
# 将数据存入列表
hotel_info.append({"name": name, "price": price, "address": address})
except:
print("获取数据失败!")
driver.quit()
示例二:模拟登录某旅游网站并获取个人信息
我们也可以使用selenium来模拟用户的登录和操作。使用浏览器开发者工具查找元素的方式,我们可以确定登录用户名、密码和登录按钮所在的标签和类名。提交登录表单后,直接跳转到个人信息页面,我们可以通过查找对应的标签和类名,获得个人信息数据。
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome('/path/to/chromedriver')
driver.get('https://www.example.com/login')
try:
# 输入用户名
username = driver.find_element(By.NAME, "username")
username.send_keys("example")
# 输入密码
password = driver.find_element(By.NAME, "password")
password.send_keys("123456")
# 提交登录表单
login_button = driver.find_element(By.CSS_SELECTOR, ".login-button")
login_button.click()
# 等待页面加载完成
WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.CSS_SELECTOR, ".user-info"))
)
# 获取个人信息
userinfo_text = driver.find_element(By.CSS_SELECTOR, ".user-info").text
print("您的个人信息:\n{}".format(userinfo_text))
except:
print("登录失败!")
driver.quit()
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python爬虫实战之用selenium爬取某旅游网站 - Python技术站