动态网页抓取(第二种,通过前端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 来捕捉异常