Tl;Dr
Adapted from my answer https://webapps.stackexchange.com/a/115665/88163 to How to know if Google Sheets IMPORTDATA, IMPORTFEED, IMPORTHTML or IMPORTXML functions are able to get data from a resource hosted on a website? https://webapps.stackexchange.com/q/115664/88163 (also posted by me)
请花一些时间学习如何使用浏览器开发人员工具,以便您能够识别
- 如果数据已作为 JSON/文字 JavaScript 对象或其他形式包含在网页的源代码中
- 网页是否正在执行 GET 或 POST 请求来检索数据以及这些请求何时完成(即作为页面解析的某个点或事件时)
- 如果请求需要 cookie 中的数据
有关如何使用网络浏览器查找有关要导入的网页/数据的有用详细信息的简要指南
- 打开源代码,看看是否包含了需要的数据。有时,数据以 JSON 形式包含并使用 JavaScript 添加到 DOM。在这种情况下,可以使用 Google Sheets 函数或网址获取服务 https://developers.google.com/apps-script/reference/url-fetch/来自 Google Apps 脚本。
- 假设您使用 Chrome。打开开发工具,然后查看“元素”选项卡。在那里你会看到 DOM。确定除了可见元素之外您想要导入的数据是否包含在隐藏/不可见元素中可能会有所帮助,例如
<script>
tags.
- 查看 Source,您也许可以看到 JavaScript 代码。它可能包括您想要作为 JavaScript 对象(通常称为 JSON)导入的数据。
有很多关于谷歌表格 /questions/tagged/google-sheets +网络抓取 /questions/tagged/web-scraping其中提到了使用 importhtml 和/或 importxml 的问题,这些问题已经有了答案,甚至许多都包含代码(JavaScript 片段、Google Apps 脚本函数等),这可能会让您不必使用具有更阶梯式学习的专门网页抓取工具曲线。在这个答案的底部有一个关于使用 Google Sheets 内置函数的问题列表,包括建议的解决方法的注释。
On 有没有一种方法可以在不使用事件侦听器的情况下从文本/事件流获取单个响应? https://stackoverflow.com/q/69654650/1595451询问使用情况事件源 https://developer.mozilla.org/en-US/docs/Web/API/EventSource。虽然这不能在服务器端代码上使用,但答案显示了如何使用html服务 https://developers.google.com/apps-script/guides/html在客户端代码上使用它并将结果检索到 Google 表格。
正如您已经意识到的,Google Sheets 内置函数importhtml()
, importxml()
, importdata()
and importfeed()
仅适用于不需要登录或其他形式身份验证的静态页面。
当使用 JavaScript 动态创建公共页面的内容时,无法使用这些功能访问它,另一方面,网站的网站管理员也可能故意阻止网络抓取。
如何判断内容是否是动态添加的
要使用 Chrome 检查内容是否是动态添加的,
- 打开源数据的 URL。
- Press F12 to open Chrome Developer Tools
- Press Control+Shift+P to open the Command Menu.
- Start typing
javascript
, select Disable JavaScript, and then press Enter to run the command. JavaScript is now disabled.
只要您打开 DevTools,JavaScript 就会在此选项卡中保持禁用状态。
重新加载页面,查看是否显示了您要导入的内容,如果显示则可以导入通过使用 Google Sheets 内置函数,否则这是不可能的,但通过使用其他方法可能是可能的网页抓取.
根据维基百科 https://en.wikipedia.org/wiki/Web_scraping,
网页抓取, 网络收获, or 网络数据提取 is 数据抓取 https://en.wikipedia.org/wiki/Data_scraping用于提取数据 https://en.wikipedia.org/wiki/Data_extraction from websites https://en.wikipedia.org/wiki/Website.
使用robots.txt阻止网络爬虫
网站管理员可以使用 robots.txt 文件来阻止对网站的访问。在这种情况下,结果将是#N/A Could not fetch URL
.
用户代理的使用
网页可以设计为返回特殊的自定义消息而不是数据。
下面有关于 Google Sheets 内置“网络抓取”功能如何工作的更多详细信息
IMPORTDATA、IMPORTFEED、IMPORTHTML 和 IMPORTXML 能够从以下网站托管的资源中获取内容:
- 公开可用。这意味着该资源不需要授权/登录任何服务即可访问它。
- The content is "static". This mean that if you open the resource using the view source code option of modern web browsers it will be displayed as plain text.
- 注意:Chrome 的 Inspect 工具显示解析后的 DOM;在其他作品中,网页的实际结构/内容可以通过 JavaScript 代码或浏览器扩展/插件动态修改。
- The content has the appropriated structure.
- IMPORTDATA 适用于结构化内容
csv
or tsv
与资源的文件扩展名无关。
- IMPORTFEED 适用于 ATOM/RSS 等标记内容
- IMPORTHTML 使用 HTML 形式的标记内容,其中包括正确标记的列表或表格。
- IMPORTXML 使用 XML 或其任何变体(如 XHTML)的标记内容。
- The content doesn't exceeds the maximum size. Google haven't disclosed this limit but the below error will be shown when the content exceeds the maximum size:
url 内容中的资源超出了最大大小。
- Google 服务器不会被 robots.txt 或用户代理阻止。
On W3C 标记验证器 https://validator.w3.org有几种工具可以检查资源是否已正确标记。
关于 CSV 签出是否有已知的服务来验证 CSV 文件 https://stackoverflow.com/q/6738996/1595451
值得注意的是,电子表格
- 应有足够的空间容纳导入的内容; Google Sheets 的电子表格单元格限制为 1000 万个这个帖子 https://webapps.stackexchange.com/a/106508/88163列数限制为 18278,单元格内容(即使是值或公式)也有 5 万个字符。
- 它不能很好地处理大量的单元内内容; “限制”取决于用户屏幕尺寸和分辨率,因为现在可以放大/缩小。
参考
- https://developers.google.com/web/tools/chrome-devtools/javascript/disable https://developers.google.com/web/tools/chrome-devtools/javascript/disable
- https://en.wikipedia.org/wiki/Web_scraping https://en.wikipedia.org/wiki/Web_scraping
Related
- 使用 Google Apps 脚本抓取动态网页 https://stackoverflow.com/q/13788353/1595451
- 使用vba从网站抓取数据 https://stackoverflow.com/q/27066963/1595451
- 通过 Google Docs 阻止网站抓取 https://stackoverflow.com/q/41830988/1595451
- 有没有一种方法可以在不使用事件侦听器的情况下从文本/事件流获取单个响应? https://stackoverflow.com/q/69654650/1595451
软件推荐
- 免费提供网页抓取工具/软件吗? https://softwarerecs.stackexchange.com/q/55071/14228
- 需要最少安装的网络抓取工具的推荐 https://softwarerecs.stackexchange.com/q/60424/14228
网络应用程序
以下问题是关于不同的结果,#N/A Could not fetch URL
- 无法使用IMPORTHTML在 Google 表格中 https://webapps.stackexchange.com/q/110150/88163
类似问题
Some of this questions might be closed as duplicate of this one
- 将 javascript 表导入 Google 文档电子表格 https://stackoverflow.com/q/32020041/1595451
- Importxml 导入内容为空 https://stackoverflow.com/q/34217955/1595451
-
scrape table using google app scripts https://stackoverflow.com/q/46416667/1595451
- 一种答案包括使用 URL Fetch Service 的 Google Apps 脚本代码
- 使用 ImportXML 和 XPath 捕获元素 https://stackoverflow.com/q/47908176/1595451
- 如何将 Javascript 表格导入 Google 电子表格? https://stackoverflow.com/q/49149751/1595451
-
Scrape the current share price data from the ASX https://stackoverflow.com/q/50636351/1595451
- 答案之一包括用于从 JSON 源获取数据的 Google Apps 脚本代码
- 使用 Google 表格进行网页抓取的指南 https://stackoverflow.com/q/58425429/1595451
- 如何通过 IMPORTXML 公式从 Google 表格中的 Indiegogo.com 抓取数据 https://stackoverflow.com/q/58745060/1595451
- 为什么 importxml 和 importhtml 在这里不起作用? https://stackoverflow.com/q/58842048/1595451
-
Google Sheet use Importxml error could not fetch url https://stackoverflow.com/q/61027957/1595451
-
- 一种答案包括使用 URL Fetch Service 的 Google Apps 脚本代码
- Google Sheets - 提取投资组合数据 https://stackoverflow.com/q/65781683/1595451
- 从 API/网页中提取价值 https://stackoverflow.com/q/66506865/1595451
-
IMPORTXML shows an error while scraping data from website https://stackoverflow.com/q/67758527/1595451
- 一个答案表明xhr https://en.wikipedia.org/wiki/XMLHttpRequest使用浏览器开发工具发现请求
-
Replacing =ImportHTML with URLFetchApp https://stackoverflow.com/q/67790221/1595451
- 一种答案包括使用 URL Fetch Service 的 Google Apps 脚本代码
- 如何使用IMPORTXML导入隐藏的div标签? https://stackoverflow.com/q/69093513/1595451
-
Google Sheet Web-scraping ImportXml Xpath on Yahoo Finance doesn't works with french stock https://stackoverflow.com/q/70813962/1595451
- 答案之一包括用于从 JSON 源获取数据的 Google Apps 脚本代码。截至 2023 年 1 月 4 日,它不再有效,很可能是因为 Yahoo!财务部门现在正在对 JSON 进行加密。请参阅泰纳克的回答 https://stackoverflow.com/a/74872266/1595451 to 如何使用 Google Apps 脚本从其对象中提取雅虎财经历史价格数据? https://stackoverflow.com/q/74871762/1595451使用 Crypto.js 的脚本来处理这个问题。
-
How to fetch data which is loaded by the ajax (asynchronous) method after the web page has already been loaded using apps script? https://stackoverflow.com/q/70269171/1595451
- 一个答案建议从服务器读取数据,而不是从网页抓取数据。
- 使用 ImportXML 提取数据 https://stackoverflow.com/q/70914071/1595451
-
Extracting data from web page using Cheerio Library https://stackoverflow.com/q/72673558/1595451
- 一个答案建议使用 API 和 Google Apps 脚本