So I need to scrape this site, but everything is dynamic. I can't append to the URL the query param i need so i need to pass it with a POST request. I extracted the headers and the payload but something breaks along the way and i get the results of the starting page, not the page with the sent POST request. Also the JSESSION ID i get at the end is not the same as the one i sent in the headers. Here is my code
# post_URL = "https://lekovi.zdravstvo.gov.mk/drugsregister.searchform"
session = requests.Session()
cookie = session.get(URL).cookies.get("JSESSIONID")
print(cookie)
headers = {
"Accept": "text/javascript, text/html, application/xml, text/xml, */*",
"Accept-Encoding": "gzip, deflate, br",
"Accept-Language": "en-MK,en-US;q=0.9,en-GB;q=0.8,en;q=0.7,mk;q=0.6",
"Connection": "keep-alive",
"Content-Length": "819",
"Content-type": "application/x-www-form-urlencoded; charset=UTF-8",
"Cookie": f"SERVERID=APPC_L2; JSESSIONID={cookie}",
"Host": "lekovi.zdravstvo.gov.mk",
"Origin": "https://lekovi.zdravstvo.gov.mk",
"Referer": "https://lekovi.zdravstvo.gov.mk/drugsregister/overview",
"Sec-Fetch-Dest": "empty",
"Sec-Fetch-Mode": "cors",
"Sec-Fetch-Site": "same-origin",
"Sec-GPC": "1",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.5112.81 Safari/537.36",
"X-Prototype-Version": "1.7",
"X-Requested-With": "XMLHttpReques",
}
payload = {
"t:ac": "overview",
"t:submit": ["submit_3","submit_0"],
"t:formdata": "Db5ytL52OazQLgFwZVqY/TPR99w=:H4sIAAAAAAAAAJVSu0oDQRS9BoRAGhF8NWLho1sDmkYbY0QQYiIGa5md3F1HdmfWO7N5NFb hI1fIFb6BRZ2/oMfYGNhZeFMshrFR7TaYc89c86dcy4fYbS9BAtblIZ6H0OhDdJaICL78bssSUi1WMQZkUDSBCVFoccSxo/QMyxBbahb8rgijITv UyjV/btT8bNtsCoOd9AkyYLB7eFh4m7lxyMVKHAlTSkohqL0cB49Zi12HLEZLjcMCRkuN5JDEz1LWx2y5mFSt/Cf7yW/ t1jxRHrRupHwuthZK3V83V4PniPgfQSdpzMPtZOmYyDSw7JSRpt9EncApgYOwj4NYcTnXM0a9jDpJp7CMp4qo5UHBArQfUqWKB4dQfFEKUSIK7aUXM8HeFDHD261Q2fDi1r7AI898HFFsTKrAPmzLJ3zeZfAt618L1YCeD/3pNX3MaJj8PaxehOSzaFmz82gKu4kRJlEZ7vdjN1xKcN55mbq7PKjnIVSHPI2Gnd5pO2JUZI7TvbGpZhiOuvPlMfmVwLL4CyWl1EGkDAAA=",
"filterByApprovalCarrier": "",
"manufacturerName": "",
"nameNumberOrCode": "paracetamol", # This is the thing i'm searching for, its an input field
"genericNameOrAtc": "",
"filterByModeOfIssuance": "",
"t:zoneid": "gridZone,"
}
d = session.post(URL, headers=headers, data=payload)
print(d.cookies.get("JSESSIONID"))```
CodePudding user response:
To get the data from the server you can use next example:
import requests
import pandas as pandas
from bs4 import BeautifulSoup
url = "https://lekovi.zdravstvo.gov.mk/drugsregister/overview"
api_url = "https://lekovi.zdravstvo.gov.mk/drugsregister.searchform"
data = {
"t:ac": "overview",
"t:submit": '["submit_3","submit_0"]',
"t:formdata": "",
"filterByApprovalCarrier": "",
"manufacturerName": "",
"nameNumberOrCode": "paracetamol",
"genericNameOrAtc": "",
"filterByModeOfIssuance": "",
"t:zoneid": "gridZone",
}
headers = {"X-Requested-With": "XMLHttpRequest"}
soup = BeautifulSoup(requests.get(url).content, "html.parser")
data["t:formdata"] = soup.select_one('#searchForm [name="t:formdata"]')["value"]
# parse the returned data with BeautifulSoup or with pandas:
# soup = BeautifulSoup(
# requests.post(api_url, data=data, headers=headers).json()["zones"][
# "gridZone"
# ],
# "html.parser",
# )
df = pd.read_html(
requests.post(api_url, data=data, headers=headers).json()["zones"][
"gridZone"
]
)[0]
print(df)
Prints:
# Латинично име Генеричко име Јачина Пакување Фармацевтска форма Начин на издавање Производител Носител на одобрение Број на решение Датум на решение Датум на важност Датум на обнова Големопродажна цена без ДДВ Малопродажна цена со ДДВ Варијации Г/О/БС
0 1 IBUPROFEN/PARACETAMOL ALKALOID ibuprofen, paracetamol 200 mg/500 mg 10 таблети (блистер 1 х 10)/кутија филм-обложена таблета BRp АЛКАЛОИД АД Скопје - Фармацевтска, Хемиска, Козметичка индустрија, Скопје, Р. Северна Македонија АЛКАЛОИД АД СКОПЈЕ- фармацевтска, хемиска, козметичка индустрија-Скопје, Република Северна Македонија 11-4851/2 02.10.2019 30.09.2024 NaN 0 0 NaN Г
1 2 IBUPROFEN/PARACETAMOL ALKALOID ibuprofen, paracetamol 200 mg/500 mg 20 таблети (блистер 2 х 10)/кутија филм-обложена таблета BRp АЛКАЛОИД АД Скопје - Фармацевтска, Хемиска, Козметичка индустрија, Скопје, Р. Северна Македонија АЛКАЛОИД АД СКОПЈЕ- фармацевтска, хемиска, козметичка индустрија-Скопје, Република Северна Македонија 11-5026/2 02.10.2019 30.09.2024 NaN 0 0 NaN Г
2 3 PARACETAMOL paracetamol 120 mg/5 ml темно стаклено шише х 100 ml пластична лажичка/кутија сируп BRp РЕПЛЕК ФАРМ ДООЕЛ СКОПЈЕ, Скопје, Р. Северна Македонија РЕПЛЕК ФАРМ ДООЕЛ СКОПЈЕ 11-1862/6 19.07.2016 NaN NaN 0 0 jQuery('#showVarriationsModal_102b50fe87d6c80 .close').click(); Г
3 4 PARACETAMOL paracetamol 500 mg 500 таблети (блистер 50 х 10)/кутија таблета BRp РЕПЛЕК ФАРМ ДООЕЛ СКОПЈЕ, Скопје, Р. Северна Македонија РЕПЛЕК ФАРМ ДООЕЛ СКОПЈЕ 11-3159/4 18.04.2018 NaN NaN 0 0 NaN Г
4 5 PARACETAMOL paracetamol 300 mg 10 супозитории (2 x 5 PVC/PE алвеоли)/кутија супозиторија BRp РЕПЛЕК ФАРМ ДООЕЛ СКОПЈЕ, Скопје, Р. Северна Македонија РЕПЛЕК ФАРМ ДООЕЛ СКОПЈЕ 11-4694/5 12.04.2018 NaN NaN 0 0 NaN Г
5 6 PARACETAMOL paracetamol 500 mg 20 таблети (блистер 2 х 10)/кутија таблета BRp GALENIKA AD, Белград, Србија ГАЛЕНИКА ДООЕЛ Скопје 11-5776/2 03.12.2020 25.09.2024 NaN 0 0 NaN Г
6 7 PARACETAMOL paracetamol 120 mg/5 ml темно стаклено шише х 100 ml пластично лажиче/кутија сируп BRp GALENIKA AD, Белград, Србија ГАЛЕНИКА ДООЕЛ Скопје 11-5777/2 03.12.2020 25.09.2024 NaN 0 0 NaN Г
7 8 PARACETAMOL paracetamol 125 mg 10 супозитории (блистер 2 х 5)/кутија супозиторија BRp PROFARMA Sh.a, Тирана, Албанија ТАРА-ФАРМ дооел 11-689/4 30.03.2017 30.03.2022 NaN 0 0 NaN Г
8 9 PARACETAMOL paracetamol 250 mg 10 супозитории (блистер 2 х 5)/кутија супозиторија BRp PROFARMA Sh.a, Тирана, Албанија ТАРА-ФАРМ дооел 11-690/8 30.03.2017 30.03.2022 NaN 0 0 NaN Г
9 10 PARACETAMOL paracetamol 120 mg/5 ml темно стаклено шише х 100 ml/кутија сируп BRp BOSNALIJEK d.d., Сараево, Босна и Херцеговина Претставништво БОСНАЛИЈЕК Д.Д. 11-8985/2 11.06.2019 NaN NaN 0 0 NaN Г