2017-05-02 7 views
0

ASP.NET Webform 웹 사이트를 긁어 내려합니다. 소스 페이지를 보면 페이지가로드 될 때마다 서버에서 VarsSessionID을 수신한다는 것을 알 수 있습니다. 계속 단추를 클릭하면 양식에서 AJAX 요청을 ASMX Webserivce으로 보냅니다. 웹 서비스는 검색 결과를 표시하는 새 URL로 리디렉션을 반환합니다.Ajax에서 ASMX 웹 서비스 요청 받기

같이 내가, 아약스 POST 요청을 제출하는 시점에 내 scrapy 거미를 구현 한

: 내가 쿠키를 확인하기 위해 Chrome 개발자 도구를 사용하여 헤더 (요청 및 응답)를 조사

import scrapy 
from scrapy.http import * 
from scrapy.selector import Selector 
import json 
from scrapy.utils.response import open_in_browser 



class TestSpider(scrapy.Spider): 
    name = "test" 
    allowed_domains = ['customer2.videcom.com'] 
    start_urls = ['http://customer2.videcom.com/med- 
    view/VARS/Public/CustomerPanels/requirements.aspx?country=ng&lang=en'] 

def parse(self, response): 
    form_data = { 
     'VarsSessionID': '', 
     '__VIEWSTATE': '/wEPDwULLTE4MTk4NDM5NjEPZBYCAgMPZBYCAgMPFgIeB1Zpc2libGVoZGSNuC4VK36MoPTmce49gcH1j2nxAPDYsLXii0G/syddwQ=='} 
    yield FormRequest.from_response(response, 
            formid='frmChangePage', 
            formdata=form_data, 
            method='POST', 
            callback=self.after_parse, 
            url='http://customer2.videcom.com/med-view/VARS/Public/CustomerPanels/requirements.aspx?country=ng&lang=en', 
            ) 

def after_parse(self, response): 
    print "====RESPONSE===" 
    print response.headers 
    print "==========" 
    print response.request.headers 
    print "==========" 
    VarsSessionID = Selector(response=response).xpath("//*[@id='VarsSessionID']/@value").extract()[0] 
    viewstate = Selector(response=response).xpath("//*[@id='__VIEWSTATE']/@value").extract()[0] 
    print "VarsSessionID: " + VarsSessionID 
    print "__VIEWSTATE: " + viewstate 
    url = "http://customer2.videcom.com/med-view/VARS/Public/WebServices/AvailabilityWS.asmx/GetFlightAvailability?VarsSessionID="+VarsSessionID 
    payload = { 
     "FormData": 
      { 
       'Origin': ['LOS'], 
       'VarsSessionID': VarsSessionID, 
       'Destination': ['ABV'], 
       'DepartureDate': ['05-May-2017'], 
       'ReturnDate': '', 
       'Adults': '1', 
       'Children': '0', 
       'SmallChildren': '0', 
       "Seniors": '0', 
       "Students": '0', 
       "Infants": '0', 
       "Youths": '0', 
       "Teachers": '0', 
       "SeatedInfants": '0', 
       "EVoucher": '', 
       "recaptcha": 'SHOW', 
       "SearchUser": 'PUBLIC', 
       "SearchSource": "requirements" 
      }, "IsMMBChangeFlightMode": 'false' 
    } 
    headers = { 
     'Accept': 'application/json, text/javascript, */*', 
     'Accept-Encoding': 'gzip, deflate, br', 
     'accept-language': 'en_US', 
     'Connection': 'keep-alive', 
     'content-type': 'application/json', 
     'Cookie': {'VarsSessionID':''}, 
     'User-Agent': "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36" 
    } 
    yield Request(url, 
        callback=self.after_search, 
        method='POST', 
        body=json.dumps(payload), 
        headers=headers) 

def after_search(self, response): 
    print "========SEARCH HEADERS========" 
    print response.headers 
    print response.request.headers 
    open_in_browser(response) 

및 다른 헤더 정보. 내가 아래로 Internal Server Error 500가 계속 위의 코드를 실행에

:

2017-05-02 11:52:47 [scrapy.downloadermiddlewares.cookies] DEBUG: 
Sending cookies to: <POST http://customer2.videcom.com/med-view/VARS/Public/WebServices/AvailabilityWS.asmx/GetFlightAvailability?VarsSessionID=3d2048c4-2af5-4065-999f-8df6f162737b> 
Cookie: ASP.NET_SessionId=v2kipt3kr2elvkat5buyajhs 

2017-05-02 11:52:49 [scrapy.downloadermiddlewares.retry] DEBUG: 
Retrying <POST http://customer2.videcom.com/med-view/VARS/Public/WebServices/AvailabilityWS.asmx/GetFlightAvailability?VarsSessionID=3d2048c4-2af5-4065-999f-8df6f162737b> (failed 1 times): 500 
Internal Server Error 
2017-05-02 11:52:49 [scrapy.downloadermiddlewares.cookies] DEBUG: 
Sending cookies to: <POST http://customer2.videcom.com/med-view/VARS/Public/WebServices/AvailabilityWS.asmx/GetFlightAvailability? 
VarsSessionID=3d2048c4-2af5-4065-999f-8df6f162737b> 
Cookie: ASP.NET_SessionId=v2kipt3kr2elvkat5buyajhs 

2017-05-02 11:52:52 [scrapy.downloadermiddlewares.retry] DEBUG: 
Retrying <POST http://customer2.videcom.com/med-view/VARS/Public/WebServices/AvailabilityWS.asmx/GetFlightAvailability? 
VarsSessionID=3d2048c4-2af5-4065-999f-8df6f162737b> (failed 2 times): 
500 Internal Server Error 
2017-05-02 11:52:52 [scrapy.downloadermiddlewares.cookies] DEBUG: 
Sending cookies to: <POST http://customer2.videcom.com/med-view/VARS/Public/WebServices/AvailabilityWS.asmx/GetFlightAvailability? 
VarsSessionID=3d2048c4-2af5-4065-999f-8df6f162737b> 
Cookie: ASP.NET_SessionId=v2kipt3kr2elvkat5buyajhs 

2017-05-02 11:52:54 [scrapy.downloadermiddlewares.retry] DEBUG: Gave up retrying <POST http://customer2.videcom.com/med-view/VARS/Public/WebServices/AvailabilityWS.asmx/GetFlightAvailability? 
VarsSessionID=3d2048c4-2af5-4065-999f-8df6f162737b> (failed 3 times): 
500 Internal Server Error 
2017-05-02 11:52:54 [scrapy.core.engine] DEBUG: Crawled (500) <POST 
http://customer2.videcom.com/med-view/VARS/Public/WebServices/AvailabilityWS.asmx/GetFlightAvailability? 
VarsSessionID=3d2048c4-2af5-4065-999f-8df6f162737b> (referer: 
http://customer2.videcom.com/med-view/VARS/Public/CustomerPanels/requirements.aspx?country=ng&lang=en) 
2017-05-02 11:52:54 [scrapy.spidermiddlewares.httperror] INFO: 
Ignoring response <500 http://customer2.videcom.com/med-view/VARS/Public/WebServices/AvailabilityWS.asmx/GetFlightAvailability? 
VarsSessionID=3d2048c4-2af5-4065-999f-8df6f162737b>: HTTP status code is not handled or not allowed 
2017-05-02 11:52:54 [scrapy.core.engine] INFO: Closing spider 
(finished) 

내가 데이터를 게시 및 I 브라우저로 검색 할 때와 같은 검색 결과를받는 방법을 파악하는 도움이 필요합니다. 감사합니다.

답변

1

요청에 하드 코드 된 __VIEWSTATE 매개 변수를 '신선한'것으로 바꿉니다.

viewstate는 시간이 지나면 유효하지 않게되는 복잡한 상태에 바인딩됩니다.

때로는 ASP 웹 사이트 FormRequest.from_response에서이 매개 변수를 제대로 캐치하지 않으므로 __VIEWSTATE의 압축을 풀 수있는 방법을 보려면 response.body를 확인해야 할 수도 있습니다.

이 작업을 수행하는 방법에 대한 좋은 예

가 여기에 표시됩니다 : 당신의 응답을 https://blog.scrapinghub.com/2016/04/20/scrapy-tips-from-the-pros-april-2016-edition/

+0

감사합니다. '__VIEWSTATE' 매개 변수는 페이지로드시 설정됩니다. 나는 하드 코드 된 것을 제거했다. 주요한 문제는 ASMX 웹 서비스에 요청을 보내는'after_parse' 메쏘드의 두 번째 요청에 있습니다. '__VIEWSTATE'가 사용되거나 서버로 보내지는 곳이없고'500 Internal Server' 오류가 계속 발생합니다 –