JavaScript 动态渲染的页面不止 Ajax 这一种
另外有的ajax渲染接口含有很多加密参数,难以直接找出其规律
通过模拟浏览器运行的方式来实现,Selenium、Splash、PyV8、Ghost 等
7.1 Selenium的使用
自动化测试工具,支持多种浏览器。
爬虫中主要用来解决js渲染问题
用 Selenium 来驱动浏览器加载网页的话,可以直接拿到JavaScript 渲染的结果了,加密不用再担心。
1- 声明浏览器对象
browser = webdriver.Chrome()
2- 访问页面
browser.get('https://www.taobao.com')
3- 查找节点
input_first = browser.find_element(By.ID, 'q') #单个节点
lis = browser.find_elements_by_css_selector('.service-bd li')
4- 节点交互
...
5- 获取节点信息
通过 page_source 属性可以获取网页的源代码,获取源代码之后就可以使用解析库如正则、BeautifulSoup、PyQuery 等来提取信息了。
不过 Selenium 已经提供了选择节点的方法,返回WebElement 类型,可以通过相关方法或属性来解析
6- 获取属性
7- 切换frame
8- 延时等待
确保节点已经加载出来
- 隐式等待
当查找节点而节点并没有立即出现的时候,隐式等待将等待一段时间再查找 DOM,默认的时间是 0。 implicitly_wait()
- 显式等待
指定好要查找的节点,然后指定一个最长等待时间。如果在规定时间内加载出来了这个节点,那就返回查找的节点,如果到了规定时间依然没有加载出该节点,则会抛出超时异常。