#!/usr/bin/env python
# coding=utf-8
from selenium import webdriver
# 打开 PhantomJS 浏览器
driver = webdriver.PhantomJS()
driver.get('http://www.baidu.com')
data = driver.page_source
print data
driver.quit()
#!/usr/bin/env python
# coding=utf-8
from bs4 import BeautifulSoup
from selenium import webdriver
import time
driver = webdriver.PhantomJS()
driver.get('http://www.baidu.com')
time.sleep(3)
data = driver.page_source
soup = BeautifulSoup(data, 'html.parser', from_encoding='utf-8')
temp = html_parse.find_all('a')
print temp
driver.quit()
0x01 动态爬虫
动态爬虫Ajax加载数据,需要用户交互(点击、滚动等)加载数据,这些情况下就需要动态爬虫模拟用户交互:用户交互的本质,实际上就是触发了绑定在DOM节点的事件,所以模拟用户操作就是触发节点事件爬虫分析<a>、<iframe>等)Ajax 请求、跳转等)爬虫实现JavaScript中绑定事件,都会调用addEventListener函数,在页面代码执行前HOOK addEventListener函数就可以捕获到哪些DOM节点绑定了事件addEventListener绑定事件,还有一些inline-script是无法通过HOOK addEventListener来获取,如<div id='ll' onclick="alert('dd')"></div>JavaScript中提供dispatchEvent函数,可以触发指定DOM节点的指定事件onXXXX属性可以通过遍历节点来触发DOMNodeInserted事件来检查页面中的DOM是否发生变化Ajax请求的捕获onResourceRequested可以捕获非主流框架的请求,但需要通过正则匹配筛选出有效请求XMLHttpRequest.open和XMLHttpRequest.send可以准确的捕获请求内容爬虫流程HOOK三个接口:addEventListener、XMLHttpRequest.open、XMLHttpRequest.send<a>、<iframe>、<form>标签,开启页面DOM节点监听,并触发所有的事件,最后输出结果爬虫Tipsjpg、png、css、mp4等HOOK会导致页面阻塞的函数:alert、promptDOM节点太宽泛导致的问题,非常影响效率PhantomJSJavaScript动态解析PhantomJS打开URL时就会利用自己的Webkit内核去执行JavaScriptHOOK所有的网络请求PhantomJS利用page.onResourceRequested方法来HOOK所有的网络请求PhantomJS利用page.evaluate解析JavaScript,这个执行是沙盒式的,它不会去执行网页外的JavaScript代码Ajax的请求,它需要等得到服务器返回数据以后,才继续渲染页面Pythonbin中的phantomjs.exe移至python27文件夹中的Scripts中就可以在Python代码中调用Selenium中的webdriver打开PhantomJS浏览器driver.get方法打开请求的URL,webdriver会等待页面完全加载完成之后才会返回,即程序会等待页面的所有内容加载完成,JS渲染完毕之后才继续往下执行Ajax,程序可能无法知晓是否已经完全加载完毕webdriver提供了许多寻找网页元素的方法,比如find_element_by_*等,也可以再加载完成后,利用BeautifulSoup来分析Chromeheadless支持命令行下工作,看来PhantomJS很快就会被替代了