La Red de Conocimientos Pedagógicos - Currículum vitae - ¿Qué significa volver a publicar en chino?

¿Qué significa volver a publicar en chino?

0x00. Causa

Porque participar en el concurso de innovación para estudiantes universitarios de la escuela y estudiar las emociones expresadas en las publicaciones de Weibo requiere una gran cantidad de publicaciones en Weibo y en línea, ya sea una determinada. Licenciatura o csdn en China, o en países extranjeros como Google, gayhub, codeproject, etc. no puedo encontrar el programa que quiero, por lo que no tengo más remedio que escribir un programa yo mismo.

ps. Encontré un programa similar en Climbing Meng, pero estaba en Windows y era de código cerrado. Al final, hubo muchos problemas extraños al abrir los archivos guardados al rastrear y usar notepad++, así que se los di. arriba.

0x01. Conocimientos básicos

Este programa está escrito en Python, por lo que se requieren conocimientos básicos de Python. Además, si tiene una determinada base de red informática, se ahorrará muchos desvíos en los primeros preparativos.

Para los rastreadores, hay algunos puntos que deben aclararse:

1. La clasificación de los objetos rastreados se puede dividir en los siguientes tipos: el primer tipo no requiere inicio de sesión, como el blogger anterior de The China Weather Network que rastreé cuando estaba practicando. Este tipo de página web es relativamente difícil de rastrear. Se recomienda que los rastreadores novatos rastreen dichas páginas web. El segundo tipo son las páginas web que requieren inicio de sesión, como Douban y Sina. Weibo. Estas páginas web son más difíciles de rastrear. El tercer tipo de rastreador es independiente de los dos primeros. La información que desea generalmente se actualiza dinámicamente, como AJAX o recursos integrados. No lo he estudiado, así que no entraré en detalles aquí (según mis compañeros de clase, los comentarios sobre los productos Taobao entran en esta categoría).

2. Si la misma fuente de datos viene en múltiples formas (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, y se puede acceder a la versión móvil mediante un navegador de computadora. En este momento, le doy prioridad a la versión móvil de Sina Weibo.

3. Los rastreadores generalmente descargan páginas web localmente y luego extraen información interesante mediante algunos métodos. En otras palabras, el rastreo de la página web está sólo a medias. Aún debe extraer la información que le interesa del archivo html descargado. En este momento, se necesitan algunos conocimientos de XML. En este proyecto, el blogger utiliza XPath para extraer información. Además, se pueden utilizar XQuery y otras tecnologías. 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-rastreo de los sitios web se ha vuelto relativamente desarrollado, desde códigos de verificación hasta IP prohibidas, la tecnología de rastreo y la tecnología anti-rastreo compiten constantemente.

0x02.Start

Después de decidir el objetivo del rastreador, primero debe visitar la página web de destino y dejar claro a cuál de los rastreadores anteriores pertenece la página web de destino. , registre la información para obtener la información interesante sobre los pasos que debe seguir, como si necesita iniciar sesión y, de ser así, si se requiere un código de verificación. información que desea, si necesita enviar algunos formularios, la URL de la página donde se encuentra la información que desea obtener, qué reglas, etc.

La siguiente publicación de blog toma el proyecto Blogger como ejemplo. Este proyecto rastrea todas las publicaciones de Weibo de un usuario específico de Sina Weibo desde el registro hasta el presente y rastrea 100 páginas de publicaciones de Weibo (aproximadamente 1000 elementos) en función de palabras clave. .

0x03. Recopile la información necesaria

Primero visite la página web de destino y descubra que necesita iniciar sesión. Ingrese a la página de inicio de sesión de la siguiente manera: Página de inicio de sesión de la versión móvil de Sina Weibo

Preste atención a la segunda mitad de la URL. Hay muchos caracteres de escape en forma de "%xx", que se analizarán más adelante en este artículo.

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

Este código de verificación solo se requiere recientemente (este artículo se escribió el 11 de marzo de 2016). Si no necesita proporcionar un código de verificación, habrá dos métodos para iniciar sesión.

La primera es completar la cuenta y la contraseña y ejecutar la simulación js para hacer clic en el botón "Iniciar sesión". El blogger ha escrito un rastreador de Java antes que usa este método, pero ahora no se puede encontrar el proyecto. así que no entraré en detalles aquí.

El segundo método requiere una determinada base HTTP y envía una solicitud HTTP POST que contiene la información requerida. Necesitamos la herramienta Wireshark para capturar los paquetes de datos que enviamos y recibimos al iniciar sesión en Weibo.

Como se muestra a continuación, capturé los paquetes de datos enviados y recibidos al iniciar sesión. Resultado de captura 1 de Wireshark

Proporcione las condiciones de búsqueda "/(displayID)?page=(pagenum)" en la barra de búsqueda. Esto se convertirá en la base para que nuestro rastreador una las URL.

A continuación, comprobamos el código fuente de la página web para encontrar la ubicación de la información que queremos obtener. Abra las herramientas de desarrollo del navegador y ubique directamente una publicación de Weibo para encontrar su ubicación, como se muestra a continuación.

xpath

Al observar el código html, encontramos que todos los Weibo están en la etiqueta

, y hay dos atributos en esta etiqueta, entre los cuales el atributo de clase es "c ", y un valor de atributo de identificación único. Tener esta información ayuda a extraer la información requerida.

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

* Weibo se divide en Weibo original y Weibo reenviado

* Según el tiempo de lanzamiento al hora actual Hay muchas formas de mostrar la hora en la página, como "Hace MM minutos", "Hoy HH:MM", "mm mes dd día HH:MM", "aaaa-mm-dd HH:MM:SS" * Una página de la versión móvil de Sina Weibo muestra aproximadamente 10 publicaciones de Weibo, así que preste atención a registrar el número total de páginas. Los puntos anteriores son todos detalles y deben considerarse cuidadosamente al rastrear y extraer.

0x04. Codificación

1. Usuario de rastreo Weibo

El lenguaje de desarrollo de este proyecto es Python 2.7. En el proyecto se utilizan algunas bibliotecas de terceros. Se pueden agregar bibliotecas usando pip.

Dado que la idea de que el programa inicie sesión automáticamente está bloqueada por el código de verificación, si desea acceder a la página de Weibo de un usuario específico, solo puede proporcionar cookies.

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

solicitud de importación

print request.get(url, cookies=cookies).content Utilice este código para imprimir los resultados de la página de solicitud de URL con cookies.

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

Número de páginas

El proyecto utiliza el módulo lxml para realizar la extracción XPath de html.

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

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.cook).content # Visita el primero página para obtener el número de página.

selector = etree.HTML(html)

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

return int(pagenum)

El siguiente paso es unir continuamente la URL->URL de acceso->descargar la página web.

Cabe señalar que debido a la existencia del mecanismo anti-rastreo de Sina, si la misma cookie visita la página con demasiada "frecuencia", entrará en un "período de enfriamiento", es decir, una página inútil. será devuelto Al analizar la página inútil, se descubre que esta página tendrá información específica que aparecerá en un lugar específico. Al usar la tecnología XPath para verificar si aparece información específica en este lugar específico, podemos determinar si la página es útil. a nosotros.

def ispageneeded(html):

selector = etree.HTML(html)

prueba:

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

excepto:

return False

return title.text != 'Weibo Square' y title.text =! 'Weibo'

Si aparece una página inútil, solo necesita volver a visitarla. Sin embargo, a través de experimentos posteriores, se descubrió que si se visita con frecuencia durante mucho tiempo, todas las páginas devueltas serán inútiles. El programa también caerá en un bucle infinito. Para evitar que el programa caiga en un bucle infinito, el blogger estableció un umbral para el número de intentos, trycount, y el método regresará automáticamente después de exceder este umbral.

El siguiente fragmento de código muestra el método del 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.wanted)excepto excepción, e:

print str(e)

isdone = False

mientras no está hecho e intenta < trycount:

intenta:

pagenum = self.getpagenum()

isdone = True

excepto excepción, e:

intento += 1

si intento == trycount:

return False

i = página de inicio

mientras i <= pagenum:

intento = 0

es necesario = Falso

html = ''

mientras no es necesario e intenta < trycount:

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

isneeded = self.ispageneeded(html)

if no es necesario:

intento += 1

si intento == trycount:

devuelve Falso

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

i += 1

return True

Teniendo en cuenta la eficiencia del tiempo del programa, después de escribir el rastreador de un solo subproceso, el blogger también escribió una versión del rastreador de subprocesos múltiples. La idea básica es dividir la cantidad de páginas de Weibo por la cantidad de hilos. Por ejemplo, un usuario de Weibo tiene 100 páginas de Weibo y el programa abre 10 hilos. Luego, cada hilo solo es responsable de rastrear las otras 10 páginas. Las ideas son similares a los hilos individuales. Los valores límite deben manejarse con cuidado, por lo que no entraré en detalles aquí. 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 aún más importante.

Cuando el blogger estaba escribiendo esta publicación de Weibo, utilizó una nueva cookie y rastreo de subprocesos múltiples para realizar una prueba de campo sobre el rastreo de Weibo de la Universidad de Correos y Telecomunicaciones de Beijing. Se rastrearon con éxito las 3976 publicaciones de Weibo y se extrajeron las publicaciones del blog. Solo tomó 15 segundos. La situación real puede estar relacionada con la antigüedad de las cookies y el entorno de red. La configuración de la línea de comando es la siguiente. El significado de la línea de comando se explica en el sitio web del proyecto. ; SUHB=xxx; SUB=xxx; gsid_CTandWM=xxx u bupt m 20 20 La introducción básica anterior al trabajo de rastreo ha terminado y luego viene la segunda parte del rastreador, que se analiza. Dado que el proyecto proporciona un método de rastreo de subprocesos múltiples, y los subprocesos múltiples generalmente están desordenados, pero las publicaciones de Weibo están ordenadas por tiempo, el proyecto adopta un método de compromiso para guardar las páginas descargadas en el sistema de archivos local. Cada página usa su propia página. número como nombre del archivo Una vez completado el trabajo de rastreo, se atraviesan y analizan todos los archivos de la carpeta.

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

Me gustaría recordarles nuevamente que Weibo se divide en Weibo reenviado y Weibo original, así como métodos de expresión de tiempo. Además, dado que nuestro tema de investigación solo está interesado en el texto de Weibo, no se consideran las imágenes adjuntas.

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.HTML(html)

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

weibo = Weibo()

weibo .id = item.xpath('./@id')[0]

cmt = item.xpath('./div/span[@class="cmt"]')if len(cmt ) != 0:

weibo.isrepost = Verdadero

weibo.content = cmt[0].text

else:

weibo.isrepost = False

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

si ctt.text no lo es Ninguno:

weibo.content += ctt.text

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

si a.text es no Ninguno:

weibo.content += a.text

si a.tail no es Ninguno:

weibo.content += a.tail p>

si len(cmt) != 0:

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

si len( motivo) != 1:

weibo.repostreason = motivo[0]

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

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

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

f.close()

La intención original de establecer el tiempo de análisis del parámetro pasado por el método es que el rastreo y el análisis no se puedan realizar en Al mismo tiempo, en la etapa inicial de desarrollo (no estrictamente "al mismo tiempo"), la visualización de la hora de Weibo se basa en el tiempo de acceso. Por ejemplo, el tiempo de rastreo es las 10:00. En este momento, se muestra un rastreo de Weibo. que se publicó hace 5 minutos, pero si la hora de análisis son las 10:30, entonces la hora de análisis será incorrecta, por lo que debe establecerse en las 10:00. En la etapa posterior, cuando el rastreador esté básicamente desarrollado, se reducirá la brecha entre el tiempo de inicio del trabajo de rastreo y el trabajo de análisis. La diferencia de tiempo será la duración del proceso de rastreo, que básicamente se puede ignorar.

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

def save(self):

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

f.close()

2. >

Del mismo modo, recopile la información necesaria. Escriba "python" en la página de búsqueda de la versión 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 y este patrón se puede aplicar nuevamente a la primera página.

La segunda página

Después de la aplicación , el patrón se puede aplicar a la primera página. Page

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

Además, si la palabra clave es china, entonces la URL debe convertir caracteres chinos. Por ejemplo, si escribimos "feliz" en el cuadro de búsqueda y buscamos, encontramos que la URL es la siguiente: buscar feliz

Pero cuando se copió fue

/search/mblog?hideSearchFrame=&keyword=%E5%BC%80%E5%BF%83&page=1 Afortunadamente, la biblioteca urllib de Python tiene el método qoute para manejar la conversión al chino (si es inglés, no se realizará ninguna conversión), así que utilice 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 fase de recopilación de datos, solo se proporciona un hilo para descargar la página web. Si se necesitan varios hilos, puede seguir el método de múltiples hilos. del usuario rastreador Weibo Vuelva a escribirlo usted mismo. 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 más tarde (hao) después de reconstruir (xin) (qing), así que hagamos esto por ahora).

def keywordcrawling(self, palabra clave):

realkeyword = urllib.quote(keyword) # Maneja la palabra clave en chino.

prueba:

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

excepto excepción, e:

print str(e)

weibos = []

try:

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:

html = self.getpage('/search/mblog?keyword=%s&page=1' % palabra clave real)es necesario = self.ispageneeded (html)

si es necesario:

selector = etree.HTML(html)

pruebe:

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

pagenum = 1

para i en rango(1, pagenum + 1):

prueba:

es necesario = False

mientras no es necesario:

html = self.getpage('/search /mblog?keyword=%s&page=%s' % (palabra clave real, str(i)))isneeded = self.ispageneeded(html)

selector = etree.HTML(html)

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

cmt = item.xpath('./div/span[ @class="cmt"]')if (len(cmt)) == 0:

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

si ctt.text no es Ninguno:

text = etree.tostring(ctt, método='text', encoding="unicode")tail = ctt.tail

si texto.endswith(cola):

índice = -len(cola)

texto = texto[1:índice]

text = highpoints.sub(u'\u25FD', text) # Manejo de emojis, parece gama

no funciona.

weibotext = text

weibos.append(weibotext)

print str(i) + '/' + str(pagenum)

excepto excepción, e:

print str(e)

f = open(sys.path[0] + '/keywords/' + palabra clave + ' .txt', 'w')intenta:

f.write(json.dumps(weibos,indent=4,ensure_ascii=False))excepto excepción, por ejemplo:

imprimir str (ex)

finalmente:

f.close()

El blogger nunca antes había escrito ningún programa de rastreo para obtener publicaciones del blog de Sina Weibo. El blogger ha escrito tres programas de rastreo diferentes sucesivamente, uno es Python y el otro es Java. Es normal que el rastreador no se pueda utilizar. No se desanime. El programa de rastreo y el mecanismo anti-rastreo siempre están en constante competencia. .

Además, informe al blogger si reimprime. Si cree que el blogger es genial, no es necesario que se lo informe.