#javascript #java #python #html #asp.net
#javascript #java #python #HTML #asp.net
Вопрос:
Я обнаружил, что вы не можете напрямую открыть ссылку, которую я в конечном итоге пытаюсь очистить: https://publicindex.sccourts.org/Abbeville/PublicIndex/PISearch.aspx . Но вы можете напрямую открыть ссылку прямо перед: https://publicindex.sccourts.org/abbeville/publicindex /. Моя проблема в том, что я пытаюсь в конечном итоге перейти к первой ссылке в веб-скребке на python. Но даже при попытке открыть 2-ю ссылку, которую я протестировал и проверил в обычном браузере, таком как Chrome, отображаемый HTML-код отличается от HTML, который отображается на странице просмотра источника страницы при просмотре ее в Chrome. Эта проблема возникала снова и снова с использованием urllib, BeautifulSoup, requests, RoboBrowser и requests_html с помощью html.render. Итак, я попытался использовать Selenium, потому что я прочитал, что это потребуется, если на странице требуется включить javascript. Но когда я открываю https://publicindex.sccourts.org/abbeville/publicindex / в selenium, прежде чем я смогу нажать «Принять», браузер перенаправляет на базовый веб-сайт (https://www.sccourts.org/caseSearch /). Я видел, как некоторые другие люди просматривали веб-сайт, у которого есть переменные aspx, такие как __VIEWSTATE, которые делает этот веб-сайт, но я не уверен, какой подход использовать к этому конкретному сайту. Я предпочитаю python, но если есть более простое решение на java или каком-либо другом языке, я открыт для него! Итак, какой подход я должен использовать для этого сайта? Это html-код https://publicindex.sccourts.org/abbeville/publicindex / сайт:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><title>
Public Index Search
</title>
<!-- Set the viewport width to device width for mobile -->
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=yes" /><link href="../SCJDCommonWebFiles/SCJDStyles.css" rel="stylesheet" type="text/css" /><link rel="shortcut icon" href="../SCJDCommonWebFiles/Images/favicon.ico" type="image/x-icon" /><link rel="icon" href="../SCJDCommonWebFiles/Images/favicon.ico" type="image/ico" />
</head>
<body id="MainPage">
<form method="post" action="./" id="form1">
<div class="aspNetHidden">
<input type="hidden" name="ContentPlaceHolder1_ToolkitScriptManager1_HiddenField" id="ContentPlaceHolder1_ToolkitScriptManager1_HiddenField" value="" />
<input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" />
<input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" />
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwULLTE0MjkzMTY0NDZkZO9AfFymJFs2oYtw0NdvHHX24ken" />
</div>
<script nonce="44zvId2606ALq6COtXWax194">(function(a){var d=document;if(d.readyState==="complete")return;var w=window;var s=d.currentScript;addEventListener("QDDFxBgUl",function f(e){e.stopImmediatePropagation();removeEventListener("QDDFxBgUl",f);e.detail.init("A_SftyZ2AQAAj-rSLifZN8fPTkYzU3JXZNntKqDT7TyHx8CUbCjSP1gGAxv6ASO_Cfaucr5iwH8AAOfvAAAAAA==","csmObzTJRl8Pi6U30n1f9=dIx47rhMuWotjZV2gpkB5SvDQwyGNYaHFq-LCK_AeEX",[],[537446516,1519189668,1031653497,413076837,861185844,1429182448,1631016849,396020441],"44zvId2606ALq6COtXWax194","44zvId2606ALq6COtXWax194",[[/(?:)/,/^((?=.*publicindex.sccourts.org$))/i,/^((?!/$)(?!/$))/i,/(?:)/],[[["GET"],[0,1,0,2,0]],[["POST"],[0,1,0,3,0]]]],a)},true);samp;amp;s.parentNode.removeChild(s);d.write("<script " ('nonce="' "44zvId2606ALq6COtXWax194" '" ') ('src="' "/b540ee9e345645bca774a11fc6c63a7a.js?seed=AMBGpiZ2AQAAwywUUZtzcNTN8yJXGAkN6cV3iln-3mGyunI6jxqxVqqUf0jR" '" ') ('id="' "593e2ee16e58f519a5d512bd17d93da9" '"') "></scr" "ipt>")}(typeof arguments==="undefined"?void 0:arguments))</script><script type="text/javascript">
//<![CDATA[
var theForm = document.forms['form1'];
if (!theForm) {
theForm = document.form1;
}
function __doPostBack(eventTarget, eventArgument) {
if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
theForm.__EVENTTARGET.value = eventTarget;
theForm.__EVENTARGUMENT.value = eventArgument;
theForm.submit();
}
}
//]]>
</script>
<script src="/Abbeville/PublicIndex/WebResource.axd?d=yHSk03n8qhGuYU3dqttnQ71qTt_0El3n1mxBXim4Y_-Y3mTP08Bvg1wOhE6CNGMfa0pKDFyPqFYCSLv2UBjX7AKLbHI1amp;amp;t=636776545224055265" type="text/javascript"></script>
<script src="/Abbeville/PublicIndex/ScriptResource.axd?d=Mkw4QIfUysnyQFhWpSU3cpRAOR84s719g9N0uJb6WluyvHTwL48NXPe4rwN0cPC7Gr6I9pZZph6TlEkVqfYsPXI7ZHd1OJzbro9C70-Bx13mFOPo0amp;amp;t=27117261" type="text/javascript"></script>
<script src="/Abbeville/PublicIndex/ScriptResource.axd?d=d8-wk7BomsPtH4YvLTJ1UzDNDQNd_YVgR7altkItLWhH5yOCDaUGJHcNTeOKDRiE1M_grO76wv2e-vwpgB-KU5rZQ7UxIpKqWPL9zNh13ZS_I0GMMssjEQcya90iKRQSiH2ymA2amp;amp;t=27117261" type="text/javascript"></script>
<div class="aspNetHidden">
<input type="hidden" name="__VIEWSTATEGENERATOR" id="__VIEWSTATEGENERATOR" value="1B7E8EBE" />
<input type="hidden" name="__PREVIOUSPAGE" id="__PREVIOUSPAGE" value="BsW216wqQxCtuIvrGWmJQq2SzKwzsohf-kqWPg_ixAZV5lsccN3qLaQAoEWdFDudUVNmZqLDHlVu_jjRlouMpBTtLyyx8OET2D0coFsN4lkn11MM0" />
<input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="/wEdAANnUhit7/TqA0EIrEA5S0S0kfXFdoRld1R/CA4tdNG91yIhI 6i/cUuX4RsMQK8Skk79cNANwPzNawq72wqYHHLPOBqiw==" />
</div>
<div id="pagewrapper">
<div id="pagecontent">
<table class="pageHeading" enableviewstate="false">
<tr>
<td align="left">
<img id="ImageLeft" class="headingImage" src="../SCJDCommonWebFiles/Images/HeaderLeft.jpg" alt="Left Heading Image" align="left" style="border-style:None;" />
</td>
<td style="text-align: center">
<span id="LabelHeadingCounty">Abbeville County</span>
<br />
<span id="LabelHeadingCircuit">Eighth Judicial Circuit</span>
<br />
<span id="LabelApplicationName">Public Index</span>
</td>
<td>
<img id="ImageRight" class="headingImage" src="../SCJDCommonWebFiles/Images/HeaderRight.jpg" alt="Right Heading Image" align="right" style="border-style:None;" />
</td>
</tr>
</table>
<hr class="horizontalSeparator" />
<div id="linkBar" class="linksSection">
<a id="HyperLinkHome" href="http://www.abbevillecountysc.com">Abbeville County Home Page</a>
<?xml version="1.0" encoding="utf-8"?>
<a href="http://www.sccourts.org/">South Carolina Judicial Department Home Page</a>
<a href="http://www.sc.gov/">SC.GOV Home Page</a>
</div>
<hr class="horizontalSeparator" />
<div>
<script type="text/javascript">
function hidemodal() {
$find('mpeBID').hide();
return false;
}
</script>
<script type="text/javascript">
//<![CDATA[
Sys.WebForms.PageRequestManager._initialize('ctl00$ContentPlaceHolder1$ToolkitScriptManager1', 'form1', [], [], [], 90, 'ctl00');
//]]>
</script>
<div id="disclaimsection" class="disclaimer">
<span id="ContentPlaceHolder1_LabelDisclaimer" class="disclaimerText"><br/>Neither the County nor any agency, officer, elected official or
employee of the County, warrants the accuracy, reliability or timeliness of any
information on this web site and shall not be liable for any losses caused by
such reliance on the accuracy, reliability or timeliness of such information,
including, but not limited to incidental and consequential damages. This
publication is provided amp;quot;as isamp;quot; without warranty of kind, either
expressed or implied, including, but not limited to, the implied warranties of
merchantability, fitness for a particular purpose or non-infringement. The
County maintains all immunities as provided in the South Carolina Tort Claims
Act.
<br/><br/>Portions of such information may be incorrect or not current. Any person or entity who
relies on any information obtained from this web site does so at his or her own
risk. In addition, nothing contained within this web site is an official record
of the County or the elected officials responsible therefore. All official
records of the County and the offices of countywide elected officials are on
file in their respective offices and may be reviewed by the public at those
offices.
<br/><br/>A person preparing or filing a document for recordation or filing in the official
records may not include a social security, driver's license, state
identification, passport, checking account, savings account, credit card, or
debit card number, or personal identification (PIN) code, or passwords in the
document, unless expressly required by law. An individual has a right to
request a register of deeds or clerk of court to remove, from an image or copy
of an official record placed on a publicly available Internet web site or on a
publicly available Internet web site used by a register of deeds or clerk of
court to display public records, any social security, driver's license, state
identification, passport, checking account, savings account, credit card, or
debit card number, or personal identification (PIN) code, or passwords
contained in an official record. The request must be made in writing and
delivered by mail, facsimile, or electronic transmission or in person, to the
register of deeds or clerk of court. The request must specify the
identification page number that contains the social security, driver's license,
state identification, passport, checking account, savings account, credit card,
debit card number, or personal identification (PIN) code, or passwords to be
redacted. There is no fee for the redaction pursuant to request.
<br/><br/><p>Access to the South Carolina Judicial Department Public Index web sites
by a site data scraper or any similar software intended to discover and extract data from a website through automated,
repetitive querying for the purpose of collecting such data is expressly prohibited.</p>
<br/>
<p style='text-align: center;font-weight: bold'>I have read and accept this disclaimer and responsibility for the use of this information:</p></span>
<div id="ContentPlaceHolder1_PanelDiscButtons" class="centeredDiv" style="width:50%;">
<br />
<input type="submit" name="ctl00$ContentPlaceHolder1$ButtonAccept" value="Accept" id="ContentPlaceHolder1_ButtonAccept" title="Accept Disclaimer" class="actionButton" />
<input type="submit" name="ctl00$ContentPlaceHolder1$ButtonDecline" value="Decline" onclick="javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions(amp;quot;ctl00$ContentPlaceHolder1$ButtonDeclineamp;quot;, amp;quot;amp;quot;, false, amp;quot;amp;quot;, amp;quot;http://www.abbevillecountysc.comamp;quot;, false, false))" id="ContentPlaceHolder1_ButtonDecline" title="Decline Disclaimer" class="actionButton" />
<br />
</div>
</div>
</div>
<hr class="horizontalSeparator" />
<div id="pagefooter" class="scjdcopyright">
<span id="Copyright">CMSWeb 6.1 © 2019 South Carolina Judicial Branch • All rights reserved </span>
</div>
</div>
</div>
</form>
</body>
</html>
Ответ №1:
Ну, asp.net страницы на самом деле не запускаются скриптовым кодом, который существует на стороне браузера.
код, который вы пишете для управления этими страницами, является vb.net , или C#. Вы не пишете разметку, и именно серверный код запускает и отображает страницу.
Например. Если у меня есть эта разметка страницы aspx?
Выше вы можете увидеть разметку aspx. Но вы также можете увидеть конструктор веб-форм. На самом деле, я могу развернуть конструктор форм и просто перетащить элементы управления на веб-форму (вы визуально создаете веб-страницу). Итак, мне даже не нужно смотреть на разметку.
Итак, когда я нажимаю на кнопку выше? Ну, точно так же, как, скажем, VB или Access, что я сбросил несколько кнопок в форме? Ну, у вас есть то, что называется code behind, или код на стороне сервера. Это не JavaScript.
Итак, вот как выглядит код для этой заглушки кнопки:
Protected Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim rst As DataTable
rst = MyRst("SELECT ID, HotelName, City FROM tblHotels ORDER BY HotelName")
GridView1.DataSource = rst
GridView1.DataBind()
End Sub
Теперь я не писал sub / end sub. Я просто ввел простой чистый код VB.
(вы можете использовать c # или vb.net ).
Теперь, вот что вы видите на веб-странице, когда я нажимаю эту кнопку:
Итак, вы видите какой-либо JavaScript? (нет !!!)
Итак, проблема здесь в том, что вы должны сказать, подумайте о том, как бы вы проверили очистку настольной бухгалтерской программы. Вы можете сказать, получить некоторую процедуру щелчка мышью, чтобы щелкнуть по кнопке формы, но это все, что вы можете сделать.
Как вы собираетесь настраивать код и переменные на стороне сервера в подпрограмме?
Я имею в виду, давайте рассмотрим приведенный выше вид сетки и скажем, перетащите кнопку.
Теперь у меня есть это:
И я опустил это текстовое поле.
Итак, код кнопки выбора теперь:
Dim myGridrow As GridViewRow = GridView1.SelectedRow
TextBox1.Text = GfIX(myGridrow, "HotelName")
Итак, если я нажму на кнопку, то запустятся две вышеуказанные строки простого кода VB (или c #).
И мы получаем это;
Итак, важно понимать, что, хотя я написал ВСЕГО несколько строк кода — и серверного кода на чистом языке (обратите внимание, без КАКИХ-ЛИБО наценок !!!).
Итак, вы должны понимать, что серверная сторона не только отображает страницу, но и ПОВТОРНО ОТОБРАЖАЕТ страницу на основе простого нажатия кнопки.
И ЧТО БОЛЕЕ важно и более актуально? Ну, как и ЛЮБАЯ система кодирования, подобная этой?
Ну, тогда как вы собираетесь гарантировать, что переменные, значения и весь этот код, выполняющийся за ними, имеют правильные значения и локальные переменные?
У вас могут быть массивы, списки, таблицы данных — весь код на стороне сервера. Все эти значения, массивы и код, выполняемые за ними, — это то, к чему у вас нет доступа.
Теперь, когда вы нажимаете на кнопку или что-то подобное? Затем сервер повторно отобразит страницу, преобразует элементы управления в разметке aspx, ЗАТЕМ запустит код, а ЗАТЕМ выплюнет всю страницу и отправит ее обратно в браузер.
Обратите внимание, как в моем приведенном выше коде обрезается:
Did not write loops to render the grid
Did not write loops to spit out HTML
Итак, что это значит, это с вашей стороны?
Вам в значительной степени нужно найти способ нажать на правильную кнопку в веб-форме. Это нажатие кнопки отправит содержимое браузера на сервер, и весь этот чистый код, отличный от HTML и НЕ являющийся разметкой, будет запущен. Страница будет повторно отображена и отправлена обратно в браузер.
Итак, это означает, что вы не можете ни с того ни с сего просто запустить любую старую веб-страницу. Вы больше не можете этого делать, тогда, скажем, пропустите несколько форм в пакете учета рабочего стола, чтобы перейти к следующей форме.
Перед загрузкой следующей формы (скажем, в этой настольной программе) должны произойти всевозможные переменные, массивы и даже загрузка наборов данных из базы данных, и ТОЛЬКО ТОГДА можно перейти к следующей форме (на рабочем столе) или следующей веб-странице.
Другими словами, чистый код без разметки ЧАСТО настраивает все виды значений, массивов и переменных в этом коде. И ВСЕ эти значения должны быть настроены НЕПОСРЕДСТВЕННО перед загрузкой / вызовом / использованием следующей страницы в строке и т. Д.
Вы заметили, что по сравнению с веб-страницами старого стиля обратите внимание, как большинство asp.net у сайтов нет кучи уродливых и беспорядочных параметров в URL-адресе. Разработчику они не нужны — они просто устанавливают переменные и значения в коде (часто session() ), а затем переходят к следующей веб-странице, о которой идет речь.
Однако в большинстве случаев пытаться перейти на какую-либо веб-страницу, для которой требовалась предыдущая страница, и, что более важно, весь предыдущий код для запуска, который загружает массивы, переменные и, вероятно, вызывает всевозможные процедуры кода.
Итак asp.net веб-страницы НЕ являются статичными, и они управляются этим кодом. И, таким образом, этот код должен быть настроен правильно, и весь код выполняется ПЕРЕД переходом на другую страницу.
В результате в большинстве случаев вы НЕ можете просто ввести какой-либо старый URL-адрес и ожидать, что эта страница будет работать, поскольку НАИБОЛЕЕ важно, КАК ВЫ ПОПАЛИ на эту страницу.
И то, как вы попадаете на эту страницу, вполне может потребовать, чтобы вы ввели значения и нажали несколько кнопок на предыдущей странице. и эти нажатия кнопок и запуск кода могут и будут запускать все виды кода ДО загрузки следующей страницы.
Если в коде отсутствуют значения и настройки, когда вы вводите URL-адрес в браузер? Тогда код выйдет за вас. Часто мы пишем код для проверки предыдущего URL-адреса, и, конечно, ЧАСТО мы проверяем значения сеанса.
Итак, если вы перейдете на одну из моих страниц, чтобы отобразить проект?
У меня есть этот код:
' before we try to load? - lets check if we have info
If Nz(Session("ContactID"), 0) = 0 Then
' we don't have a contact id - jump to project page
Response.Redirect("~/Portal/MyProjects")
Exit Sub
End If
Итак, в приведенном выше примере мы загружаем веб-страницу. Но каким-то образом мы попали на эту веб-страницу без установки правильного идентификатора контакта (и обратите внимание, что я не использовал параметры URL-адреса — я использовал значение session() . Если это конкретное значение отсутствует, я перенаправляю на другую страницу.
Итак, не должно быть НИЧЕГО удивительного в том, что страницы повторно отображаются на основе нажатий кнопок — это в значительной степени гайки и болты того, как asp.net страницы работают. Вы нажимаете на кнопку — страница отправляется на сервер. Выполняется код, а затем повторно отображаемая страница отправляется обратно клиенту.
Конечно, приведенная выше модель действительно вызывает МНОГО того, что мы называем обходами. Но это ОЧЕНЬ быстрый подход к разработке. Со временем кто-то начнет внедрять ajax и начнет выполнять частичную обратную отправку, но модель какого-то обратного и серверного кода — это то, что делает веб-очистку настолько сложной.
Теперь, когда вводится больше cide на стороне клиента (вызовы ajax), часто нажатие кнопки теперь вызывает / вызывает вызов веб-службы, и, следовательно, не требуется возврат страницы.
Итак, для вас веб-очистка здесь?
Что ж, вам нужно загрузить / разместить страницу в системе какого-либо типа, а ЗАТЕМ БЫТЬ УВЕРЕННЫМ, ЧТО ВЫ НАЖИМАЕТЕ на правильные кнопки и ОЧЕНЬ УВЕРЕНЫ, что вы вводите правильно настраиваете элементы управления.
С тех пор, когда вы переходите на следующую страницу, если весь этот код, переменные и значения не совсем правильные? тогда код будет блокироваться и в большинстве случаев перенаправит веб-страницу на какую-либо страницу обработчика ошибок или просто перенаправит обратно на предыдущую страницу.
Что делает это еще более сложной задачей? Ну, в приведенной выше таблице я предоставил значение строки PK таблицы Hotel — но в большинстве случаев я бы не стал и не должен отправлять или даже когда-либо разрешать отображение или отображение значения строки PK в коде браузера на стороне клиента. Другими словами, еще раз, чтобы выбрать эту одну строку данных, вам нужно нажать кнопку, поскольку у вас нет средств на стороне клиента для установки значения строки PK, которое я собираюсь использовать в коде, когда вы нажимаете на эту кнопку.