【问题标题】:How to fetch resultant of a POST request in a web-scraper?如何在 web-scraper 中获取 POST 请求的结果?
【发布时间】:2016-08-08 10:59:34
【问题描述】:

我正在尝试从this website. 中提取数据

有一个表格,其中列出了不同的组织,每个组织的名称是指向包含该组织更多信息的网页的链接。

这些链接不是硬编码的超链接,而是调用 javascript 函数,该函数在调用函数时计算。

<a href="javascript:view_ngo('4309','','1','0')" class="bluelink11px">

BISWASUK SEVASRAM SANGHA    

</a>

因此,仅通过链接是不可能抓取信息的。

是否有任何解决方法来执行 javascript 函数并获取结果网页的 HTML?我正在使用 Python 3,并使用 Beautiful Soup 作为网络爬虫。

【问题讨论】:

  • 你可以试试 Selenium;这将启动一个浏览器。
  • 我认为这样会增加执行时间。我必须浏览 70,000 个网页。 Serge 给出了一个不错的小解决方案。

标签: python python-3.x web-scraping beautifulsoup


【解决方案1】:

首先,javascript 不会在服务器端执行,而是始终在客户端执行。在这里,您应该简单地使用调试工具或浏览器(Firefox 功能 F12 就足够了)来查看单击其中一个链接时会发生什么。您会立即看到 javascript 代码只准备和发送 POST 请求

所以view_ngo(a, b, c, d) 生成以下 POST 请求:

POST http://ngo.india.gov.in/view_ngo_details_ngo.php

有以下数据:

ngo_id=a&records_no=b&page_no=c&page_val=1&issueid=&ngo_black=d&records=

您还可以看到它使用会话 cookie,因此您应该在抓取代码中对其进行规定。

抓取可能是这样的:

cookieProcessor = urllib.request.CookieProcessor()
opener = urllib.request.build_opener(cookieProcessor)
soup = BeautifulSoup(opener.open(
        'http://ngo.india.gov.in/sector_ngolist_ngo.php?psid=&records='))

# find the relevant links and iterate through them for view_ngo(a, b, c, d)

    data = urllib.parse.urlencode({'ngo_id': a, 'records_no': b, 'page_no': c,
        'page_val': '1', 'issue_id':'', 'ngo_black':d, 'records_no':'' }).encode()
    soup2 = BeautifulSoup(opener.open('http://ngo.india.gov.in/view_ngo_details_ngo.php',
        data))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-02
    • 1970-01-01
    • 1970-01-01
    • 2011-12-16
    • 2021-01-12
    • 1970-01-01
    相关资源
    最近更新 更多