为什么要用selenium?
前面我们介绍了通过分析 Ajax 请求获取数据,但有时 Ajax 请求的数据被加密了,还有并不是所有的动态网页都是使用 Ajax 的,当我们没有招应付动态页面的时候,就要请出大杀器——selenium, selenium不用去考虑 js 是怎样生成新数据的,而真正实现多见即所得:通过模拟下拉刷新后,js 就自动生成了新的网页源码,在浏览器中看到的页面是什么样,得到的源码就是什么样
之前做滑块验证(https://blog.csdn.net/Jeeson_Z/article/details/82047685)的之后就用过它,这里依旧直接粘贴用法
selenium介绍:https://cuiqingcai.com/5630.html
记住:selenium虽然很好使,但效率很低,所以我们能不用则不用
案例依然选用上篇的 豆瓣电影剧情片排行榜
(https://movie.douban.com/typerank?type_name=%E5%89%A7%E6%83%85&type=11&interval_id=100:90&action=)
这次我们假装它的 Ajax 加密或者不是使用 Ajax 得到新数据
我们先用requests模块直接获取
import requests # 要访问的url url = 'https://movie.douban.com/typerank?type_name=%E5%89%A7%E6%83%85&type=11&interval_id=100:90&action=' # get()访问该动态网页 rsp = requests.get(url) # text属性得到源码 html = rsp.text # 将源码写入到能用浏览器直接打开的html文件 with open('dianying.html','w',encoding='utf-8') as f: f.write(html)
用浏览器打开得到的源码生成的 'dianying.html' 结果如下:
并不能获取到 js 动态生成的电影数据,提取更无从谈起
现在使用selenium模拟下拉刷新来获取
from selenium import webdriver from time import sleep # 要访问的url url = 'https://movie.douban.com/typerank?type_name=%E5%89%A7%E6%83%85&type=11&interval_id=100:90&action=' # 实例化一个浏览器对象 browser = webdriver.Chrome() # 访问url browser.get(url) # 等待数据加载 sleep(3) # 将滚动条移动到页面的底部的语句 js = "var q=document.documentElement.scrollTop=100000" # 共580部电影,每次刷新20个,共刷新29次 for i in range(29): # 执行下拉操作 browser.execute_script(js) # 等待数据加载 sleep(3) # 得到整个大页面的源码 html = browser.page_source # 将源码写入到能用浏览器直接打开的html文件 with open('dianying.html','w',encoding='utf-8') as f: f.write(html)
用浏览器打开得到的源码生成的 'dianying.html' 结果如下:
这样得到的就是所有的电影信息了,这个过程是我们在模拟一个人在用浏览器,根本不关心这些新的电影数据是怎么来的
下载既然已经得到了包含所有电影信息的源码,提取就不在话下了