El rastreador Python3 resuelve el problema de obtener datos de solicitud asíncronos

Tabla de contenido

 

Descripción del problema

Soluciones

opcion uno

Opción II


Descripción del problema

Al rastrear la página de detalles de datos, se debe rastrear la cantidad de comentarios (cantidad de comentarios), pero la cantidad de comentarios y los datos de la página de detalles no se solicitan de forma síncrona. Los datos se cargarán más adelante en la página de detalles. Si usa urllib.request.openurl Al obtener la página directamente, el resultado es que cuando se recupera la página, el número de comentarios no se ha completado en la página, lo que provoca que no se obtengan los datos de los comentarios.

Soluciones

opcion uno

Dado que la cantidad de comentarios es después de que los datos de la página de detalles se cargan en la página, puede esperar un cierto período de tiempo, esperar hasta que los datos de los comentarios también se carguen y se completen en la página, y luego tomar la página, luego puede obtener los comentarios en la página. ¿Están los datos disponibles?

Utilice selenium: documento chino selenium-python

  • Selenium fue originalmente una herramienta de prueba automatizada y se usó en rastreadores para resolver el problema de que las solicitudes no pueden ejecutar directamente el código JavaScript. Selenium esencialmente controla el navegador y simula completamente las operaciones del navegador, como saltar, ingresar, hacer clic, desplegar, etc. , Para obtener el resultado de la representación de la página web, admite varios navegadores

Pero en mis necesidades, aunque esto puede resolver el problema, lleva demasiado tiempo y el rendimiento del programa puede verse afectado. Solo necesito solicitar un campo de datos. Si el tiempo de espera para la solicitud es demasiado corto, es posible que se desconecte antes de que se soliciten los datos. Si el tiempo para configurar la solicitud es demasiado largo, puede ralentizar seriamente el programa. Entonces, después de leer una introducción básica y las operaciones de otras personas, también traté de usarlo en mi propio programa, pero había demasiadas cosas para configurar, así que me rendí decididamente.

Opción II

Cargar el enlace del número de comentarios por separado para obtener el número de comentarios también es mi forma de resolver mi propio problema. A veces, un enlace de solicitud de datos de este tipo puede solicitar datos, pero no puedo hacerlo aquí, porque el enlace que solicité está muy relacionado con el paso anterior. Si los datos no se cargan en la página de detalles, no se pueden solicitar los datos. , Pero fue interceptado directamente en la página de inicio de sesión, donde debe encapsular el enlace de la página de detalles de su solicitud al encabezado que solicita el número de comentarios, disfrazándolo como una solicitud de datos normal.

Por supuesto, saber que esto se hace después de haber probado muchos métodos y aprendido después de pedirle consejo a alguien. Los colegas recopilaron datos mediante la interfaz de visualización en la plataforma de recopilación, pero se nos pidió que usáramos código para recopilar datos. Después de la consulta, nos enteramos de que debemos agregar el enlace preasincrónico solicitado al encabezado de la solicitud.

Al principio, usé esto:


import urllib.request


def getcommentcount(preurl,suburl):
    headers = {"User-Agent",
                "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36"}
    prevheaders = {"Referer",preurl}
    opener = urllib.request.build_opener()
    opener.addheaders = [headers]
    opener.addheaders = [prevheaders]
    urllib.request.install_opener(opener)
    file = urllib.request.urlopen(suburl)
    data = file.read()
  

Pero el programa es muy inestable y sigue informando errores

Python ValueError: Invalid header name b'Https://I.Learn.Hello.Com/Detail.Htm?CourseId=117292'

La preurl entrante en realidad se ve así:

https://i.learn.hello.com/detail.htm?courseId=117292

Publique la pregunta en el navegador y vea lo que dicen otros Python ValueError: nombre de encabezado no válido b ': autoridad

También probé las soluciones anteriores en mi propio programa, pero no resolvió el problema. Comencé a sospechar que la forma en que configuré el encabezado era incorrecta, porque todos en Internet simplemente usaron el método anterior para configurar un parámetro y yo configuré dos , Entonces encontré otra forma de configurar el encabezado.

def getcommentcount(url,suburl):
    req = urllib.request.Request(suburl)
    req.add_header("User-Agent","Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36")
    req.add_header("Referer",url)
    file = urllib.request.urlopen(req)
    data = file.read()

Después de esta configuración, el problema se resuelve y no se informa ningún error. En cuanto a la razón, exploraré lentamente después de familiarizarme con los rastreadores.

Supongo que te gusta

Origin blog.csdn.net/someby/article/details/105056151
Recomendado
Clasificación