我正试图抓一个网站。通过Python中的“urllib2.urlopen”或R中的“htmlTreeParse”进行传统的HTML解析,无法从网页获取数据。这是由服务器故意完成的,因此查看源不会显示显示的数据,但是当我在谷歌浏览器中使用检查元素功能时(右键单击谷歌浏览器中的网站),我就能看到数据(项目清单及其信息)。我的问题是如何以编程方式启动所需的页面并保存每个页面的检查元素。或者,如果我可以有一个程序来启动这些链接并以某种方式使用Control-S
将每个链接的html副本保存到本地磁盘。
答案 0 :(得分:2)
您可以使用greasemonkey或tampermonkey轻松完成此操作。 您只需在用户脚本中定义URL,然后导航到要调用的页面。 您可以使用包含iframe的首页,该iframe按计划导航到每个页面。 当页面显示在iframe中时,用户脚本会运行,并且您的数据会被保存。
脚本是基本的javascript,没什么特别的,如果你需要一个启动器,请告诉我。 最大的问题是下载文件,这是一个相当新的JS功能,但使用下载库很简单like mine(无耻)。
所以,基本上,你可以有一个带有url列表的textarea,每行一个,抓一行并将iframe的.src设置为url,调用usercript。您可以使用CSS查询选择器深入查看页面,或保存整个页面,只需抓取您需要的代码的.outerHTML。我很乐意说明是否需要,但是一旦你开始工作,你将永远不会再次回到服务器 - 服务器上。
编辑:
一个框架调度程序页面,只需将每个所需页面加载到iframe中,从而触发userScript:
<html>
<iframe id=frame1></iframe>
<script>
var base="http://www.yelp.ca/search?cflt=coffee&find_loc=Toronto,%20ON&start="; //the part of the url that stays the same
var pages=[20, 40, 60, 80]; //all the differing url parts to be concat'd at the end
var delay= 1000 * 30; //30 sec delay, adjust if needed
var slot=0; //current shown page's index in pages
function doNext(){
var page=pages[slot++];
if(!page){ page=pages[slot=0]; }
frame1.src=base+page;
}
setInterval(doNext, delay);
</script>
</html>
EDIT2:userScript代码:
// ==UserScript==
// @name yelp scraper
// @namespace http://anon.org
// @version 0.1
// @description grab listing from yelp
// @match http://www.yelp.ca/search?cflt=coffee&find_loc=Toronto,%20ON&start=*
// @copyright 2013, dandavis
// ==/UserScript==
function Q(a,b){var t="querySelectorAll";b=b||document.documentElement;if(!b[t]){return}if(b.split){b=Q(b)[0]}return [].slice.call(b[t](a))||[]}
function download(strData,strFileName,strMimeType){var D=document,A=arguments,a=D.createElement("a"),d=A[0],n=A[1],t=A[2]||"text/plain";a.href="data:"+strMimeType+","+escape(strData);if('download'in a){a.setAttribute("download",n);a.innerHTML="downloading...";D.body.appendChild(a);setTimeout(function(){var e=D.createEvent("MouseEvents");e.initMouseEvent("click",true,false,window,0,0,0,0,0,false,false,false,false,0,null);a.dispatchEvent(e);D.body.removeChild(a);},66);return true;};var f=D.createElement("iframe");D.body.appendChild(f);f.src="data:"+(A[2]?A[2]:"application/octet-stream")+(window.btoa?";base64":"")+","+(window.btoa?window.btoa:escape)(strData);setTimeout(function(){D.body.removeChild(f);},333);return true;}
window.addEventListener("load", function(){
var code=Q("#businessresults")[0].outerHTML;
download(code, "yelp_page_"+location.href.split("start=")[1].split("&")[0]+".txt", "x-application/nothing");
});
请注意,它会将html保存为.txt,以避免针对可能有害的文件发出Chrome警告。 您可以批量重命名它们,或者尝试制作新的扩展程序并将其与浏览器相关联。
编辑:忘记提及在Chrome中关闭未使用的文件保存确认:设置\显示高级设置... \下载之前询问保存每个文件的位置(取消选中)
答案 1 :(得分:1)
我会查看Selenium以自动化浏览器功能。您可以按ID /名称自动执行搜索,然后检查它是否存在,或者以自动方式解析html。