Red de conocimiento informático - Material del sitio web - Cómo utilizar Python para rastrear datos de lectura de Douban

Cómo utilizar Python para rastrear datos de lectura de Douban

En los últimos dos días, rastreé alrededor de 100.000 información bibliográfica en Douban Reading. Ahora estoy aprovechando este tiempo libre para resumir el código. y utilicé el método más simple y estúpido, y les pedí a los grandes dioses que pasaban que me dieran algunos consejos.

El primer paso es echar un vistazo a las bibliotecas que necesitamos:

solicitudes de importación? #Se utiliza para solicitar páginas web

desde bs4 importar BeautifulSoup #Parse páginas web

¿tiempo de importación?#Establezca el tiempo de retraso para evitar que los números IP se bloqueen debido a un rastreo con demasiada frecuencia

importar re #Biblioteca de expresiones regulares

importar pymysql? #Debido al rastreo Hay demasiados datos para recuperar, necesitamos almacenarlos en la base de datos MySQL. Esta biblioteca se usa para conectarse a la base de datos

importar aleatoriamente #Esta biblioteca usa la función randint. genera números aleatorios y coincide con el tiempo anterior Haga que el intervalo de rastreo sea aleatorio

Esta es la URL de Douban: x-sorttags-all

Queremos obtener los enlaces de etiquetas de todas las categorías. aquí y rastree más la información que contiene. Pegue el código primero:

solicitudes de importación

desde bs4 import BeautifulSoup ?Importar biblioteca

url="httom/. tag/?icn=index-nav"

wb_data=requests.get(url) #Solicitar URL

soup=BeautifulSoup(wb_data.text, "lxml") ?#Analizar web información de la página

etiquetas =soup.select("#content gt; div gt; div.article gt; div gt; div gt; table gt; tbody gt; tr gt; td gt; a")

#Según la ruta CSS Buscar información de etiquetas, método de adquisición de ruta CSS, selector de copia con clic derecho, etiquetas devuelve una lista

para etiquetas en etiquetas:

tag=tag.get_text() #Extraerá la información de cada etiqueta en la lista

helf="hom/tag/"

#Mire la URL de Douban Básicamente, esto. La parte se agrega con información de la etiqueta, por lo que Para ensamblar la URL, se utiliza para rastrear la página de detalles de la etiqueta

url=helf str(tag)

print(url) #The La URL se ensambla y se genera

Lo anterior. Rastreamos las URL bajo todas las etiquetas. Nombramos este archivo canal, creamos una cadena de canal en el canal y colocamos toda la información de la URL que rastrearemos directamente. aquí cuando rastreamos la página de detalles simplemente extraiga el enlace, de la siguiente manera:

channel='''

tag/program

'''

Ahora iniciamos el segundo programa.

QQ Picture 20160915233329.png

La información de cada imagen en la página de pestañas es básicamente así. Podemos extraer directamente el título, el autor, el editor y la hora de publicación desde aquí. El método de extracción de información como precio, número de revisores y calificaciones (algunas obras extranjeras también tendrán información del traductor) es similar a la extracción de etiquetas y también se extrae según la ruta CSS.

Primero usamos una URL para experimentar con el rastreo:

url="htt/tag/科技"

wb_data = request.get(url) p>

sopa = BeautifulSoup(wb_data.text.encode("utf-8"), "lxml")

tag=url.split("?")[0].split (" /")[-1] #Extraiga la información de la etiqueta del enlace para facilitar el almacenamiento

detils=soup.select("#subject_list gt; ul gt; li gt; div.info gt; div. pub" ) ?#Toma la información del autor y del editor, y luego usaremos la función despecho() para separarlos

scors=soup.select("#subject_list gt; ul gt; li gt; div . info gt; div.star.clearfix gt; span.rating_nums") ? #Capturar información de calificación

persons=soup.select("#subject_list gt; ul gt; li gt; div.info gt; div.star.clearfix gt; span.pl") #Número de revisores

titles=soup.select("#subject_list gt; ul gt; li gt; div.info gt; h2 gt; a" ) ? #书名

#La información capturada arriba es toda la información de etiquetas de lenguaje HTML que necesitamos, y también debemos separarlas una por una

para detil, scor, person. , título en zip(detils, scors, people, titles):

#Utilice una función zip() para implementar un recorrido

#Porque algunas etiquetas tienen información del traductor y otras etiquetas sí. no, para evitar errores, necesitamos usar un try para ejecutarlos por separado

try:

author=detil.get_text().split("/", 4) [0 ].split()[0] #Este es el método de extracción que contiene información del traductor. Según "/"?, la etiqueta se divide en cinco partes y luego se extrae en secuencia

yizhe= detil. get_text().split("/", 4)[1]

publish=detil.get_text().split("/", 4)[2]

tiempo= detil.get_text( ).split("/", 4)[3].split()[0].split("-")[0] #Hora en la que solo extrajimos el año de publicación

price=ceshi_priceone( detil) #Debido a que las unidades de precios no son uniformes, usamos una función para convertirlas en "yuanes"

scoe=scor.get_text() si es Verdadero else "" #Algunos libros no están clasificados, para evitar errores, configuramos la información sin clasificar como vacía

person=ceshi_person(person)?#Se muestra que el número de revisores de algunos libros es inferior a diez. ocurre durante el proceso de rastreo. Utilice una función para manejarlo

title=title.get_text().split()[0]

>#Cuando no haya información del traductor, se mostrará IndexError y lo manejaremos por separado

excepto IndexError:

pruebe:

author=detil.get_text (). split("/", 3)[0].split()[0]

yizhe="" #Divida la información detallada en 4 partes para la extracción. La información del traductor se configura directamente en. vacío Los demás son iguales que los anteriores. Igual

publish=detil.get_text().split("/", 3)[1]

time=detil.get_text() .split("/", 3) [2].split()[0].split("-")[0]

precio=ceshi_pricetwo(detil)

scoe =scor.get_text() si es Verdadero en caso contrario ""

persona=ceshi_persona(persona)

título=título.get_text().split()[0]

excepto (IndexError, TypeError):

continuar ?

#Si aparecen otros mensajes de error, ignórelos y continúe la ejecución (alguna información bibliográfica no tendrá editorial ni año de publicación). , pero el número es muy pequeño y no afecta nuestro rastreo a gran escala, así que ignórelo directamente)

excepto TypeError:

continuar

#Función para extraer el número de evaluadores. Si el número de evaluadores es inferior a diez, se tratará como diez.

def ceshi_person(person):

try:

.

persona = int(persona.get_text().split()[0][1:len( persona.get_text().split()[0]) - 4])

excepto ValueError :

persona = int(10)

retorno persona

#Función para extraer precios según las circunstancias, utilizar expresiones regulares para buscar información que contenga caracteres especiales y conviértalo a "yuanes"

def ceshi_priceone(precio):

precio = detil.get_text().split("/", 4)[4].split()

if re.match("USD", precio[0]):

precio = float(precio[1]) * 6

elif re.match ("CNY", precio[0]):

precio = precio[1]

elif re.match("\A$", precio[0]):

precio = float(precio[1:len(precio)]) * 6

más:

precio = precio[0]

precio de retorno

def ceshi_pricetwo(precio):

precio = detil .get_text().split("/", 3)[3].split()

if re.match("USD", precio[0]):

precio = float(pr

hielo[1]) * 6

elif re.match("CNY", precio[0]):

precio = precio[1]

elif re.match("\A$", precio[0]):

precio = float(precio[1:len(precio)]) * 6

más:

p>

precio = precio[0]

precio de retorno

Una vez que el experimento sea exitoso, podemos rastrear los datos e importarlos a la base de datos. El siguiente es el código fuente completo, especial La situación se explicará una por una con comentarios.

importar solicitudes

desde bs4 importar BeautifulSoup

tiempo de importación

importar re

importar pymysql

¿del canal de importación del canal? #Esta es la información del enlace rastreada por nuestro primer programa

importación aleatoria

def ceshi_person(persona):

intenta :

persona = int(persona.get_text().split()[0][1:len(persona.get_text().split()[0]) - 4])

excepto ValueError:

persona = int(10)

persona de retorno

def ceshi_priceone(precio):

precio = detil.get_text().split("/", 4)[4].split()

if re.match("USD", precio[0]):

precio = float(precio[1]) * 6

elif re.match("CNY", precio[0]):

precio = precio[1]

p>

elif re.match("\A$", precio[0]):

precio = float(precio[1:len(precio)]) * 6

else:

precio = precio[0]

precio de devolución

def ceshi_pricetwo(precio):

precio = detil. get_text().split("/", 3)[3].split()

if re.match("USD", precio[0]):

precio = float(precio[1]) * 6

elif re.match("CNY", precio[0]):

precio = precio[1]

elif re.match("\A$", precio[0]):

precio = float(precio[1:len(precio)]) * 6

otro:

precio = precio[0]

precio de retorno

#Esta es la función de prueba anterior, la ponemos en la función principal

def mains(url):

wb_data = request.get(url)

sopa = BeautifulSoup(wb_data.text.encode("utf-8"), "lxml ")

tag=url.split("?")[0].split("/")[-1]

detils=soup.select("#subject_list gt ; ul gt; li gt; div.info gt; div.pub")

scors=sopa.selec

t("#subject_list gt; ul gt; li gt; div.info gt; div.star.clearfix gt; span.rating_nums")

persons=soup.select("#subject_list gt; ul gt ; li gt; div.info gt; div.star.clearfix gt; span.pl")

titles=soup.select("#subject_list gt; ul gt; li gt; div.info gt; h2 gt; a")

para detil, scor, persona, título en zip (detil, scors, personas, títulos):

l = [] ?#Crear una lista, Se utiliza para almacenar datos

pruebe:

author=detil.get_text().split("/", 4)[0].split()[0]

yizhe= detil.get_text().split("/", 4)[1]

publish=detil.get_text().split("/", 4)[2]

tiempo=detil.get_text().split("/", 4)[3].split()[0].split("-")[0]

precio= ceshi_priceone(detil)

scoe=scor.get_text() si es Verdadero else ""

persona=ceshi_person(persona)

title=title.get_text() .split()[0]

excepto IndexError:

intenta:

autor=detil.get_text().split("/", 3)[ 0].split()[0]

yizhe=""

publish=detil.get_text().split("/", 3)[1]

tiempo=detil.get_text().split("/", 3)[2].split()[0].split("-")[0]

precio=ceshi_pricetwo( detil)

scoe=scor.get_text() si es Verdadero else ""

persona=ceshi_person(persona)

title=title.get_text().split ()[0]

excepto (IndexError, TypeError):

continuar

excepto TypeError:

continuar

l.append([título, alcance, autor, precio, tiempo, publicación, persona, yizhe, etiqueta])

#Complete los datos rastreados en la lista en secuencia

sql="INSERT INTO allbooks value(s, s, s, s, s, s, s, s, s)" ?#Esta es una declaración de inserción SQL

<

p>cur.executemany(sql, l)? #Ejecutar sentencias sql e insertar lotes en la base de datos usando la función ejecutarmary()

conn.commit()

#La función principal termina aquí

# Conecte Python a la base de datos de Python en MySQL

conn = pymysql.connect( usuario="root", contraseña="123123", base de datos="python", conjunto de caracteres ='utf8')

cur = conn.cursor()

cur.execute('DROP TABLE IF EXISTS allbooks') #Si hay una base de datos de todos los libros en la base de datos. , elimínelo

sql = """CREATE TABLE allbooks(

título CHAR(255) NOT NULL,

puntuación CHAR(255),

autor CHAR(255),

precio CHAR(255),

tiempo CHAR(255),

publicación CHAR(255),

persona CHAR(255),

yizhe CHAR(255),

etiqueta CHAR(255)

)"""

cur.execute(sql)?#Ejecutar la instrucción sql y crear una nueva base de datos de todos los libros

start = time.clock() #Configurar un reloj para que podamos saber cuánto tiempo tardamos. he rastreado

En busca de URL en channel.split():

urlss=[urls "?start={}amp;type=T".format(str(i)) para i in range(0, 980, 20)]? #Extraer información de URL del canal y ensamblarla en enlaces para cada página

para URL en urlss:

mains(url)? #Ejecute la función principal y comience a rastrear

print(url) #Genere el enlace a rastrear, para que podamos saber dónde rastrear y sea fácil manejar los errores si ocurren

time.sleep(int(format(random.randint(0, 9)))) ? Establezca un número de tiempo aleatorio Cada vez que rastree una página web, puede pausar durante un período de tiempo aleatorio para evitar que IP para que no se bloquee

end = time.clock()

print('Time Usage:', end - start) #El rastreo finaliza, tiempo de rastreo de salida

count = cur.execute('select * from allbooks')

print('has s record' count)? #Generar el número total de elementos rastreados

# Liberar los datos conexión

si cur:

cur.close()

si conn:

conn.close()

De esta manera, se completa un programa y la información bibliográfica de Douban se escribe en nuestra base de datos una por una. Por supuesto, durante el proceso de rastreo, también encontramos muchos problemas, por ejemplo, habrá espacios en la información devuelta. título después de dividirlo, y habrá errores al escribir en la base de datos.

Se produjo un error, por lo que solo se interceptó la primera parte del título, lo que resultó en algunos títulos incompletos en la base de datos. Si alguno de los maestros anteriores tiene alguna idea, por favor deme algún consejo.

El proceso de espera para gatear es largo y gratificante al ver cómo se borra la información en la computadora, una sensación de logro llega a mi corazón inconscientemente, sin embargo, si se arrastra mientras comes, lo harás. Se arrastra cuando vas al baño. Cuando subes una montaña y regresas y todavía se arrastra, colapsará un poco y te preocupa que la computadora se rompa en cualquier momento (los estudiantes pobres todavía no pueden permitirse el lujo de reemplazarla). ~)

Entonces, todavía tienes que aprender a establecer puntos de interrupción, subprocesos múltiples y reglas regulares. El camino es largo y largo, y lo exploraré de arriba a abajo~***Mian~.