【问题标题】:Getting past an AJAX form using Python Requests使用 Python 请求通过 AJAX 表单
【发布时间】:2016-03-28 13:28:33
【问题描述】:

我一直在尝试使用 python 请求模块通过http://dq.ndc.bsnl.co.in/bsnl-web/residentialSearch.seam 上的表单页面。

我猜测的问题是表单字段中的 AJAX。而且我真的不知道如何使用 Python Requests 发送请求。 我知道这可以通过 Selenium 来完成,但我需要通过请求来完成。

这是我当前的代码:

import requests
headers = {'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:27.0) Gecko/20100101 Firefox/27.0'
           }
payload = {
    "residential": "residential",
    "residential:j_id12": "",
    "residential:firstField": 'a',
    "residential:criteria1": "3",
    "residential:city": "ASIND",
    "residential:button1": "residential:button1",
    "residential:suggestionBoxId_selection": "",
    "javax.faces.ViewState": "j_id1"

}
with requests.Session() as s:
    # print s.headers
    print s.get('http://dq.ndc.bsnl.co.in/bsnl-web/residentialSearch.seam')
    print s.headers
    print s.cookies
    resp = s.post(
        'http://dq.ndc.bsnl.co.in/bsnl-web/residentialSearch.seam',
        data=payload, headers=headers)

    print resp.text

【问题讨论】:

  • “过去”是什么意思?如果在浏览器中查看,它会重定向你吗?
  • 嗯,是的.. 通过过去我的意思是在表单提交后进入下一页。我似乎无法通过请求来做到这一点。我不明白我应该将哪些参数传递给表单。
  • IIRC 由于浏览器中的重定向而发生。 HTTP 请求是按每个请求的请求发送的。如果他们想要你,你不会自动要求更多。一旦你克服了这一点并成功了,试着在你的浏览器中完成这个过程,看看需要哪些标头和 cookie 来单独请求下一页。然后是下一个,然后是下一个。
  • 我已经这样做了。我的会话中也有一个 cookie。这就是我通常将表单提交到页面的方式。这个唯一的问题似乎是表单中的 AJAX。表单操作 POST 到 dq.ndc.bsnl.co.in/bsnl-web/residentialSearch.seam。但那是我还不能开始工作的部分。不过,同样的逻辑适用于大多数其他网站。这个有什么问题?
  • 我不确定!也许其他人会来。我会投票赞成这个问题

标签: python ajax web-scraping python-requests


【解决方案1】:

您非常接近完整的解决方案。首先,您需要有效负载中的AJAXREQUEST 来开始搜索,然后按照重定向到第一个结果页面。下一页您收到更多请求。唯一的问题:没有真正的页尾标记,它从第一页重新开始。所以我必须查看Page x of y的内容。

import re
import requests
import requests.models

# non-standard conform redirect:
requests.Response.is_redirect = property(lambda self: (
    'location' in self.headers and (
        self.status_code in requests.models.REDIRECT_STATI or
        self.headers.get('Ajax-Response', '') == 'redirect'
)))

headers = {
    'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:27.0) Gecko/20100101 Firefox/27.0'
}
payload = {
    "AJAXREQUEST": "loader2",
    "residential": "residential",
    "residential:j_id12": "",
    "residential:firstField": 'a',
    "residential:criteria1": "3",
    "residential:city": "ASIND",
    "residential:button1": "residential:button1",
    "residential:suggestionBoxId_selection": "",
    "javax.faces.ViewState": "j_id1"

}

with requests.Session() as s:
    print s.get('http://dq.ndc.bsnl.co.in/bsnl-web/residentialSearch.seam')
    print s.headers
    print s.cookies
    resp = s.post(
        'http://dq.ndc.bsnl.co.in/bsnl-web/residentialSearch.seam',
        data=payload, headers=headers)

    while True:
        # do data processing
        for l in resp.text.split("subscriber');")[1:]: print l[2:].split('<')[0]

        # look for next page
        current, last = re.search('Page (\d+) of (\d+)', resp.text).groups()
        if int(current) == int(last):
            break

        resp = s.post('http://dq.ndc.bsnl.co.in/bsnl-web/resSrchDtls.seam',
            data={'AJAXREQUEST':'_viewRoot',
                'j_id10':'j_id10',
                'javax.faces.ViewState':'j_id2',
                'j_id10:PGDOWNLink':'j_id10:PGDOWNLink',
            }, headers=headers)

【讨论】:

  • 谢谢!那很完美! :) 你能向我解释一下你对这处房产做了什么吗? :)
  • 属性替换原来的Request.is_redirect,看不懂Ajax-Response
  • 但是一个人如何自己得到这个答案呢?
  • 所以,你得看看is_redirect的原始定义,并进行相应的修改。
  • 但在 Chrome 开发者工具中,我没有在“网络”标签的“文档”部分看到重定向。当应该追踪 3 个“文档”时,我只看到了其中两个。虽然,它确实重定向了。我没有在“文档”中看到重定向。
猜你喜欢
  • 2017-02-18
  • 1970-01-01
  • 2012-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-28
  • 1970-01-01
  • 2020-09-14
相关资源
最近更新 更多