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 브라우저로 검색 할 때와 같은 검색 결과를받는 방법을 파악하는 도움이 필요합니다. 감사합니다.
감사합니다. '__VIEWSTATE' 매개 변수는 페이지로드시 설정됩니다. 나는 하드 코드 된 것을 제거했다. 주요한 문제는 ASMX 웹 서비스에 요청을 보내는'after_parse' 메쏘드의 두 번째 요청에 있습니다. '__VIEWSTATE'가 사용되거나 서버로 보내지는 곳이없고'500 Internal Server' 오류가 계속 발생합니다 –