Ejemplo de rastreo de oferta masiva de Renrendai
1. Meta
Tome el registro masivo del sitio web oficial de Renrendai (https://www.renrendai.com/loan.html) y extraiga la información del prestatario de él. Los resultados son los siguientes:
2. Preparativos
La biblioteca de python utilizada es la siguiente (python3):
#常规爬虫库
import requests
from bs4 import BeautifulSoup
import re
import json
import csv
#selenium登录
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
#多进程
from multiprocessing import Process, Queue
import time
3. Implementación de rastreo
3.1principal()
Ingrese una orden de oferta suelta en la lista de ofertas sueltas a través del sitio web oficial, su URL es https://www.renrendai.com/loan-6782341.html, donde 6782341 es el número de la orden de oferta suelta y el valor cambiado es el número de orden ¿Cuánto es el registro de dispersión.
Use multiproceso para capturar datos de 10 W a la vez y use la generación de listas para construir la URL.
3.1.1 Construir URL
start_id es el ID de orden de inicio. Si usa varios procesos, puede crear varias listas de URL según sea necesario
o usar un generador para construir direcciones URL para reducir el uso de memoria.
#
start_id = 1 #start_id为起始订单id
init_url = "https://www.renrendai.com/loan-{}.html"
url_list1 = [init_url.format(i + start_id + 00000) for i in range(25000)]
3.1.2 Iniciar el proceso de lectura/escritura
Cuando se ejecuta el programa, mostrará que todo está bien, finalice para indicar que se ejecuta el programa.
PD: si se trata de varios procesos secundarios, puede usar el grupo de procesos Pool para escribirlo, por lo que no necesita escribirlo así
#2.父子进程就绪
#2.1父进程创建Queue,并传给各个子进程:
q = Queue()
pw1 = Process(target=getHtmlText, args=(q, url_list1))
pr = Process(target=parseAndSave, args=(q,))
#2.2启动子进程pw*,pd,
pw1.start()
pr.start()
#2.3等待pw结束即全部读取进程工作完毕,才强制中止pr进程
pw1.join()
print("******************everything is ok,please terminate ******************")
3.2 obtener_nueva_cookie()
En el caso de probar muchas veces, la cookie de sesión caducará en unos minutos 20. Al final, solo puedo iniciar sesión en la cuenta usando selenio y actualizar la cookie después de iniciar sesión en la sesión.
PD: El proceso del controlador del navegador debe cerrarse con la función quit (). El uso de close () provocará pérdidas de memoria. Los
códigos clave se implementan de la siguiente manera:
def get_new_cookie(session):
driver = webdriver.Chrome()
cookies = driver.get_cookies()
c = requests.cookies.RequestsCookieJar()
for item in cookies:
c.set(item["name"], item["value"])
session.cookies.update(c) # 登陆后刷新cookies
driver.quit()
3.3 analizar y guardar ()
Analizar la página y extraer alguna información.
while True:
html_text_list = q.get(True)
for index,html_text in enumerate(html_text_list):
try:
#根据网页url进行常规解析/Beautiful的常规操作
bs = BeautifulSoup(html_text, "html.parser")
info = str(bs.find("script", {
"src": "/ps/static/common/page/layout_c0258d7.js"}).next_sibling.string).replace("\n","")
#根据正则表达式提取信息所在片段,并进行手动转码处理
infoProcess = pattern.findall(info)[0].encode('utf-8').decode("utf-8").replace('\\u0022', '"').replace("\\u002D","-").replace("'","").replace("\\u005C","\\").replace(";","") #+ '"}}'
info_dict = json.loads(infoProcess)
#解析失败则跳过
if "gender" not in info_dict["borrower"]:
print("gender not in borrower'key,index:",index)
continue
with open("all.csv","a") as csvfile:
writer = csv.writer((csvfile))
#具体写入数据可根据json进行取舍
writer.writerow(info_dict["loan"]["loanId"])
print("id:{} has done".format(info_dict["loan"]["loanId"]))
except Exception as e:
print("Exception in parser:",info_dict["loan"]["loanId"])
continue
3.4 obtenerTextoHtml()
La función de getHtmlText() es el proceso de lectura de datos, es decir, realizar una solicitud de acuerdo con la URL proporcionada por la función principal y volver a iniciar sesión periódicamente para actualizar las cookies. Esta función utiliza la Cola de multiprocesamiento para pasar la página devuelta a la función de análisis de datos parseAndSave().
El fragmento de código principal es el siguiente:
for index,url in enumerate(url_list):#len(url_list):
try:
res = session.get(url,timeout=10,headers=my_header)
res.raise_for_status()
res.encoding = res.apparent_encoding
htmlTextList.append(res.text)
print("request:"+str(index))
if (index+1)%250 == 0:
print(res.text)
get_new_cookie(session)
#网页文本列表满十个就向解析进程发送数据
if (index+1)%10 == 0:
q.put(htmlTextList)
htmlTextList = []
except Exception as e:
print("Exception in request:",index)
4. Finalmente
1. El artículo solo brinda algunos códigos clave/el código completo se puede colocar en github más tarde
2. Las solicitudes utilizadas en el artículo bloquean el acceso, y la biblioteca aiohttp asíncrona se puede usar para rastrear 1200 registros dispersos en un minuto.