【问题标题】:python web scraping post form data using requests not workingpython web使用请求不工作来抓取表单数据
【发布时间】:2019-10-13 16:51:56
【问题描述】:

我正在尝试使用 requests.session 将输入数据发布到表单中,它返回 500 状态。 我期待看到检索到的搜索结果。

在 Bertrand Martel 的帮助下,我能够解决之前使用 __RequestVerificationToken 和 cookie 的登录问题。我过程的下一步是获取我能够成功获取的搜索页面。现在当我尝试将数据发布到构成搜索条件的表单上的日期字段时失败。当我手动填写表格并按提交时工作。一切对我来说似乎都非常简单,但不确定为什么它不起作用。它仍然是cookie问题吗?任何帮助将不胜感激。

这是我的代码:

import requests
from bs4 import BeautifulSoup

EMAIL = 'myemail@gmail.com'
PASSWORD = 'somepwd'
LOGIN_URL = 'https://www.idocmarket.com/Security/LogOn'
SEARCH_URL = 'https://www.idocmarket.com/RIOCO/Document/Search'


s = requests.Session()
s.get(LOGIN_URL)

result = s.post(LOGIN_URL, data = {
    "Login.Username": EMAIL,
    "Login.Password": PASSWORD
})
soup = BeautifulSoup(result.text, "html.parser")
# Report successful login
print("Login succeeded: ", result.ok)
print("Status code:", result.status_code)

result = s.get(SEARCH_URL)
auth_token  = soup.find("input", {'name': '__RequestVerificationToken'}).get('value')
print('auth token:', auth_token )
print("Get Search succeaeded: ", result.ok)
print("get Search Statusa code:", result.status_code)
result = s.post(SEARCH_URL, data = {
    "__RequestVerificationToken": auth_token,
    "StartRecordDate": "03/01/2019",
    "EndRecordDate": "03/31/2019",
    "StartDocNumber": "",
    "EndDocNumber": "",
    "Book": "",
    "Page": "",
    "Instrument": "",
    "InstrumentGroup": "",
    "PartyType": "Either",
    "PartyMatchType": "Contains",
    "PartyName": "",
    "Subdivision": "",
    "StartLot": "",
    "EndLot": "",
    "Block": "",
    "Section":"",
    "Township": "",
    "Range": "",
    "Legal": "",
    "CountyKey": "RIOCO"
})
print("post Dates succeeded: ", result.ok)
print("post Dates Status code:", result.status_code)
print(result.text)

【问题讨论】:

    标签: python post web-scraping python-requests


    【解决方案1】:

    看来这一次,帖子中需要 xsrf 令牌以及所有现有参数。一个简单的解决方案是获取所有输入值并将其传递给请求:

    import requests
    from bs4 import BeautifulSoup
    
    LOGIN_URL = 'https://www.idocmarket.com/Security/LogOn'
    SEARCH_URL = 'https://www.idocmarket.com/RIOCO/Document/Search'
    EMAIL = 'myemail@gmail.com'
    PASSWORD = 'somepwd'
    
    s = requests.Session()
    s.get(LOGIN_URL)
    
    r = s.post(LOGIN_URL, data = {
        "Login.Username": EMAIL,
        "Login.Password": PASSWORD
    })
    
    if (r.status_code == 200):
        r = s.get(SEARCH_URL)
        soup = BeautifulSoup(r.text, "html.parser")
        payload = {}
        for input_item in soup.select("input"):
            if input_item.has_attr('name'):
                payload[input_item["name"]] = input_item["value"]
        payload["StartRecordDate"] = '09/01/2019'
        payload["EndRecordDate"] = '09/30/2019'
        r = s.post(SEARCH_URL, data = payload)
        soup = BeautifulSoup(r.text, "html.parser")
        print(soup)
    else:
        print("authentication failure")
    

    还可以使用理解列表来编写您可以编写的有效负载:

    temp_pl = [
        (t['name'], t['value']) 
        for t in soup.select("input")
        if t.has_attr('name')
    ]
    payload = dict(temp_pl)
    payload["StartRecordDate"] = '09/01/2019'
    payload["EndRecordDate"] = '09/30/2019'
    

    【讨论】:

    • 谢谢伯特兰。我刚刚得出了同样的结论并更新了我的代码。虽然,您关于提供表单输入字段的代码解决方案要优雅得多。再次感谢您的帮助。
    猜你喜欢
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 2018-04-16
    • 1970-01-01
    • 1970-01-01
    • 2018-06-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多