当我加载页面" http://proxydb.net"使用cURL,或尝试刮取页面,然后响应正文为空。显然,该页面是使用JavaScript动态加载的。
仍然可以加载渲染的源代码的选项是什么?
我尝试使用Firefox驱动程序使用Selenium,但这会在15秒内将CPU使用率提高到100%。我想这不是一个可行的选择,特别是对于涉及使用Selenium抓取100,000多页的大型项目。
此外,要了解动态加载页面的概念。这些如何运作?需要什么代码才能使它们有效?
答案 0 :(得分:0)
When I load the page "http://proxydb.net" using cURL, or try to scrape the page, then the response body is empty
- 因为此特定网站使用用户代理白名单,如果您的用户代理不在白名单中,您只会获得一个空白页面。据推测,所有主要的网络浏览器都列入白名单(Chrome,Internet Explorer,Edge,Safari,Opera等),但这里是一个列入白名单的特定用户代理:
Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36
(在Windows 7 x64上运行的Chrome 65的用户代理),因此,这有效:
curl 'http://proxydb.net/' -H 'User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36'
关于如何动态加载内容,通常使用XMLHttpRequests或旧代码iframe执行。
Apparently, the page is dynamically loaded using JavaScript.
- 错了,这些家伙没有动态加载代理列表,它们直接嵌入到首页(只要你使用白名单用户代理),模糊为
var q = '42.86.831'.split('').reverse().join('');
var yy = /* */ atob('\x4d\x43\x34\x79\x4d\x54\x67\x3d'.replace(/\\x([0-9A-Fa-f]{2})/g, function() {
return String.fromCharCode(parseInt(arguments[1], 16))
}));
var pp = (3109 - ([] + [])) /**/ + (+document.querySelector('[data-numr]').getAttribute('data-numr')) - [] + [];
document.write('<a href="/' + q + yy + '/' + pp + '#http">' + q + yy + String.fromCharCode(58) + pp + '</a>');
(在这种情况下,与data-numr div一起转换为138.68.240.218:3128
- 它实际上是加密的,而解密密钥在div中看起来像<div style="display:none" data-numr="19"></div>
,这里的关键是19)