Как выполнить запросы postrequest в scrapy - PullRequest
0 голосов
/ 11 октября 2018

Я хочу запустить мой паук-скрап с почтовым запросом

import requests
data = {
        'lang': 'en',
        'limit': '10',
        'offset': '0',
        'path': '/content/swisscom/en/about/news',
        'query': '' 
    }
    s_url = 'https://www.swisscom.ch/etc/swisscom/servlets/public/gcr/news/search'
    r = requests.post(url=s_url, data=data)

Пока я выполняю запрос напрямую из python, используя пакет запросов, как указано выше, все работает нормально.Однако, как только я включил его в свой паук, используя «Formrequest»

import json
import scrapy
from scrapy.http import FormRequest

class example(scrapy.Spider):
name = "example"

def start_requests(self):
    data = {
        'lang':    'en',
        'limit': '10',
        'offset': '0',
        'path':    '/content/swisscom/en/about/news',
        'query': ''    
    }
    s_url = 'https://www.swisscom.ch/etc/swisscom/servlets/public/gcr/news/search'
    return[FormRequest(url=s_url, formdata=data, callback=self.parse )]

def parse(self, response):
    test = json.loads(response.text)
    for quote in test['results']:
        yield {
            'url': quote['url']
            }

, я получаю следующую ошибку

2018-10-11 11:45:35 [scrapy.middleware] INFO: Enabled item pipelines:[]
2018-10-11 11:45:35 [scrapy.core.engine] INFO: Spider opened
2018-10-11 11:45:35 [scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)
2018-10-11 11:45:35 [scrapy.extensions.telnet] DEBUG: Telnet console listening on 127.0.0.1:6023
2018-10-11 11:45:36 [scrapy.downloadermiddlewares.retry] DEBUG: Retrying <POST https://www.swisscom.ch/etc/swisscom/servlets/public/gcr/news/search> (failed 1 times): [<twisted.python.failure.Failure twisted.internet.error.ConnectionLost: Connection to the other side was lost in a non-clean fashion: Connection lost.>]
2018-10-11 11:45:36 [scrapy.downloadermiddlewares.retry] DEBUG: Retrying <POST https://www.swisscom.ch/etc/swisscom/servlets/public/gcr/news/search> (failed 2 times): [<twisted.python.failure.Failure twisted.internet.error.ConnectionLost: Connection to the other side was lost in a non-clean fashion: Connection lost.>]
2018-10-11 11:45:36 [scrapy.downloadermiddlewares.retry] DEBUG: Gave up retrying <POST https://www.swisscom.ch/etc/swisscom/servlets/public/gcr/news/search> (failed 3 times): [<twisted.python.failure.Failure twisted.internet.error.ConnectionLost: Connection to the other side was lost in a non-clean fashion: Connection lost.>]
2018-10-11 11:45:36 [scrapy.core.scraper] ERROR: Error downloading <POST https://www.swisscom.ch/etc/swisscom/servlets/public/gcr/news/search>
Traceback (most recent call last): File "C:\ProgramData\Anaconda3\lib\site-packages\scrapy\core\downloader\middleware.py", line 43, in process_request defer.returnValue((yield download_func(request=request,spider=spider)))twisted.web._newclient.ResponseNeverReceived<twisted.python.failure.Failure twisted.internet.error.ConnectionLost: Connection to the other side was lost in a non-clean fashion: Connection lost.>]
2018-10-11 11:45:36 [scrapy.core.engine] INFO: Closing spider (finished)

Может кто-нибудь сказать мне, что означает сообщение об ошибке, ипочему мой запрос не работает в scrapy, в то время как все прекрасно с использованием 'reports.post'?

Большое спасибо заранее

1 Ответ

0 голосов
/ 11 октября 2018

Измените свой метод start_requests следующим образом:

def start_requests(self):
    data = {
        'lang':    'en',
        'limit': '10',
        'offset': '0',
        'path':    '/content/swisscom/en/about/news',
        'query': ''    
    }
    s_url = 'https://www.swisscom.ch/etc/swisscom/servlets/public/gcr/news/search'
    yield FormRequest(url=s_url, formdata=data, callback=self.parse )

Вы yield запрашиваете объект в scrapy, и он делает запрос и анализирует его по методу callback, определенному по запросу.

...