代码之家  ›  专栏  ›  技术社区  ›  Louis Ng

如何用python请求正确形成对本网站的post请求

  •  1
  • Louis Ng  · 技术社区  · 6 年前

    我想发送post请求的url是 http://www.hkexnews.hk/sdw/search/searchsdw.aspx

    我想做的搜索(手动)只是在“股票代码”中输入“1”,然后单击“搜索”

    我用Python和Chrome扩展“邮递员”多次尝试用以下标题发送POST请求:

    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
    Accept-Encoding: gzip, deflate
    Accept-Language: zh-TW,zh;q=0.9,en-US;q=0.8,en;q=0.7
    Cache-Control: max-age=0
    Connection: keep-alive
    Content-Length: 1844
    Content-Type: application/x-www-form-urlencoded
    Cookie: TS0161f2e5=017038eb490da17e158ec558c902f520903c36fad91e96a3b9ca79b098f2d191e3cac56652
    Host: www.hkexnews.hk
    Origin: http://www.hkexnews.hk
    Referer: http://www.hkexnews.hk/sdw/search/searchsdw.aspx
    Upgrade-Insecure-Requests: 1
    User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36
    

    以下为PARAM:

    today: 20180624
    sortBy: 
    selPartID: 
    alertMsg: 
    ddlShareholdingDay: 23
    ddlShareholdingMonth: 06
    ddlShareholdingYear: 2018
    txtStockCode: 00001
    txtStockName: 
    txtParticipantID: 
    txtParticipantName: 
    btnSearch.x: 35
    btnSearch.y: 8
    

    但没用。

    2 回复  |  直到 6 年前
        1
  •  2
  •   SIM    5 年前

    试试下面的方法。它应该为您获取所需的响应以及根据搜索条件生成的该站点中可用的表格数据。

    import requests
    from bs4 import BeautifulSoup
    
    URL = "http://www.hkexnews.hk/sdw/search/searchsdw.aspx"
    
    with requests.Session() as s:
        s.headers={"User-Agent":"Mozilla/5.0"}
        res = s.get(URL)
        soup = BeautifulSoup(res.text,"lxml")
        payload = {item['name']:item.get('value','') for item in soup.select("input[name]")}
        payload['__EVENTTARGET'] = 'btnSearch'
        payload['txtStockCode'] = '00001'
        payload['txtParticipantID'] = 'A00001'
        req = s.post(URL,data=payload,headers={"User-Agent":"Mozilla/5.0"})
        soup_obj = BeautifulSoup(req.text,"lxml")
        for items in soup_obj.select("#pnlResultSummary .ccass-search-datarow"):
            data = [item.get_text(strip=True) for item in items.select("div")]
            print(data)
    
        2
  •  0
  •   Siddharth Shishulkar    6 年前

    如果新闻网站提供了一个搜索API,并且你可以访问,那么你可以使用邮递员之类的东西来获取搜索结果。否则,你会把结果擦掉的。

    您提到的用例是典型的刮擦。看看是否有搜索api,如果没有 selenium 把结果擦掉。