python抓取动态网页(使用Selenium抓取动态渲染页面(有些linelineexport))

优采云 发布时间: 2021-10-29 07:06

  python抓取动态网页(使用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官方网站。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线