Scrapy 1.8.0 возвращает ошибку 500, но Python код возвращает успех 200 - PullRequest
0 голосов
/ 28 января 2020

Адрес: 'https://planningapi.agileapplications.co.uk/api/application/search?reference=GDO+19%2F12'

Я могу легко загрузить эту страницу с помощью Python библиотеки запросов:

headers = {
            'x-client': 'EXMOOR',
            'x-product': 'CITIZENPORTAL',
            'x-service': 'PA',
            }
url='https://planningapi.agileapplications.co.uk/api/application/search?reference=GDO+19%2F12'
resp = requests.get(url, headers=headers)

или я могу легко загрузить страницу через CURL:

curl 'https://planningapi.agileapplications.co.uk/api/application/search?reference=GDO+19%2F12' -H 'x-product: CITIZENPORTAL' -H 'x-service: PA' -H 'x-client: EXMOOR'

Они оба возвращают результат статуса 200:

{"total":1,"results":[{"id":18468,"reference":"GDO 19/12","proposal":"Prior notification for excavations to bury tanks and trenches to lay water pipes","location":"Land North West of North and South Ley, Exford, Minehead, Somerset.","username":"","applicantSurname":"Mr & Mrs M Burnett","agentName":"JCH Planning Limited","decisionText":null,"registrationDate":"2019-10-04","decisionDate":"2019-10-30","finalGrantDate":null,"appealLodgedDate":null,"appealDecisionDate":null,"areaId":[],"wardId":[],"parishId":[3],"responded":null,"lastLetterDate":null,"targetResponseDate":null}]}

Но Scrapy возвращает ошибку состояния 500:

formdata = {'reference': 'GDO 19/12', }

headers = {
    'x-client': 'EXMOOR',
    'x-product': 'CITIZENPORTAL',
    'x-service': 'PA',
    }

fr = scrapy.FormRequest(
    url='https://planningapi.agileapplications.co.uk/api/application/search',
    method='GET',
    meta=response.meta,
    headers=headers,
    formdata=formdata,
    dont_filter=True,
    callback=self.ref_result_2,
    )

yield fr

Возможно, это так потому что Scrapy использует заглавные буквы в заголовках (я пытался снять их с заглавных букв, но затем Twisted делает то же самое - снова вводит их в заглавные буквы), возможно по какой-то другой причине.

Как настроить Scrapy 1.8.0? код для успешного получения того же результата, что и Python запросов?

1 Ответ

2 голосов
/ 29 января 2020

Это действительно вызвано тем, что Scrapy использует заглавные буквы в полях. Если вы попытаетесь использовать заглавные буквы в команде cURL, вы получите ту же ошибку, что и в Scrapy (вы можете проверить это в настройках Scrapy handle_httpstatus_list в классе паука и напечатав response.text в методе разбора). Как вы уже заявили, Twisted делает то же самое, поэтому переопределение scrapy.http.Headers не является решением.

Однако вы можете сделать трюк, чтобы Twisted не использовал заглавные буквы в определенных c заголовках, как в this Комментарий к выпуску :

# -*- coding: utf-8 -*-
from pprint import pprint
import scrapy
from twisted.web.http_headers import Headers as TwistedHeaders

TwistedHeaders._caseMappings.update({
    b'x-client': b'x-client',
    b'x-product': b'x-product',
    b'x-service': b'x-service',
})

class Foo(scrapy.Spider):
    name = 'foo'
    handle_httpstatus_list = [500]

    def start_requests(self):
        formdata = {'reference': 'GDO 19/12'}
        headers = {
            'x-client': 'EXMOOR',
            'x-product': 'CITIZENPORTAL',
            'x-service': 'PA'
        }
        yield scrapy.FormRequest(
            'https://planningapi.agileapplications.co.uk/api/application/search',
            method='GET', headers=headers, formdata=formdata, callback=self.parse)

    def parse(self, response):
        pprint(response.text)

Теперь вы получите результаты. С другой стороны, согласно RF C 7230 , раздел 3.2. Поля заголовка должны быть без учета регистра.

...