python抓取动态网页(使用Selenium抓取动态渲染页面(有些linelineexport))
优采云 发布时间: 2021-10-29 07:06python抓取动态网页(使用Selenium抓取动态渲染页面(有些linelineexport))
使用 Selenium 抓取动态呈现的页面
网站的部分内容是浏览器通过JavaScript渲染生成的。直接抓取内容时,只能获取到js代码。在这种情况下,我们可以使用一个模拟浏览器操作的库,比如 Selenium。渲染页面,以便您可以获取渲染页面的内容。
安装
首先需要安装chrome浏览器和chromedriver,例如在Mac上:
brew cask install google-chrome
brew cask install chromedriver
以上操作,如果出现超时,需要设置代理,推荐使用*敏*感*词*X-NG。启动*敏*感*词*X-NG后,点击“复制HTTP代理shell导出行”命令,在终端粘贴如下内容:
export http_proxy=http://127.0.0.1:1087;export https_proxy=http://127.0.0.1:1087;
也可以将以上内容添加到~/.bash_profile文件中,一劳永逸地解决终端代理问题。
接下来安装Selenium,在合适的python虚拟环境中,执行:
pip3 install selenium
使用Selenium初始化浏览器对象
除了 Chorome 浏览器之外,Selenium 还支持主要浏览器制造商的产品,例如 Firefox、Edge 和 Safari。
初始化代码如下:
from selenium import webdriver
browser = webdriver.Chrome()
所以我们得到了 Chrome 浏览器对象。也可以在初始化的时候传入参数,比如无接口模式:
from selenium import webdriver
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--headless')
browser = webdriver.Chrome(chrome_options=chrome_options)
访问页面
使用 get() 方法并传入访问页面所需的参数,例如:
from selenium import webdriver
browser = webdriver.Chrome()
browser.get('https://www.taobao.com')
print(broswer.page_source)
brower.close
查找节点
为了在浏览器中完成操作,需要获取页面中的特定节点,比如填充搜索框、模拟点击等。
单节点
Selenium 提供了 find_element_XX() 方法来获取多个单节点,其中搜索方法可以是:
查找方法说明
find_element_by_id
根据节点id获取
find_element_by_name
根据节点名获取
find_element_by_xpath
根据Xpath规则获取
find_element_by_link_text
根据链接文本的内容获取
find_element_by_partial_link_text
根据部分链接文字获取
find_element_by_tag_name
通过标签名称获取
find_element_by_class_name
根据类名获取
find_element_by_css_selector
根据CSS选择器获取
多个节点
如果要获取多个节点,需要使用find_elements()这样的方法,用法和获取单个节点的方法类似。
节点操作
获取节点后,可以进行模拟量输入、点击等操作。常见的操作包括:
方法说明
发送密钥()
输入文本
清除()
清除输入框
点击()
点击
执行 JavaScript
您可以使用execute_script()方法运行JavaScript指令来实现越来越精细的操作,例如滚动浏览器、选择特殊节点等。
获取节点信息
选择和操作节点后,最终目的是获取节点信息,如文本内容、地址信息等。
获取属性
使用 get_attribute() 方法获取所选节点的属性。
获取文本
可以直接使用text属性调用节点内部的文本信息。
延迟等待
在 Selenium 中,get() 方法将在网页框架加载后执行。如果某些页面有额外的Ajax请求,我们可能无法在网页源代码中成功获取信息,因此需要等待一段时间。Selenium 提供了两种延迟等待方法:一种是隐式等待,另一种是显式等待。
隐式等待
当搜索节点并且节点没有立即出现时,隐式等待会等待一段时间(默认为0)来搜索DOM。例如:
from selenium import webdriver
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--headless')
browser = webdriver.Chrome(chrome_options=chrome_options)
browser.implicitly_wait(10)
browser.get('https://www.taobao.com')
input_first = browser.find_elements_by_css_selector('.J_Cat')
for i in input_first:
print(i.tag_name, i.text)
browser.close
显式等待
常用的延迟等待是比较显式的等待,因为页面加载时间主要受网络条件的影响。显式等待找到指定的节点,然后指定最长等待时间。如果在指定时间内没有加载节点,则会抛出超时异常。
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
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--headless')
browser = webdriver.Chrome(chrome_options=chrome_options)
browser.get('https://www.taobao.com')
wait = WebDriverWait(browser, 10)
input = wait.until(EC.presence_of_element_located(
(By.CSS_SELECTOR, 'a[class="logo-bd clearfix"]')))
print(input.text)
browser.close
上面的代码使用WebDriverWait对象,指定等待时间,然后调用until方法,传入等待条件。这样达到效果后,如果指定节点在10秒内加载完成,则返回该节点,否则抛出超时异常。
完整的等待条件和含义请查看Selenium官方网站。