ThunderMind
ThunderMind

Reputation: 799

Download file from POST request in scrapy

I know there is builtin middleware to handle downloadings. but it only accept a url. but in my case, my downloading link is a POST request.

When i made that POST request pdf file starts downloading.

Now i want to download that file from POST request in scrapy.

Website is http://scrb.bihar.gov.in/View_FIR.aspx You can enter district Aurangabad and police station Kasma PS

On last column status there is a link to downloading file.

        ps_x = '//*[@id="ctl00_ContentPlaceHolder1_ddlPoliceStation"]//option[.="Kasma PS"]/@value'
        police_station_val = response.xpath(ps_x).extract_first()
        d_x = '//*[@id="ctl00_ContentPlaceHolder1_ddlDistrict"]//option[.="Aurangabad"]/@value'
        district_val = response.xpath(d_x).extract_first()
        viewstate = response.xpath(self.viewstate_x).extract_first()
        viewstategen = response.xpath(self.viewstategen_x).extract_first()
        eventvalidator = response.xpath(self.eventvalidator_x).extract_first()
        eventtarget = response.xpath(self.eventtarget_x).extract_first()
        eventargs = response.xpath(self.eventargs_x).extract_first()
        lastfocus = response.xpath(self.lastfocus_x).extract_first()
        payload = {
            '__EVENTTARGET': eventtarget,
            '__EVENTARGUMENT': eventargs,
            '__LASTFOCUS': lastfocus,
            '__VIEWSTATE': viewstate,
            '__VIEWSTATEGENERATOR': viewstategen,
            '__EVENTVALIDATION': eventvalidator,
            'ctl00$ContentPlaceHolder1$ddlDistrict': district_val,
            'ctl00$ContentPlaceHolder1$ddlPoliceStation': police_station_val,
            'ctl00$ContentPlaceHolder1$optionsRadios': 'radioPetioner',
            'ctl00$ContentPlaceHolder1$txtSearchBy': '',
            'ctl00$ContentPlaceHolder1$rptItem$ctl06$lnkStatus.x': '21',
            'ctl00$ContentPlaceHolder1$rptItem$ctl06$lnkStatus.y': '24',
        }
        headers = {
            'Connection': 'keep-alive',
            'Cache-Control': 'max-age=0',
            'Origin': 'http://scrb.bihar.gov.in',
            'Upgrade-Insecure-Requests': '1',
            'Content-Type': 'application/x-www-form-urlencoded',
            'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36',
            'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
            'Referer': 'http://scrb.bihar.gov.in/View_FIR.aspx',
            'Accept-Encoding': 'gzip, deflate',
            'Accept-Language': 'en-US,en;q=0.9',
        }
        # req = requests.post(response.url, data=payload, headers=headers)
        # with open('pdf/ch.pdf', 'w+b') as f:
        #     f.write(req.content)

Upvotes: 2

Views: 1012

Answers (1)

Georgiy
Georgiy

Reputation: 3561

When You click donwload, webbrowser sends POST request. enter image description here So this answer mentioned by El Ruso earlier is applyable in your case

.....
    def parse(self, response):
    ......
        yield scrapy.FormRequest("http://scrb.bihar.gov.in/View_FIR.aspx",.#your post request configuration, callback=self.save_pdf)

    def save_pdf(self, response):
        path = response.url.split('/')[-1]
        self.logger.info('Saving PDF %s', path)
        with open(path, 'wb') as f:
            f.write(response.body)

Upvotes: 2

Related Questions