动态网页抓取(第二种,通过前端js加密的数据如何获取,大型网站)

优采云 发布时间: 2021-11-24 23:22

  动态网页抓取(第二种,通过前端js加密的数据如何获取,大型网站)

  动态页面的生成有很多种,常见的有两种:

  针对上面提到的其中一种情况,我们将在另一篇文章中详细介绍。这里我们讨论第二个,如何获取前端js加密的数据。当然,我们可以直接分析他们的js来阅读整个网站的js,但是理解一个网站需要很多努力,对于一个大的网站可能网站 整个网站 js 加密方式大家可能看不懂。对于我们的爬虫,还有一个非常强大的可视化和可爬取的方法——selenium

  硒

  这是一个自动化测试工具,可以驱动浏览器(有界面,无界面)执行特定操作,并且可以模拟人类点击、下拉等各种基本操作。对抓取js加密信息非常有效

  安装

  这里我们会写一篇详细的安装教程。可以先搜索相关教程。这里我们需要硒。

  selenium的通用功能演示

  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.Firefox() # 创建一个浏览器对象,这里还可以使用chrome等浏览器

try:

browser.get('https://www.baidu.com')# 打开百度的网页

input = browser.find_element_by_id('kw') # 找到id为kw的元素

input.send_keys('Python') # 给这个元素传递一个值'Python'

input.send_keys(Keys.ENTER) # 使用键盘的enter键

wait = WebDriverWait(browser,10) # 浏览器等待10s

wait.until(EC.presence_of_all_elements_located((By.ID,'content_left'))) # 等待直到出现'content_left'

print(browser.current_url) # 输出浏览器当前的url

print(browser.get_cookies()) # 输出cookie

print(browser.page_source) # 输出网页的当前源码

finally:

browser.close() # 关闭浏览器

  运行代码会发现启动火狐浏览器然后自动打开百度的网页,然后在搜索框中输入Python(如果看不清楚可以手动添加时间模块暂停观察),然后按回车键搜索并显示结果(如果没有看到如上所示,可以添加时间模块)然后关闭它,我们的终端上显示了很多内容。其中一张截图如下:

  %2Fps1vejnUbOp0RAAdpd4K6q%2BkAH7Cem%2FPrpHtStgPgxtv8ta7E&rqlang=cn&rsv_enter=1&rsv_sug3=6&rsv_sug2=0&inputT=242&rsv_sug4=242

  [{'name':'BAIDUID','value':'590E5CC2557B638BFA8336815259E51A:FG=1','path':'/','domain':'.','expiry': 3682926116,'secure': False, 'httpOnly': False), {'name':'BIDUPSID','value': '590E5CC2557B638BFA8336815259E51A','path':'/','domain':'.','expiry': 3682926116,'secure False,'httpOnly': False}, {'name':'PSTM','value':

  ...

  我们可以去浏览器对比一下,发现数据和浏览器是一样的。即我们可以使用selenium来获取网页的内容。Selenium 是我们设置的爬虫,它根据我们为它设置的规则来控制浏览器。并在浏览器中阅读内容。当它真正可见时,它可以被抓取。

  创建浏览器对象的操作步骤

  我们可以使用创建的对象来执行各种操作

  from selenium import webdriver

browser = webdriver.Chrome()

browser = webdriver.Firefox()

browser = webdriver.Edge()

browser = webdriver.PhantomJS()

browser = webdriver.Safari()

  访问页面

  使用get()方法请求一个网页,这里只需要传入一个url即可。比如我们要访问我们的文章,可以在上面代码的基础上运行代码

  url = 'https://www.jianshu.com/p/9b36413506c7'

browser.get(url)

  这里可以打开我们指定的网页,使用起来非常方便。

  查找节点

  selenium 浏览器对象提供了很多方法供我们选择节点信息。

  find_element_by_id

  find_element_by_name

  find_element_by_xpath

  find_element_by_link_text

  find_element_by_tag_name

  find_element_by_class_name

  find_element_by_css_selector

  例如:

  browser.get('https://www.baidu.com')

login_button = driver.find_element_by_link_text('登录')

  这里还有一个通用的方法:

  find_element(By.ID,id) # 需要两个值,一个是搜索方法,一个是搜索值

  如果有多个值,我们可以使用find_elements_by之类的函数来查找,即上面提到的在元素后加一个s的方法同样适用于一般方法:

  find_elements(By.ID,id)

  节点交互

  这里可以使用 .click() send_keys() clear() 等方法来模拟用户的点击、输入、清除等操作来获取节点信息

  当我们使用 selecet_element 方法时,将返回一个 WebElement 对象。这种类型为我们提供了很多节点信息的方法。

  login_button.get_attribute('class)

  切换帧

  网页中有一种节点就是iframe,相当于一个frame。当我们遇到这样的页面时,可以使用switch_to.frame()进行切换。这里需要传入一个参数:另一帧的名称等待延迟

  在网页中,往往是ajax等操作引起的,会导致网页加载较晚,所以我们需要等待一定的时间,确保所有节点都已经加载完毕。

  关于等待还有很多:

  等待条件的含义

  标题_是

  标题是东西

  标题_收录

  标题收录一些东西

  Presence_of_element_located

  加载节点,传入定位原语,如(By.ID,'p')

  visibiltiy_of_element_located

  节点可见,传入定位元组

  可见性_of

  可见的传入节点对象

  Presence_of_all_elements_located

  加载所有节点

  text_to_be_present_in_element

  节点文本收录一些文本

  text_to_be_present_in_element_valve

  一个节点收录某个文本

  frame_to_be_available_and_switch_to_it

  负载和开关

  invisibility_of_element_located

  节点不可见

  element_to_be_clickable

  节点可点击

  staleness_of

  判断节点是否还在DOM中,判断页面是否已经刷新

  aert_is_present

  是否有警告

  前进后退

  back() 和 forward() 方法可以实现浏览器的后退和前进功能

  饼干

  可以对cookies进行获取、添加、删除等操作

  .get_cookie()

  .delete_all_cookie()

  .add_cookie({})

  标签

  browser.switch_to_window 可以切换标签页

  import time

from selenium import webdriver

browser = webdriver.Firefox()

browser.get('https://www.baidu.com')

browser.exexute_script('window.open()')

browser.switch_to_window(broser.window_hadles[1])

browser.get('https://www.taobao.com')

time.sleep(1)

browser.switch_to_window(browser.window_handles[0])

browser.get('https://www.duanrw.cn')

  11. 异常处理

  你可以使用 try...except 来捕捉异常

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线