Red de conocimiento informático - Problemas con los teléfonos móviles - Rastreador Python Sina Weibo, ¡ayuda!

Rastreador Python Sina Weibo, ¡ayuda!

0x00.Cause

Porque participar en el concurso de innovación para estudiantes universitarios de la escuela e investigar publicaciones de Weibo sobre expresión emocional requiere una gran cantidad de publicaciones de Weibo y en línea, ya sea un cierto título en China, csdn o en el extranjero. Google, Gayhub, codeproject, etc. no pudieron encontrar el programa que quería, así que no tuve más remedio que escribir un programa yo mismo.

ps. Encontré un programa similar en Crawling Alliance, pero está en Windows y es de código cerrado. Después de finalmente tomar y guardar el archivo y abrirlo con Notepad++, aparecieron muchos problemas extraños. arriba.

0x01.Conocimientos básicos

Este programa está escrito en Python, por lo que debes tener conocimientos básicos de Python. Además, si tienes ciertos conocimientos básicos de redes informáticas, evitarás muchos desvíos durante el proceso de preparación.

Para los rastreadores, es necesario aclarar algunos puntos:

1. Las categorías de objetos de rastreo se pueden dividir en las siguientes categorías: El primer tipo no requiere inicio de sesión, como el Blogger antes practiqué el rastreo de China Weather Network. Este tipo de página web es relativamente difícil de rastrear. Se recomienda que los rastreadores novatos rastreen este tipo de páginas web, como Douban y Sina Weibo. rastrear.Grande; el tercer tipo es independiente de los dos primeros. Las páginas web que desea rastrear son páginas web que son más difíciles de rastrear. Independientemente de los dos primeros, la información que desea generalmente se actualiza dinámicamente, como AJAX o recursos integrados. Este tipo de rastreador es el más difícil. Los blogueros no lo han estudiado y no entrarán en detalles aquí (según compañeros de clase, producto Taobao). las reseñas son de esta categoría).

2. Si la misma fuente de datos tiene múltiples formularios (como versión para computadora, versión móvil, cliente, etc.), dé prioridad a la visualización más "pura". Por ejemplo, Sina Weibo tiene una versión web y una versión móvil. Se puede acceder a la versión móvil mediante un navegador de computadora, por lo que le doy prioridad a la versión móvil de Sina Weibo.

3. El rastreador suele descargar la página web localmente y extraer la información de interés de alguna forma. En otras palabras, raspar una página web es sólo la mitad de la batalla, también debes extraer la información que te interesa del archivo html descargado. En este momento, necesita algunos conocimientos de xml. En este proyecto, el blogger usa XPath para extraer información. Además, también puede usar otras tecnologías como XQuery. Para obtener más información, visite w3cschool.

4. Los rastreadores deben hacer todo lo posible para imitar a los humanos. Ahora que el mecanismo anti-rastreador del sitio web se ha desarrollado relativamente, desde códigos de verificación hasta IP prohibidas, se puede decir que los rastreadores y las tecnologías anti-rastreadores. compitiendo constantemente.

5.

0x02.Start

Después de determinar el objetivo del rastreador, primero debe visitar la página web de destino para aclarar qué tipo de rastreador es la página web de destino. pertenece a, además, también registre los pasos que debe seguir para obtener la información que le interesa, como si necesita iniciar sesión y si necesita iniciar sesión, si necesita un código de verificación; para obtener la información que desea obtener, qué acciones debe realizar, si necesita enviar ciertos formularios, cuál es el patrón de URL de la página de la que desea obtener información, etc.

La siguiente publicación de blog es un ejemplo de un proyecto de blogger. Esta publicación de blog captura todas las publicaciones de Weibo de un usuario específico de Sina Weibo desde el registro hasta el presente y 100 páginas de publicaciones de Weibo (alrededor de 1000 elementos) basadas en palabras clave. .

0x03. Recopile la información necesaria

Primero, visite la página web de destino y descubra que necesita iniciar sesión, y luego ingrese a la página de inicio de sesión, que es la página de inicio de sesión móvil de Sina Weibo a continuación.

Tenga en cuenta que la segunda mitad de la URL tiene muchos caracteres de escape, como "%xx", que se analizarán más adelante en este artículo.

Como puede ver en esta página, para iniciar sesión en la versión móvil de Sina Weibo, debe ingresar su número de cuenta, contraseña y código de verificación.

Este código de verificación fue requerido recientemente (este artículo se creó el 11 de marzo de 2016). Si no es requerido, hay dos formas de iniciar sesión.

La primera es completar la cuenta y la contraseña y luego ejecutar js para simular hacer clic en el botón "Iniciar sesión". El blogger una vez escribió un rastreador de Java usando este método, pero ahora no se puede encontrar el proyecto, por lo que. No lo haré aquí otra vez.

El segundo método requiere una determinada base HTTP y envía una solicitud HTTP POST que contiene la información requerida. Necesitamos utilizar la herramienta Wireshark para capturar los paquetes enviados y recibidos al iniciar sesión en Twitter. En la imagen a continuación, capturé paquetes enviados y recibidos mientras estaba conectado a Wireshark Capture 1

Proporcione el criterio de búsqueda "/(displayID)?page=(pagenum)" en la barra de búsqueda. Esta será la base para que nuestro rastreador una las URL.

A continuación, miramos la fuente de la página para encontrar la ubicación de la información que necesitamos. Abra las herramientas de desarrollo del navegador y oriente un tweet directamente para encontrar su ubicación como se muestra a continuación.

xpath

Mirando el código html, encontramos que todos los tweets están ubicados en la etiqueta

, y la etiqueta tiene dos atributos: el atributo de clase (es decir, "c" ) y el valor del atributo de identificación único. Obtener esta información ayuda a extraer la información requerida.

Además, hay algunos otros factores que requieren especial atención

* Los tweets se dividen en tweets originales y tweets retuiteados

* Según el momento de publicación y la hora actual Hay "Hace MM minutos", "hoy HH:MM", "mm mes dd día HH:MM", "aaaa-mm-dd HH:MM:SS" y otras formas de mostrar la hora en la página * Sina Weibo Una página de la versión móvil del blog muestra alrededor de 10 publicaciones de Weibo, así que preste atención al número total de registros en la página ***. Los puntos anteriores son detalles que deben considerarse cuidadosamente al rastrear y extraer.

Codificación 0x04.

1. Capture al usuario Weibo

El lenguaje de desarrollo de este proyecto es Python 2.7 y se utilizan algunas bibliotecas de terceros en el proyecto. Utilice el método pip para agregar bibliotecas de terceros.

Dado que la idea de inicio de sesión automático por parte del programa está bloqueada por el código de verificación, el acceso a la página Weibo de un usuario específico solo se puede realizar proporcionando una cookie por parte del usuario.

Lo primero que debe usar es el módulo de solicitud de Python, que proporciona cookies a las solicitudes de URL.

solicitud de importación

imprimir solicitud.get(url, cookies=cookies).content Usando este código puedes imprimir el resultado de una página de solicitud de URL con cookies.

Primero obtenga el número de página del Weibo del usuario, busque el elemento que representa el número de página verificando el código fuente de la página web y extraiga el número de página a través de XPath y otras tecnologías.

Número de páginas

Este proyecto utiliza el módulo lxml para extraer XPath de html.

Primero importe el módulo lxml. Solo se usa etree en el proyecto, así que importe etree desde lxml

Luego use el siguiente método para devolver el número de página

def getpagenum(self) :

url = self.geturl(pagenum =1)

html = request.get(url, cookies=self.

selector = etree.HTML( html)

pagenum = selector.xpath('//input[@name="mp"]/@value')[0]

return int( pagenum)

El siguiente paso es continuar empalmando URL->visitar URL->página de descarga

Cabe señalar que debido a la existencia del mecanismo anti-rastreador de Sina, si. se accede a la misma cookie con demasiada frecuencia. La página entrará en un "período de reflexión" similar, es decir, se devolverá una página inútil y se determinará que la página es inútil mediante el análisis. podemos encontrar que hay información específica en una ubicación específica de la página.

Al utilizar la tecnología XPath para comprobar si aparece información específica en una ubicación específica, podemos determinar si la página nos resulta útil.

def ispageneeded(html):

selector = etree.HTML(html)

prueba:

título = selector.xpath( '//title')[0]

excepto:

return False

return title.text ! = 'Plaza Weibo' y título.texto!

Si hay una página inútil, puede volver a visitarla directamente, pero a través de experimentos posteriores, descubrimos que si la visita con frecuencia durante mucho tiempo, todas las páginas devueltas serán páginas inútiles y el programa caerá en un bucle infinito. Para evitar que el programa caiga en un bucle infinito, el blogger establece un umbral de cuenta de prueba. Cuando se excede el umbral, el método regresará automáticamente.

El siguiente fragmento de código muestra un enfoque de rastreador de un solo subproceso.

def startcrawling(self, página de inicio=1, trycount=20):

intento = 0

prueba:

os.mkdir (sys.path[0] + '/Weibo_raw/' + self.

pos.mkdir(sys.path[0] + '/Weibo_raw/' + self.wanted) excepto excepción, e:

imprimir str(e)

isdone = False

mientras no está hecho e intentar < trycount:

try:

pagenum = self.getpagenum()

isdone = True

excepto excepción, e:

intento += 1

if intento == trycount:

return False

i = página de inicio

mientras i <= pagenum:

intento = 0

isneeded = False

html = ''

mientras no es necesario e intenta & lt; trycount:

html = self.getpage(self. geturl(i))

es necesario = self.ispageneeded(html)

si no es necesario:

intento += 1

si intento == trycount:

return False

self.savehtml(sys.path[0] + '/Weibo_raw/' + self.wanted + '/' + str(i) + '.txt', html) print str(i) + '/' + str(pagenum - 1)

i += 1

devuelve Verdadero

Teniendo en cuenta la eficiencia del tiempo del programa, después de escribir el rastreador de un solo subproceso, el blogger escribió una versión de subprocesos múltiples del rastreador. La idea básica es dividir la cantidad de páginas de Weibo por la cantidad de subprocesos. por ejemplo, un Weibo La idea básica es dividir el número de páginas de Weibo por el número de hilos cuando un usuario tiene 100 páginas de Weibo. Por ejemplo, si un usuario de Weibo tiene 100 páginas de Weibo y el programa abre 10 hilos, entonces cada hilo. Solo es responsable de rastrear 10 páginas. Otras ideas básicas son similares al subproceso único. Solo necesita manejar cuidadosamente los valores límite. Los estudiantes interesados ​​pueden echar un vistazo al código. Además, debido a la eficiencia relativamente alta del subproceso múltiple y la gran cantidad de concurrencia, el servidor puede devolver fácilmente páginas no válidas. En este momento, la configuración de trycount se vuelve más importante. Al escribir este Weibo, el blogger utilizó nuevas cookies y pruebas de sitios web de rastreo de subprocesos múltiples para rastrear el Weibo de la Universidad de Correos y Telecomunicaciones de Beijing. Los 3976 Weibos se rastrearon con éxito y las publicaciones del blog se extrajeron. , puede ser diferente de las antiguas y nuevas. El grado de cookies está relacionado con el entorno de red. La configuración de la línea de comando es la siguiente. py _T_WM=xxx; SUHB=xxx; SUB=xxx; gsid_CTandWM=xxx u bupt m 20 20 El trabajo del rastreador se presentó básicamente anteriormente y el siguiente paso es la segunda parte del análisis.

Debido a que el proyecto proporciona un método de rastreo de subprocesos múltiples, y los subprocesos múltiples generalmente no están ordenados, pero las publicaciones de Weibo dependen de la clasificación por tiempo, el proyecto adopta un método de compromiso y guarda las páginas descargadas en el sistema de archivos local. número de página como nombre de archivo y luego recorre en iteración todos los archivos de la carpeta y los analiza una vez completado el trabajo de rastreo.

A través de las observaciones anteriores, ya hemos comprendido las características de las etiquetas presentes en las publicaciones de Weibo. Utilizando la tecnología XPath, no es difícil extraer todas las etiquetas con esta característica en la página.

Aquí les recordamos a todos nuevamente que Weibo se divide en Weibo reenviado y Weibo original, así como la representación del tiempo. Además, dado que nuestro tema de investigación solo se centra en el texto de Weibo, no se consideran las imágenes coincidentes.

def startparsing(self, parsingtime=datetime.datetime.now()):

basepath = sys.path[0] + '/Weibo_raw/' + self.uidpara nombre de archivo en os .listdir(ruta base):

si nombre de archivo.startswith('.'):

continuar

ruta = ruta base + '/' + nombre de archivo

f = open(ruta, 'r')

html = f.read()

selector = etree.

weiboitems = selector .xpath('//div[@class="c"][@id]') para el artículo en weiboitems:

weibo = Weibo()

weibo.id = artículo .xpath('. /@id')[0]

cmt = item.xpath('. /div/span[@class="cmt"]') if len(cmt) ! content += ctt.text

para a en ctt.xpath('. /a'):

si a.text no es Ninguno:

weibo .content += a.text

si a.tail no es Ninguno:

weibo.content += a.tail

si len(cmt) ! = 0:

razón = cmt[1].text.split(u'\xa0')

if len(razón) ! = 1:

weibo.repoostreason = motivo[0]

ct = item.xpath('./div/span[@class="ct"]')[0]

tiempo = ct.text.split(u'\xa0')[0]

weibo.time = self.gettime(self, time, parsingtime)self.weibos.append (weibo.__dict__)

f.close()

El propósito de establecer el parámetro de tiempo de análisis pasado por este método es que en las primeras etapas de desarrollo, es posible que el rastreo y el análisis no ocurren al mismo tiempo (no estrictamente "al mismo tiempo"), la hora en Weibo se mostrará según la hora de acceso. La visualización se basa en el tiempo de acceso. Por ejemplo, si el tiempo de rastreo es las 10:00, entonces el tiempo que se muestra después de rastrear una determinada publicación de Weibo es hace 5 minutos, pero si el tiempo de análisis es las 10:30, entonces el análisis. La hora será incorrecta, por lo que se debe analizar el análisis. La hora está establecida en las 10:00.

En la etapa posterior, cuando el rastreador esté básicamente desarrollado, la brecha entre el tiempo de rastreo y el tiempo de análisis se reducirá. La diferencia de tiempo será la duración del proceso y la diferencia de tiempo básicamente se puede ignorar. Puede ignorarse.

Los resultados del análisis se guardan en forma de lista. Finalmente, la lista se guarda en el sistema de archivos en formato json y se elimina la carpeta de transición.

def save(self):

f = open(sys.path[0] + '/Weibo_parsed/' + self.uid + '.txt', 'w') jsonstr = json.dumps(self.weibos, indent=4, asegúrese de _ascii=False)f.write(jsonstr)

f.close()

2. p>

Nuevamente, recopile la información necesaria. Ingrese "python" en la página de búsqueda móvil de Weibo, observe las URL y estudie sus patrones. Aunque no hay ningún patrón en la primera página, encontramos un patrón en la segunda página que se puede aplicar nuevamente a la primera página de la primera

Segunda página

La primera página después de la aplicación

Al observar la URL, podemos encontrar que para la búsqueda de palabras clave, las variables en la URL son solo palabras clave y páginas (de hecho, hideSearchFrame no tiene ningún impacto en nuestros resultados de búsqueda o rastreadores), por lo que podemos controlarlos. dos variables en el código.

Además, si la palabra clave es china, debe convertir la URL a caracteres chinos. Por ejemplo, ingrese "feliz" en el cuadro de búsqueda y busque la siguiente URL. p>

pero copiado para

/search/mblog?hideSearchFrame=&keyword=%E5%BC%80%E5%BF%83&page=1 Afortunadamente, la biblioteca urllib de Python tiene un método qoute que maneja Conversión al chino (si es inglés, no se realizará ninguna conversión), por lo que puede utilizar este método para procesar los parámetros antes de unir la URL.

Además, considerando que la búsqueda de palabras clave es un método utilizado en la etapa de recopilación de datos, solo se proporciona un hilo para descargar la página web. Si necesita varios hilos, puede seguir el método de captura de usuario. Weibo con múltiples hilos. Finalmente, extraiga y guarde la página web descargada (sé que el diseño de este módulo es un poco extraño, planeo cambiarlo cuando reconfigure (xin) (qing) (hao), así que hagamos esto por ahora).

def keywordcrawling(self, palabra clave):

realkeyword = urllib.quote(keyword) # Procesar palabras clave chinas.

pruebe:

os.mkdir(sys.path[0] + '/keywords')

excepto excepción, e:

imprimir str(e)

weibos = []

intenta:

puntos altos = re.

excepto re.error:

highpoints = re.compile(u '[\U00010000-\U0010ffff]') # Maneja emoji, pero parece que no funciona.

excepto re.error:

highpoints = re.compile(u'[\uD800-\uDBFF][ \uDC00-\uDFFF]') pagenum = 0

es necesario = False

mientras no es necesario: