Почему я получаю код 400, когда POST "multipart / form-datain Scrapy. Python 3 - PullRequest
0 голосов
/ 31 марта 2019

Пытается отправить форму безуспешно.Эта форма предназначена для перенаправления и возврата нового URL с PDF.Вот как получить доступ к рассматриваемой странице:

  1. Начать с Страница поиска

  2. Нажмите на вкладку Тип документа

  3. Введите LP, нажмите «Поиск»

  4. Щелкните «Просмотр»

  5. Нажмите «Получить изображение»

  6. Мне интересна кнопка просмотра PDF.

Мне нужно имитировать составные форматы данных, которые выглядят так:

            <form name="courtform" action="http://oris.co.palm-beach.fl.us:8080/PdfServlet/PdfServlet27" method="post" enctype="multipart/form-data">

    <input type="hidden" name="hostURL" value="http://oris.co.palm-beach.fl.us/or_web1/" size="60">
    <input type="hidden" name="pdfPath" value="\\wcp01zfs-03.clerk.local\files2\ORISPDF\" size="60">
    <input type="hidden" name="pdfURL" value="http://oris.co.palm-beach.fl.us/pdf/" size="60">

    <input type="hidden" name="pages" value="1" size="60">
    <!--<input type="hidden" name="pages" value="1" size="60">-->
    <input type="hidden" name="id" value="22590889" size="60">
    <input type="hidden" name="mpages" value="1" size="60">
    <input type="hidden" name="doc_id" value="22590889" size="60">

            <input type="hidden" name="page1" value="image_from_file.asp?imageurl=\\ors_fs\ORImage\O\30336\O.30336.1200.0001.tif" size="60">

    <input type="hidden" name="WaterMarkText" value="1" size="60">

        &nbsp;&nbsp;<input name="button" type="button" value="View PDF" onclick="javascript:ValidateAndSubmit(this.form)">&nbsp;&nbsp;

Вот часть моего кода Scrapy, ответственного за этот запрос:

def get_image(self, response):
        # inspect_response(response, self)
        url = 'http://oris.co.palm-beach.fl.us:8080/PdfServlet/PdfServlet27'
        headers = {   'Connection': 'keep-alive',
                            'origin': "http://oris.co.palm-beach.fl.us",
                            'upgrade-insecure-requests': "1",
                            'dnt': "1",

                            'user-agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36",
                            'accept': "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3",
                            'cache-control': "max-age=0",
                            'Accept-Encoding': 'gzip,deflate',
                             }
        id = response.xpath("//input[@name='doc_id']/@value").extract_first()                     
        body = {'WaterMarkText': '0',
             'hostURL': 'http://oris.co.palm-beach.fl.us/or_web1/',
             'mpages': '1',
             'page1': 'image_from_file.asp?imageurl=\\ors_fs\\ORImage\\O\\30338\\O.30338.0268.0001.tif',
             'pages': '1',
             'pdfPath': '\\wcp01zfs-03.clerk.local\\files2\\ORISPDF\\',
             'pdfURL': 'http://oris.co.palm-beach.fl.us/pdf/',
             }    

        body['doc_id'] = id
        body['id'] = id

        me = MultipartEncoder(fields=body, boundary='------WebKitFormBoundarygGHlhpHs08goICxO')
        me_body = me.to_string()

        headers['Content-Type'] =me.content_type
        headers['Content-Length'] =  me.len



        yield scrapy.Request(url, method = 'POST',  body = me_body,  callback = self.get_pdf, headers = headers)
        yield {'body':me_body}

def get_pdf(self, response):
        inspect_response(response, self)

Всякий раз, когда я запускаю код, я получаю Response 400. Как правильно имитировать эту форму?

ОБНОВЛЕНИЕ:

  • Похоже, мне не нужно указывать Content-Length вручную.

  • После того, как я его удалилработал только один раз.А затем возвращается к ошибке 404.

  • Должна ли граница быть новой для каждого запроса?Из того, что я прочитал, похоже, что нет, поскольку это просто разделитель без каких-либо других целей.

1 Ответ

0 голосов
/ 01 апреля 2019

Мне пришлось автоматизировать весь процесс заполнения формы, и теперь, похоже, все работает нормально.

def get_image(self, response):
        # inspect_response(response, self)
        item = response.meta['item']
        url = 'http://oris.co.palm-beach.fl.us:8080/PdfServlet/PdfServlet27'
        headers = {   
                            'Connection': 'keep-alive',
                            'origin': "http://oris.co.palm-beach.fl.us",
                            'upgrade-insecure-requests': "1",
                            'dnt': "1",

                            'user-agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36",
                            'accept': "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3",
                            'cache-control': "max-age=0",
                            'Accept-Encoding': 'gzip,deflate',
                        }

        body={}
        # Generate body from form
        for  i in response.xpath("//form[@name='courtform']/input"):
            name = i.xpath(".//@name").extract_first()
            val = i.xpath(".//@value").extract_first()
            body[name] =  val
        # Remove watermakr from PDF   
        body['WaterMarkText'] = '0'

        me = MultipartEncoder(fields=body, boundary='----WebKitFormBoundarygGHghpHs08goICxO')
        me_body = me.to_string()

        headers['Content-Type'] =me.content_type




        yield scrapy.Request(url, method = 'POST',  body = me_body,  callback = self.get_pdf, headers = headers, meta={'item' : item})
...