解析机器人保护站点

Posted

技术标签:

【中文标题】解析机器人保护站点【英文标题】:Parsing bot protected site 【发布时间】:2018-09-19 06:26:17 【问题描述】:

我正在尝试解析网站“https://ih.advfn.com/stock-market/NYSE/gen-electric-GE/stock-price”并从其董事会提取其最新消息。它受到 Cloud-flare 的 bot 保护。我正在使用 python 及其相关库,这就是我到目前为止所拥有的

from bs4 import BeautifulSoup as soup #parses/cuts  the html
import cfscrape
import requests
url = 'https://ih.advfn.com/stock-market/NYSE/gen-electric-GE/stock- 
price'

r=requests.get(url)
html = soup(r.text, "html.parser")
containers = html.find("div","id":"bbPosts")
print(containers.text.strip())

我无法使用 html 解析器,因为该站点会检测并阻止我的脚本。 我的问题是: 如何解析网页以拉取表格数据?

我可以提一下,这是针对我正在学习的安全课程的。我不是出于恶意原因使用它。

【问题讨论】:

你没有。或者你不应该。如果一个网站正在努力开发反抓取机器人,这意味着他们不希望人们抓取他们的数据。如果他们不提供 API,请不要在未经他们同意的情况下抓取他们的网站。至于你的问题,在这个网站上要求教程是题外话。 你怎么知道它会阻止你的脚本?你怎么知道它不起作用?它可能正在运行一些javascript。你需要像Selenium 这样的东西。 我没有将它用于任何类型的项目。我正在用它来练习。 我想熟悉爬虫检测和预防的概念。 @MooingRawr 他们似乎在使用 Angular 的数据绑定,我建议你尝试不同的方法,比如拍摄网站的快照link 【参考方案1】:

有多种方法可以绕过站点保护。您必须确切了解他们是如何阻止您的。

阻止请求的一种常见方法是查看User Agent 标头。客户端(在您的情况下为 requests 库)将通知服务器它的身份。

一般来说,浏览器会说I am a browser,图书馆会说I am a library。然后服务器可以说I allow browsers but not libraries to access my content

但是,对于这种特殊情况,您可以简单地通过发送自己的 User Agent 标头来欺骗服务器。

您可以在此处查看example。尝试使用您的浏览器用户代理。

其他阻止技术包括 IP 范围。绕过此问题的一种方法是通过***。 This 是最容易设置的 ***s 之一。只需在亚马逊上启动一台机器并让这个容器运行。

还有什么可能发生,您可能会尝试访问未在服务器端呈现的单页应用程序。在这种情况下,您应该收到 get 请求是一个非常小的 html 文件,它基本上引用了一个 javascript 文件。如果是这种情况,您需要的是您以编程方式控制的实际浏览器。我建议你看看Google Chrome Headless 但是还有其他的。你也可以使用Selenium

网络爬虫是一个美丽但非常深刻的主题。我认为这些指针应该为您指明正确的方向。


另外,顺便提一下,我的建议是避免使用from bs4 import BeautifulSoup as soup。我会推荐html2text

【讨论】:

以上是关于解析机器人保护站点的主要内容,如果未能解决你的问题,请参考以下文章

CSRF 保护的真正用途是啥?

robots.txt

robots.txt

使用 discord.py 解析嵌入不和谐的 json 数据

未雨绸缪,数据保护之NBU介质备份

保护电子邮件地址免受垃圾邮件机器人/网络爬虫的侵害