Search code examples
pythonweb-scrapingrequestpython-requestshttp-status-code-403

Curl command succeeded but python requests get 403 Forbidden


I try to get a data from this website. I get the cUrl command:

curl 'http://mayaapi.tase.co.il/api/report/filter?logo=0' -H 'Origin: http://maya.tase.co.il' -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36' -H 'X-Maya-With: allow' -H 'Content-Type: application/json;charset=UTF-8' -H 'Referer: http://maya.tase.co.il/reports/fund?q=%7B%22DateFrom%22:%222016-12-31T22:00:00.000Z%22,%22DateTo%22:%222018-02-03T22:00:00.000Z%22,%22QOpt%22:1,%22Page%22:1,%22Q%22:%22%D7%93%D7%95%D7%97%20%D7%97%D7%95%D7%93%D7%A9%D7%99%22,%22events%22:%5B%5D,%22subevents%22:%5B%5D%7D' --data-binary $'{"Page":1,"GroupData":[],"DateFrom":"2016-12-31T22:00:00.000Z","DateTo":"2018-02-03T22:00:00.000Z","IsBreakingAnnouncement":false,"IsForTaseMember":false,"IsSpecificFund":false,"Q":"\u05d3\u05d5\u05d7 \u05d7\u05d5\u05d3\u05e9\u05d9","QOpt":1,"ViewPage":4}' --compressed

and when I do it from the command line I get a response. But when I try to do it in python with requests, I get 403 Forbidden.

The python code:

response = requests.post(
                "http://mayaapi.tase.co.il/api/report/filter?logo=0",
                data={
                    "Page": 1,
                    "GroupData": [],
                    "DateFrom": "2016-12-31T22:00:00.000Z",
                    "DateTo": "2018-02-03T22:00:00.000Z",
                    "IsBreakingAnnouncement": False,
                    "IsForTaseMember": False,
                    "IsSpecificFund": False,
                    "Q": "דוח חודשי",
                    "QOpt": 1,
                    "ViewPage": 4,
                },
                headers={
                    "Content-Type": "application/json;charset=UTF-8",
                    "Origin": "http://maya.tase.co.il",
                    "Referer": "http://maya.tase.co.il/reports/fund?q=%7B%22DateFrom%22:%222016-12-31T22:00:00.000Z%22,%22DateTo%22:%222018-02-03T22:00:00.000Z%22,%22QOpt%22:1,%22Page%22:1,%22Q%22:%22%D7%93%D7%95%D7%97%20%D7%97%D7%95%D7%93%D7%A9%D7%99%22,%22events%22:%5B%5D,%22subevents%22:%5B%5D%7D",
                    "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36",
                    "X-Maya-With": "allow",
                },
                cookies={}
            )
            print('req1', response)

I tried anything I can think of, but with no success.


Solution

  • The request did not succeeded because the POST payload (the dict for the data parameter) need to be wrap in json.

    response = requests.post(
        "http://mayaapi.tase.co.il/api/report/filter?logo=0",
        data=json.dumps({
            "Page": 1,
            "GroupData": [],
            "DateFrom": "2016-12-31T22:00:00.000Z",
            "DateTo": "2018-02-03T22:00:00.000Z",
            "IsBreakingAnnouncement": False,
            "IsForTaseMember": False,
            "IsSpecificFund": False,
            "Q": "דוח חודשי",
            "QOpt": 1,
            "ViewPage": 4,
        }),
        headers={
            "Content-Type": "application/json;charset=UTF-8",
            "Origin": "http://maya.tase.co.il",
            "Referer": "http://maya.tase.co.il/reports/fund?q=%7B%22DateFrom%22:%222016-12-31T22:00:00.000Z%22,%22DateTo%22:%222018-02-03T22:00:00.000Z%22,%22QOpt%22:1,%22Page%22:1,%22Q%22:%22%D7%93%D7%95%D7%97%20%D7%97%D7%95%D7%93%D7%A9%D7%99%22,%22events%22:%5B%5D,%22subevents%22:%5B%5D%7D",
            "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36",
            "X-Maya-With": "allow",
        },
        cookies={}
    )
    print('req1', response)