python-3.x - pagina - web scraping python beautifulsoup tutorial
Cómo rastrear páginas de paginación? No hay cambio de URL cuando hago clic en la página siguiente (2)
No podrás hacer esto solo con beautifulsoup, ya que no es compatible con ajax. Tendrá que usar algo como selenio , ghost.py u otro navegador web con soporte de JavaScript.
Al usar estas bibliotecas, podrá simular un clic en estos enlaces y luego tomar el contenido que acaba de cargar.
Yo uso python3.5 y window10.
Cuando rastreo algunas páginas, suelo usar cambios de URL usando urlopen y ''para'' la iteración. como el código a continuación.
from bs4 import BeautifulSoup
import urllib
f = open(''Slave.txt'',''w'')
for i in range(1,42):
html = urllib.urlopen(''http://xroads.virginia.edu/~hyper/JACOBS/hjch''+str(i)+''.htm'')
soup = BeautifulSoup(html,"lxml")
text = soup.getText()
f.write(text.encode("utf-8"))
f.close()
Pero, estoy en problemas porque no hay cambios en la URL, aunque hice clic en las páginas siguientes y los contentes web se cambiaron, como en la imagen. no hay cambios en la url ni en el patrón. enter image description here
No hay señal en la url de que pueda detectar los cambios en los sitios web.
http://eungdapso.seoul.go.kr/Shr/Shr01/Shr01_lis.jsp
El sitio web está aquí. La clave que encontré estaba en la clase de paginación. Encontré algunos enlaces para ir a las páginas siguientes, pero no sé cómo puedo usar este enlace en Beautifulsoup. Creo que commonPagingPost se define función por desarrollador.
<span class="number"><a href="javascript:;"
class="on">1</a>
<a href="javascript:commonPagingPost(''2'',''10'',''Shr01_lis.jsp'');">2</a>
<a href="javascript:commonPagingPost(''3'',''10'',''Shr01_lis.jsp'');">3</a>
<a href="javascript:commonPagingPost(''4'',''10'',''Shr01_lis.jsp'');">4</a>
<a href="javascript:commonPagingPost(''5'',''10'',''Shr01_lis.jsp'');">5</a></span>
¿cómo puedo abrir o rastrear todos estos sitios usando beutifulSoup4? Acabo de recibir mis primeras páginas cuando uso urlopen.
Busqué el código de commonPagingPost
y encontré esta definición de función de JavaScript:
function commonPagingPost (Page, Block, Action) {
var Frm = document.mainForm;
Frm.RCEPT_NO.value = "";
Frm.page.value = Page;
Frm.action = Action;
Frm.submit ();
}
Entonces, lo que hace es rellenar "mainForm" y lo envía. ¿Cómo se ve mainForm
?
<form name="mainForm" method="post" action="">
<input type="hidden" name="RCEPT_NO" value="">
<input type="hidden" name="search_flag" value="N">
<input type="hidden" name="page" value="1">
</form>
De acuerdo, la función rellena un formulario, establece la página de destino en ''Shr01_lis.jsp'', la misma página que intenta raspar. ¿Podemos hacer esto en Python? ¡Sí!
import requests
r = requests.post(
"http://eungdapso.seoul.go.kr/Shr/Shr01/Shr01_lis.jsp",
data={
"RCEPT_NO": "",
"search_flag": "N",
"page": "5"
})
soup = BeautifulSoup(r.text, ''lxml'')
Prefiero las requests
lugar de urllib, porque es más fácil trabajar con las solicitudes para las solicitudes POST.