如何从不使用 POST 的网站上抓取信息

How to scrape information from a website that doesn't use POST

我需要从使用 HTML select 过滤其内容的网站获取一些信息。但是,我在这样做时遇到了困难,因为当更改 select 的值时,网站不会 'reload' 它使用一些内部函数来获取新内容。

有问题的网页是 this,如果我使用 Chrome 开发人员工具来查看当我更改 select 的值时会发生什么。我接到一个这样的电话。

index.php?eID=dmmjobcontrol&type=discipline&uid=77&_=1535893178522

有趣的是,uid 是 select 选项的 id,所以我们得到了正确的 id。但是,当我转到这个 link 时,我只看到一个页面说 null.

考虑到类似的网站,this one。当我在那里更改 select 表单时,我得到了一个表单数据,我可以用它来获取我想要的信息。

我对数据抓取还很陌生,老实说,我不明白如何获得这些信息。如果它用于某些用途,我在 python 中使用 scrapy 来解析来自网站的信息。

一个解决方案是使用客户端层来执行:您的抓取 "script" 和网站发送的所有 javascript,模拟真实的浏览器。我成功地将 PhantomJS 与 Selenium aka Webdriver API 一起用于此: https://selenium-python.readthedocs.io/getting-started.html

请注意,从历史上看,Selenium 是第一个这样做的产品,因此这个 API 的名称。在我看来,PhantomJS 更适合,默认情况下是无头的(没有 运行 任何 GUI 进程)并且速度更快。 Selenium 和 PhantomJS 都实现了一个名为 Webdriver 的协议,您的 Python 程序将使用该协议。

这听起来可能很复杂,但请使用上面引用的入门文档并检查它是否适合您。

编辑: 本文还包含使用所述设置的简单示例: https://realpython.com/headless-selenium-testing-with-python-and-phantomjs/

请注意,在许多文章中,人们都会做类似的测试,因此甚至没有提到术语 "scraping"。但从技术上讲是相同的 - 模拟用户在浏览器中单击并最终从特定页面元素获取数据。