prefacio
Recientemente, la empresa necesita comprar datos de algunos usuarios, como paquetes de regalo con la mayor cantidad total
Pero encontré que el sitio web no proporciona un canal de descarga (el operador me dijo, si no es mi culpa┓(;´_`)┏)
"Descubrí que una página tiene solo diez datos y no hay saltos, por lo que simplemente rastrear la página web definitivamente no es suficiente.
Luego escribí un rastreador para obtener el formulario y ha estado fallando. Descubrí que el sitio web puede tener un grado relativamente alto de anti-rastreador. . .
Busqué en Internet y encontré la biblioteca de selenium, no la había usado antes, es bastante interesante, así que decidí usar esta.
Preparar
El conocimiento básico sigue siendo necesario, puedes ver el gran blog
Luego instalemos el controlador del navegador. Aquí usamos edge, que debería estar disponible.
Verifique primero la versión , busque el controlador
correspondiente , descárguelo, descomprímalo, colóquelo en el directorio de python y guarde la ruta actual en la variable de entorno (Mi PC>>Haga clic con el botón derecho en Propiedades>>Configuración avanzada del sistema>>Avanzado>>Variables de entorno>>Variables del sistema>>Ruta)
Pero cuando ejecutamos el programa, encontraremos errores.
De hecho, simplemente cambie el nombre del controlador por el que aparece en este informe de error.
Instalar sin biblioteca de selenio
esa es una buena preparación
1. Abra la página web
Selenium es una operación de simulación, así que comience abriendo el navegador
Primero importamos la biblioteca y establecemos la ubicación
from selenium import webdriver
import time
import pandas as pd
import numpy as np
pd.set_option('display.max_rows', 50)
pd.set_option('display.max_columns', 10)
Luego abrimos el navegador, aquí usamos edge, deberían estar todos, vamos directo al sitio web
driver = webdriver.Edge()
driver.get('https://me.modian.com/u/user_index')
time.sleep(1)
Tenga en cuenta que la pantalla es diferente del navegador abierto normal
2. Cuenta de inicio de sesión
Dado que es completamente automático, necesitamos usar la contraseña de la cuenta. Mirando la posición de este botón
está bien, encontramos que podemos usar class para ubicar la etiqueta superior, luego h3, y finalmente la operación span+click
Los blogs mencionados anteriormente en esta parte tienen instrucciones, por lo que puede echarles un vistazo primero.
El siguiente paso es ubicar y hacer clic
Aquí hay un intervalo de tiempo porque tenemos que esperar a que el navegador responda, y lo mismo se aplica más adelante.
button1=driver.find_element_by_xpath("//*[@class='login_field']/h3/span")
time.sleep(1)
button1.click()
El siguiente paso es encontrar dos cuadros de entrada y luego iniciar sesión, es decir, encontrar tres componentes
Todavía ubique el nivel inferior a través de la clase, y luego simulamos dos entradas y un clic (descárguelo por mí sin cambiar la contraseña de la cuenta y ejecútelo directamente Ψ ( ̄∀ ̄) Ψ)
time.sleep(1)
driver.find_element_by_xpath("//*[@class='phone']/input").send_keys('你的账号')
driver.find_element_by_xpath("//*[@class='password']/input").send_keys('你的密码')
button2=driver.find_element_by_xpath("//*[@class='loginBtn hover other_input']")
button2.click()
Ahora hemos ingresado a la página de inicio de la cuenta, pero la información del cliente aún no está aquí, está aquí,
por lo que aún debemos hacer clic en
time.sleep(1)
driver.find_element_by_xpath("//*[@id='user_manage']/a").click()
time.sleep(1)
Ok por fin ingresé a la página de datos, perfecto! (* ^ - ^ *)ゞ
Leer y guardar datos
Primero crea un marco de datos para guardar los datos.
df = pd.DataFrame(columns = ['id','name','金额'])
num=0
Luego mire dónde están los datos
, luego podemos leer todas las líneas de información de acuerdo con la clase y luego dividir cada línea de información
userslist = driver.find_elements_by_xpath("//tr[@class='el-table__row']")
for user in userslist:
data=user.text.split('\n')
print(data)
Después de todo, es información de la empresa y el código es grueso, pero aún se puede ver que un cliente tiene 7 información
El siguiente paso es seleccionar la información que queremos guardar y cambiar la impresión (datos) al siguiente código
Tenga en cuenta que no queremos modificar las filas del grupo en el registro de la última transacción, así que haga un juicio
if len(data) == 7 :
if data[2] == "成交客户":
df.loc[num,'id'] = data[3]
df.loc[num,'name'] = data[0]
df.loc[num,'金额'] = data[4]
num = num+1
Sin embargo, se puede informar un error durante la operación. Esta es otra razón.
En el ejemplo de ahora, todos los grupos tienen datos. ¿Qué sucede si este elemento está en blanco?
Oh, solo hay seis datos, por lo que, por supuesto, está mal según el formato original, así que agregue otro juicio
if len(data) == 6:
if data[1] == "成交客户":
df.loc[num,'id'] = data[2]
df.loc[num,'name'] = data[0]
df.loc[num,'金额'] = data[3]
num = num+1
De esta manera, podemos obtener los datos de una página y, por supuesto, tenemos que pasar la página más tarde, ¡la forma antigua es encontrar el botón y hacer
clic en él!
driver.find_element_by_xpath("//*[@class='el-icon el-icon-arrow-right']").click()
#print(df[-10:-1])
time.sleep(2)
De esta manera, puede leer página por página. El tiempo anterior se puede acortar si su red es lo suficientemente rápida, de lo contrario, se repetirá la lectura. El
siguiente es el trabajo repetido. Para ello,
for i in range(1): #你的页数!!!!!!!!!!!!!!!!!!别问我怎么只有一页数据
userslist = driver.find_elements_by_xpath("//tr[@class='el-table__row']")
for user in userslist:
data=user.text.split('\n')
if len(data) == 7 :
if data[2] == "成交客户":
df.loc[num,'id'] = data[3]
df.loc[num,'name'] = data[0]
df.loc[num,'金额'] = data[4]
num = num+1
if len(data) == 6:
if data[1] == "成交客户":
df.loc[num,'id'] = data[2]
df.loc[num,'name'] = data[0]
df.loc[num,'金额'] = data[3]
num = num+1
driver.find_element_by_xpath("//*[@class='el-icon el-icon-arrow-right']").click()
#print(df[-10:-1])
time.sleep(2)
Finalmente agregue un guardado
df.to_excel(r'D:\allmoney.xlsx',index = False)
Finalización * \ (^ o ^) / *
código completo
# -*- coding: utf-8 -*-
"""
Created on Wed Feb 23 19:08:35 2022
@author: xyyl
"""
# -*- coding: utf-8 -*-
"""
Spyder Editor
This is a temporary script file.
"""
from selenium import webdriver
import time
import pandas as pd
import numpy as np
pd.set_option('display.max_rows', 50)
pd.set_option('display.max_columns', 10)
#打开
driver = webdriver.Edge()
driver.get('https://me.modian.com/u/user_index')
time.sleep(1)
#定位账号密码登录
button1=driver.find_element_by_xpath("//*[@class='login_field']/h3/span")
time.sleep(1)
button1.click()
#输入账号密码
time.sleep(1)
driver.find_element_by_xpath("//*[@class='phone']/input").send_keys('你的账号')
driver.find_element_by_xpath("//*[@class='password']/input").send_keys('你的密码')
button2=driver.find_element_by_xpath("//*[@class='loginBtn hover other_input']")
button2.click()
#跳转信息
time.sleep(1)
driver.find_element_by_xpath("//*[@id='user_manage']/a").click()
time.sleep(1)
#创建dataframe
df = pd.DataFrame(columns = ['id','name','金额'])
num=0
#定位客户列表
for i in range(1): #你的页数!!!!!!!!!!!!!!!!!!别问我怎么只有一页数据
userslist = driver.find_elements_by_xpath("//tr[@class='el-table__row']")
for user in userslist:
data=user.text.split('\n')
if len(data) == 7 :
if data[2] == "成交客户":
df.loc[num,'id'] = data[3]
df.loc[num,'name'] = data[0]
df.loc[num,'金额'] = data[4]
num = num+1
if len(data) == 6:
if data[1] == "成交客户":
df.loc[num,'id'] = data[2]
df.loc[num,'name'] = data[0]
df.loc[num,'金额'] = data[3]
num = num+1
driver.find_element_by_xpath("//*[@class='el-icon el-icon-arrow-right']").click()
#print(df[-10:-1])
time.sleep(2)
df.to_excel(r'D:\allmoney.xlsx',index = False)
El efecto es bueno, excepto que los datos se ejecutan durante mucho tiempo, y se puede comparar con un
blogger que es como un sitio web que está a punto de terminarse y no funciona ( ̄ω ̄;)