文章目录
Python 提供了许多模拟浏览器运行的库,如 Selenium、Splash、PyV8、Ghost 等。我们可以直接使用模拟浏览器运行的方式来实现,这样就可以做到在浏览器中看到是什么样,抓取的源码就是什么样,也就是可见即可爬。这样我们就不用再去管网页内部的 JavaScript 用了什么算法渲染页面,不用管网页后台的 Ajax 接口到底有哪些参数。
1-Selenium介绍
Selenium 是一个自动化测试工具,利用它可以驱动浏览器执行特定的动作,如点击、下拉等操作,同时还可以获取浏览器当前呈现的页面的源代码,做到可见即可爬。对于一些 JavaScript 动态渲染的页面来说,此种抓取方式非常有效。
2-准备工作
3-基本使用
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
browser = webdriver.Chrome()
try:
browser.get('https://www.baidu.com')
input = browser.find_element_by_id('kw')
input.send_keys('Python')
input.send_keys(Keys.ENTER)
wait = WebDriverWait(browser, 10)
wait.until(EC.presence_of_element_located((By.ID, 'content_left')))
print(browser.current_url)
print(browser.get_cookies())
print(browser.page_source)
finally:
browser.close()
运行代码后发现,会自动弹出一个 Chrome 浏览器。浏览器首先会跳转到百度,然后在搜索框中输入 Python,接着跳转到搜索结果页
此时在控制台的输出结果如下:
可以看到,我们得到的当前 URL、Cookies 和源代码都是浏览器中的真实内容。
所以说,如果用 Selenium 来驱动浏览器加载网页的话,就可以直接拿到 JavaScript 渲染的结果了,不用担心使用的是什么加密系统。
4-声明浏览器对象webdriver.Chrome()
Selenium 支持非常多的浏览器,如 Chrome、Firefox、Edge 等,还有 Android、BlackBerry 等手机端的浏览器。另外,也支持无界面浏览器 PhantomJS。
from selenium import webdriver
#初始化浏览器对象,并将其赋值为browser
#接下来调用 browser 对象,让其执行各个动作以模拟浏览器操作。
browser = webdriver.Chrome()
browser = webdriver.Firefox()
browser = webdriver.Edge()
browser = webdriver.PhantomJS()
browser = webdriver.Safari()
5-访问页面browser.get(url)
我们可以用 get() 方法来请求网页,参数传入链接 URL 即可。
from selenium import webdriver
browser = webdriver.Chrome()
browser.get('https://www.taobao.com')
print(browser.page_source) #page_source 属性可以获取网页的源代码,接着就可以使用解析库(如正则表达式、Beautiful Soup、pyquery 等)来提取信息了
browser.close()
#运行后发现,弹出了 Chrome 浏览器并且自动访问了淘宝
#然后控制台输出了淘宝页面的源代码
#随后浏览器关闭。
6-查找节点
方法 | 描述 | |
---|---|---|
单个节点 | find_element_by_name() | 根据 name 值获取 |
find_element_by_id() | 根据 id 获取 browser.find_element_by_id(‘q’) |
|
find_element_by_css_selector() | 根据css选择器 browser.find_element_by_css_selector(’#q’) |
|
find_element_by_xpath() | 根据XPath选择器 browser.find_element_by_xpath(’//*[@id=“q”]’) |
|
find_element_by_link_text | ||
find_element_by_partial_link_text | ||
find_element_by_tag_name | ||
find_element_by_class_name | ||
find_element() | 传入两个参数:查找方式 By 和值。 find_element_by_id(id) 就等价于 find_element(By.ID, id) |
|
多个节点 | find_elements() | browser.find_elements(By.CSS_SELECTOR, ‘.service-bd li’) 结果是列表类型,列表中的每个节点是 WebElement 类型。 |
find_elements_by_id | ||
find_elements_by_name |