使用谷歌浏览器中的检查元素功能来抓取网站[关闭]
Posted
技术标签:
【中文标题】使用谷歌浏览器中的检查元素功能来抓取网站[关闭]【英文标题】:Using the inspect element feature in google chrome to scrape web sites [closed] 【发布时间】:2013-04-25 14:02:15 【问题描述】:我正在尝试抓取一个网站。通过 Python 中的 "urllib2.urlopen" 或 R 中的 "htmlTreeParse" 进行传统的 HTML 解析,无法从网页中获取数据。这是由服务器有意完成的,因此查看源不会显示显示的数据,但是当我使用谷歌浏览器中的检查元素功能(通过右键单击谷歌浏览器中的网站)时,我能够看到数据(项目列表及其信息)。我的问题是如何以编程方式启动所需的页面并保存每个页面的检查元素。或者,如果我有一个程序可以启动这些链接并以某种方式使用 Control-S 将每个链接的 html 副本保存到本地磁盘。
【问题讨论】:
您尝试解析的页面可能格式错误,因此 urllib2 无法处理,但 Chrome 可以。你也许可以用其他包解析它;见***.com/questions/904644/…、***.com/questions/2676872/…和***.com/questions/904644/…。 这不是格式错误,他们是故意这样做的,因此当您查看源代码时,它没有数据。 【参考方案1】:您可以使用greasemonkey 或tampermonkey 很容易地做到这一点。 您只需在用户脚本中定义 url,然后导航到要调用的页面。 您可以使用包含按计划导航到每个页面的 iframe 的首页。 当页面显示在 iframe 中时,用户脚本就会运行,并且您的数据会被保存。
脚本是基本的 javascript,没什么花哨的,如果您需要入门,请告诉我。 最大的收获是下载文件,这是 JS 的一个相当新的功能,但使用下载库很简单,like mine(无耻)。
所以,基本上,您可以拥有一个带有 url 列表的 textarea,每行一个,抓取一行并将 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])returnif(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("#busines-s-results")[0].outerHTML;
download(code, "yelp_page_"+location.href.split("start=")[1].split("&")[0]+".txt", "x-application/nothing");
);
请注意,它将 html 保存为 .txt 以避免出现有关潜在有害文件的 chrome 警告。 您可以批量重命名它们,或者尝试制作一个新的扩展并将其与浏览器关联。
编辑:忘记提及在 chrome 中关闭文件保存确认以供无人值守使用:设置\显示高级设置...\在下载前询问每个文件的保存位置(取消选中)
【讨论】:
我刚刚添加了tampermonkey,这很好,但我很感谢一些帮助,因为我是一个新手。不知道怎么做,我有一个类似“yelp.ca/…”的链接列表,起始位置是 40,60,80,...,如何使用 Tampermonkey 启动和下载这些链接?跨度> 通过将这些链接保存到磁盘或保存每个链接的检查元素,我的电子邮件是 ghofham@gmail,以防它很长。非常感谢 记住在这些链接上使用查看源代码不会显示显示的数据,这就是为什么我必须将其保存到磁盘或使用检查元素。 我测试了代码显示,它将列表保存为真实的 HTML。 你真是个天才,非常感谢。【参考方案2】:我会查看Selenium 以自动化浏览器功能。您可以通过 id/name 自动搜索,然后检查它是否存在,或者以自动方式解析 html。
【讨论】:
感谢您的评论,这可能有助于启动链接,但我需要将这些页面保存到磁盘 (Ctr-S) 或以某种方式使用 chrome 中的检查元素功能来访问数据。我不认为它这样做以上是关于使用谷歌浏览器中的检查元素功能来抓取网站[关闭]的主要内容,如果未能解决你的问题,请参考以下文章