javascript - 使用谷歌浏览器中的检查元素功能来抓取网站

标签 javascript python google-chrome web-scraping screen-scraping

<分区>

我正在尝试抓取一个网站。传统的 HTML 通过 Python 中的 "urllib2.urlopen" 或 R 中的 "htmlTreeParse" 解析,无法从网页中获取数据。这是服务器有意完成的,因此查看源代码不会显示显示的数据,但是当我使用谷歌浏览器中的检查元素功能时(通过右键单击谷歌浏览器中的网站),然后我能够看到数据(元素 list 及其信息)。我的问题是如何以编程方式启动所需的页面并保存每个页面的检查元素。或者,如果我有一个程序可以启动这些链接并以某种方式使用 Control-S
将每个链接的 html 副本保存到本地磁盘。

最佳答案

您可以使用 greasemonkey 或 tampermonkey 轻松完成此操作。 您只需在用户脚本中定义 url,然后导航到要调用的页面。 您可以使用包含按计划导航到每个页面的 iframe 的首页。 当页面显示在 iframe 中时,将运行用户脚本,并保存您的数据。

脚本是基本的 javascript,没什么特别的,如果您需要启动器,请告诉我。 最大的收获是下载文件,这是 JS 的一项相当新的功能,但使用下载库很容易做到,like mine (无耻)。

所以,基本上,您可以拥有一个带有 URL 列表的文本区域,每行一个,抓取一行并将 iframe 的 .src 设置为 URL,调用用户脚本。您可以使用 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==
// @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 中关闭文件保存确认以供无人值守使用:设置\显示高级设置...\下载前询问每个文件的保存位置(取消选中)

关于javascript - 使用谷歌浏览器中的检查元素功能来抓取网站,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16320417/

相关文章:

javascript - 父级的 stopPropagation 正在禁用孙子级的功能

javascript - 何时使用函数式 setState

python - AuthSub 与 Google 应用引擎中的 Text_db

javascript - getElementById 和 querySelectorAll 在 Chrome 中不起作用 ://history

javascript - RichFaces 4.1.0的popupPanel.js中的一个函数如何被覆盖?

javascript - 在组件内部定义自定义 Hook 有什么问题吗?

python - 列表理解和返回多个值的函数

python - 我使用的是哪个版本的 python 时间模块

javascript - 在幕后,Javascript 对象是哈希表吗?

html - 为什么一个 div 比具有相同内容的几个 span 长(仅在 Chrome 中)