Python爬虫使用Selenium+PhantomJS抓取Ajax和动态HTML内容
简介
在实际的爬虫使用中,经常会遇到需要抓取动态加载(AJAX)的数据和动态生成的HTML内容。例如,一个网页上有一个下拉菜单,选择不同的选项后,网页会通过AJAX请求新的数据并将结果展现在页面上。
这种情况下,传统的爬虫技术(如request+beautiful soup)已经无法满足我们的需求了。此时我们需要使用Selenium+PhantomJS来模拟浏览器的行为,执行JavaScript代码来获取动态内容。
准备工作
在使用Selenium+PhantomJS进行爬虫前,需要安装Selenium和PhantomJS。
- 安装Selenium:
pip install selenium
- 安装PhantomJS:从官方网站下载安装包,解压后将可执行文件添加到环境变量中即可。
使用Selenium+PhantomJS抓取动态内容
以豆瓣读书为例,我们来演示如何使用Selenium+PhantomJS来抓取动态内容。
打开网页
首先,我们需要打开网页:
from selenium import webdriver
driver = webdriver.PhantomJS()
driver.get('https://book.douban.com/tag/%E7%BB%8F%E6%B5%8E%E5%AD%A6') # 打开豆瓣读书的经济学标签页
模拟点击动作
在网页上选择了一个标签后,会自动通过AJAX请求获取新的图书列表,我们需要模拟点击标签来触发这个AJAX请求。
element = driver.find_element_by_xpath('//a[@title="经济学"]') # 找到标签链接
element.click() # 模拟点击
获取动态加载的内容
当我们点击了标签后,会自动加载新的图书列表。我们需要等待这个新的图书列表加载完成后,再去获取数据。为此,我们需要使用Selenium提供的等待函数来等待页面加载完成:
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# 等待图书列表加载完成
wait = WebDriverWait(driver, 10)
element = wait.until(EC.presence_of_element_located((By.ID, 'subject_list')))
等待函数会等待直到页面上有了ID为subject_list
的元素,表示新的图书列表已经加载完成了。
接着,我们可以使用element
来获取新的图书列表的内容:
# 获取新的图书列表
books = element.find_elements_by_class_name('subject-item')
for book in books:
# 处理每个图书的详细信息
pass
完整代码示例
from selenium import webdriver
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.PhantomJS()
driver.get('https://book.douban.com/tag/%E7%BB%8F%E6%B5%8E%E5%AD%A6')
# 模拟点击动作
element = driver.find_element_by_xpath('//a[@title="经济学"]')
element.click()
# 等待图书列表加载完成
wait = WebDriverWait(driver, 10)
element = wait.until(EC.presence_of_element_located((By.ID, 'subject_list')))
# 获取新的图书列表
books = element.find_elements_by_class_name('subject-item')
for book in books:
# 处理每个图书的详细信息
pass
# 关闭浏览器
driver.quit()
示例说明
示例一:模拟登录GitHub获取私人仓库信息
有一些仓库是私人的,必须要登录后才能查看到。我们可以使用Selenium模拟GitHub登录,然后通过爬虫访问私人仓库的内容。
from selenium import webdriver
# 打开GitHub登录页面
driver = webdriver.PhantomJS()
driver.get('https://github.com/login')
# 填写用户名和密码
username = driver.find_element_by_id('login_field')
password = driver.find_element_by_id('password')
username.send_keys('your_username')
password.send_keys('your_password')
# 提交表单
form = driver.find_element_by_xpath('//input[@type="submit"]')
form.submit()
# 等待页面加载
driver.implicitly_wait(10)
# 访问私人仓库页面
driver.get('https://github.com/your_username/your_private_repository')
# 获取私人仓库的内容
content = driver.page_source
# 关闭浏览器
driver.quit()
示例二:模拟抢购
网上抢购是一个常见的需求。我们可以使用Selenium模拟浏览器行为,自动完成抢购流程。
from selenium import webdriver
# 打开购买页面
driver = webdriver.PhantomJS()
driver.get('https://www.example.com/buy')
# 点击抢购按钮
button = driver.find_element_by_xpath('//input[@type="submit"]')
button.click()
# 验证抢购是否成功
wait = WebDriverWait(driver, 10)
element = wait.until(EC.presence_of_element_located((By.ID, 'success_message')))
is_success = '抢购成功' in element.text
# 关闭浏览器
driver.quit()
以上就是使用Selenium+PhantomJS来抓取动态内容的攻略。希望能够帮助大家更好地完成爬虫任务。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python爬虫使用Selenium+PhantomJS抓取Ajax和动态HTML内容 - Python技术站