Обход страницы с помощью python

#python #python-3.x #web-scraping #web-crawler

#python #python-3.x #очистка веб-страниц #веб-сканер

Вопрос:

Я должен обследовать все эти результаты на этой странице:http://www.carnival.com.au/Find-A-Cruise/search-results.aspx?ShipCode=LE amp;

Проблема в том, что нет возможности отобразить их все. Пока я успешно обхожу начальную страницу, но не могу перейти на другие страницы. Как это сделать?

Комментарии:

1. Какие инструменты вы используете? Можете ли вы предоставить код, который у вас есть на данный момент?

2. Взгляните на обработчик события click на кнопке — он отправляет в конечную точку (‘ carnival.com.au/DomainData/SailingSearch/Get /’ ) и получение JSON в ответ.

Ответ №1:

Последующие страницы загружаются с помощью JavaScript путем разбивки на страницы. Вы видите, что запрос отправляется на "http://www.carnival.com.au/DomainData/SailingSearch/Get/" с некоторыми параметрами в запросе POST. Если вы имитируете тот же запрос, вы получаете обратно данные JSON, содержащие информацию о переходе.

 import requests
sesh = requests.Session()
first_page = sesh.get("http://www.carnival.com.au/Find-A-Cruise/search-results.aspx?ShipCode=LEamp;#UBSELBWf2tB4Rs1H.97")
data = {"ShipCode": "LE", "CurrencyCode": "AUD", "PageSize": 5, "PageNumber": 2, "SortExpression": "FirstSailDate"}
page_2 = sesh.post("http://www.carnival.com.au/DomainData/SailingSearch/Get/", data=data)
cruise_data = page_2.json()
  

Ответ JSON даже достаточно любезен, чтобы показать, сколько всего имеется результатов, которые вы можете использовать для более эффективного запроса последующих страниц.

Некоторый пример вывода этого JSON.

 {'CurrentPage': '2',
 'CurrentResultsCount': '6 - 10',
 'LastPage': '9',
 'SortExpression': 'FirstSailDate',
 'TotalResultsCount': 44,
 'Voyages': [{'BookNowUrl': 'http://booking.carnival.com.au/index.asp?AIID=44amp;overridePageID=651amp;currentPageID=650amp;processingObjectIDList=21604amp;search
Mode=searchByNumberamp;searchByNumberCriteria=G639amp;searchByCriteriaStatus=goamp;voyageCode=G639amp;voyageName=G639amp;shipCode=LEamp;shipName=Legendamp;brandCode=CLamp;bra
ndName=Carnival Cruise Linesamp;homeCityCode=SYDamp;airCityCode=SYDamp;homeCityName=Sydneyamp;airCityNameSydneyamp;tDef=amp;tourName=amp;duration=10amp;embarkDate=2016121
7amp;tType=Oamp;tDirection=Ramp;destinationCode=Iamp;destinationName=Pacific Islandsamp;cruiseSelected=yesamp;unbundling=-amp;switchPolarRegion=prdamp;currencyCode=AUD',
              'CruiseCode': 'G639 ',
              'CruiseNights': 10,
              'DateRangeText': '17 Dec 2016 (Sat - Tue)',
              'DeparturePortCode': 'SYD',
              'DeparturePortName': 'Sydney',
              'FromBPrice': '1,699.00 AUD',
              'FromIPrice': '1,549.00 AUD',
              'FromOPrice': '1,649.00 AUD',
              'FromQuadPrice': '1,689.00 AUD',
              'FromSPrice': '2,649.00 AUD',
              'FromTwinPrice': '1,549.00 AUD',
              'MetaCategory': 'P',
              'MetaCategoryDescription': 'Pacific Islands',
              'PortsVisited': [{'CruiseDay': 0,
                                'PortCode': 'SYD',
                                'PortName': 'Sydney'},
                               {'CruiseDay': 1,
                                'PortCode': 'NOU',
                                'PortName': 'Noumea'},
                               {'CruiseDay': 2,
                                'PortCode': 'MY2',
                                'PortName': 'Mystery Island'},
                               {'CruiseDay': 3,
                                'PortCode': 'LIF',
                                'PortName': 'Lifou Isle'},
                               {'CruiseDay': 4,
                                'PortCode': 'MEE',
                                'PortName': 'Mare'},
                               {'CruiseDay': 5,
                                'PortCode': 'SYD',
                                'PortName': 'Sydney'}],
              'RegionCode': 'I',
              'RegionName': 'Pacific Islands',
              'SailDate': '/Date(1481950800000)/',
              'ShipCode': 'LE',
              'ShipName': 'Legend',
  

Комментарии:

1. Боже мой, я чувствую себя таким тупым … Большое спасибо. Я проверю это после работы и отмечу ответ.

2. сработало как по волшебству. Я даже могу ввести размер страницы 100 и номер страницы 1, и я получаю все результаты сразу