解析机器人保护站点
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
【讨论】:
以上是关于解析机器人保护站点的主要内容,如果未能解决你的问题,请参考以下文章