We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
No matter how far you may fly, never forget where you come from.
动态爬虫
Ajax
用户交互
模拟用户交互
DOM
爬虫分析
<a>
<iframe>
Ajax 请求
跳转
爬虫实现
JavaScript
addEventListener
HOOK addEventListener
inline-script
<div id='ll' onclick="alert('dd')"></div>
dispatchEvent
onXXXX
DOMNodeInserted
onResourceRequested
XMLHttpRequest.open
XMLHttpRequest.send
爬虫流程
HOOK
<form>
爬虫Tips
jpg、png、css、mp4
alert
prompt
PhantomJS
URL
Webkit
page.onResourceRequested
page.evaluate
沙盒式
Python
bin
phantomjs.exe
python27
Scripts
Selenium
webdriver
#!/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()
driver.get
JS
find_element_by_*
BeautifulSoup
#!/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()
Chrome
headless
The text was updated successfully, but these errors were encountered:
最近在研究动态的爬虫,请问,如何在页面加载前,HOOK 这些接口呢(addEventListener、XMLHttpRequest.open、XMLHttpRequest.send)? 使用的是chrome headless +pyppeteer
Sorry, something went wrong.
No branches or pull requests
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
节点监听,并触发所有的事件,最后输出结果爬虫Tips
jpg、png、css、mp4
等HOOK
会导致页面阻塞的函数:alert
、prompt
DOM
节点太宽泛导致的问题,非常影响效率PhantomJS
JavaScript
动态解析PhantomJS
打开URL
时就会利用自己的Webkit
内核去执行JavaScript
HOOK
所有的网络请求PhantomJS
利用page.onResourceRequested
方法来HOOK
所有的网络请求PhantomJS
利用page.evaluate
解析JavaScript
,这个执行是沙盒式
的,它不会去执行网页外的JavaScript
代码Ajax
的请求,它需要等得到服务器返回数据以后,才继续渲染页面Python
bin
中的phantomjs.exe
移至python27
文件夹中的Scripts
中就可以在Python
代码中调用Selenium
中的webdriver
打开PhantomJS
浏览器driver.get
方法打开请求的URL
,webdriver
会等待页面完全加载完成之后才会返回,即程序会等待页面的所有内容加载完成,JS
渲染完毕之后才继续往下执行Ajax
,程序可能无法知晓是否已经完全加载完毕webdriver
提供了许多寻找网页元素的方法,比如find_element_by_*
等,也可以再加载完成后,利用BeautifulSoup
来分析Chrome
headless
支持命令行下工作,看来PhantomJS
很快就会被替代了The text was updated successfully, but these errors were encountered: