Realice ilustraciones de la estación p de rastreo por lotes de python de 0

1. Razones para escribir este artículo

       No he escrito un rastreador durante mucho tiempo y casi lo he olvidado. Comience con imágenes de rastreo de la estación p para revisar y practicar los rastreo.

 

2. Obtenga el código fuente de la página web

      El proceso de rastreo de datos de la página web utiliza principalmente la biblioteca de solicitudes. Un proceso simple de implementación del rastreador web se puede dividir aproximadamente en los siguientes pasos:

  • Especificar la URL de rastreo
  • Iniciar una solicitud de rastreo
  • Almacenar datos de rastreo

      Tome el rastreo del sitio web pixiv como ejemplo, obtenga el código fuente de la página de inicio del sitio web pixiv y guárdelo en el archivo pixiv1.html.

import requests


if __name__ == "__main__":

    # step 1: 爬取网页数据

    # 指定url
    url = 'https://www.pixiv.net/'
    # 发起请求
    home_text = requests.get(url).text

    # step 2: 解析爬取数据

    # step 3: 存储爬取数据
    save_path = './pixiv1.html'
    with open(save_path, 'w', encoding='utf-8') as fp:
        fp.write(home_text)
        print('下载成功!')

       Después de las operaciones anteriores, se generará un archivo "pixiv1.html" en el directorio actual. Haga doble clic en el archivo para abrirlo y verá que se parece a la imagen de abajo. Primero debe iniciar sesión para acceder al sitio web, por lo que pasará a la página de registro de inicio de sesión y las páginas están todas en japonés.

       Para resolver este problema, haga clic con el botón derecho para verificar la página web, ingrese a la red y luego actualice la página. Si hay actualización de datos, haga clic para ver los encabezados. Se encuentra que hay cookies en los encabezados de la solicitud, por lo que debe disfrazar el UA, configurar el encabezado de la solicitud y copiar el encabezado de la solicitud en el bloque de código.

# 指定url
url = 'https://www.pixiv.net/'
headers = {
    'user-agent': '你的user-agent',
    'referer':'https://www.pixiv.net/',
    'sec-fetch-dest':'document',
    'sec-fetch-mode':'navigate',
    'sec-fetch-site':'same-origin',
    'sec-fetch-user':'1',
    'upgrade-insecure-requests':'1',
    'accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
    'accept-encoding':'gzip, deflate, br',
    'accept-language':'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7',
    'cache-control':'max-age=0',
    'cookie': '你的浏览器cookie'
}
# 发起请求
home_text = requests.get(url, headers=headers).text

       Abra de nuevo el archivo de página web guardado "pixiv2.html" y descubra que la página no es como la que iniciamos sesión, sino como se muestra en la figura siguiente.

       Niños, ¿tienen muchos signos de interrogación ...

 

Tres, rastrea una sola miniatura

       Como se puede ver en el capítulo anterior, la parte de la ilustración de la página de inicio no es el código fuente directo de la página de inicio, pero introduce otra dirección de página web y un script. Aquí, al ingresar a la página web y analizar, haga clic con el botón derecho en la imagen y haga clic en verificar para obtener la dirección de la imagen.La imagen es relativamente pequeña y es una miniatura. Copie la dirección de la imagen y péguela en la barra de direcciones del navegador para mostrar la imagen.

       De acuerdo con la dirección de la imagen obtenida, acceda directamente a la dirección de la imagen, obtenga los datos de la imagen y almacénelos localmente.

import requests

if __name__ == "__main__":
    # 指定url
    url = 'https://i.pximg.net/c/360x360_70/custom-thumb/img/2020/09/19/02/56/19/84460298_p0_custom1200.jpg'
    # 发起请求
    img_data = requests.get(url).content
    # 存储图片
    img_path = './1.jpg'
    with open(img_path, 'wb') as fp:
        fp.write(img_data)
        print('下载成功!')

      Entonces, la imagen llamada "1.jpg" se genera en el directorio actual, haga doble clic para abrirla y encontrar un error. Como se muestra abajo.

        Esto se debe a que falta la información del encabezado de la solicitud y es necesario agregar el encabezado de la solicitud. El código es el siguiente:

# 指定url
url = 'https://i.pximg.net/c/360x360_70/custom-thumb/img/2020/09/19/02/56/19/84460298_p0_custom1200.jpg'
# UA伪装
headers = {
    'user-agent': '你的user-agent',
    'cookie': '你的浏览器cookie',
    'referer':'https://www.pixiv.net/',
    'sec-fetch-dest':'document',
    'sec-fetch-mode':'navigate',
    'sec-fetch-site':'same-origin',
    'sec-fetch-user':'1',
    'upgrade-insecure-requests':'1',
    'accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
    'accept-encoding':'gzip, deflate, br',
    'accept-language':'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7',
    'cache-control':'max-age=0',

}
# 发起请求
img_data = requests.get(url, headers=headers).content

      Se genera el archivo "1.jpg", haga doble clic para abrir y la imagen única se rastreará correctamente.

 

3. Rastrear una única imagen original de alta definición

1. Obtenga la dirección de la imagen original

      Para rastrear la imagen original, primero debe obtener la dirección de la imagen. Haga clic en la miniatura de la ilustración para ingresar a la página de detalles de la ilustración y haga clic con el botón derecho en la página web de inspección de la imagen de la ilustración, como se muestra en la figura siguiente.

       Haga clic en la imagen de la izquierda para ingresar al modo de vista previa de la imagen grande, y luego haga clic con el botón derecho en la página web de inspección, puede ver que la dirección del enlace de la etiqueta a en el cuadro rojo de la derecha es la dirección de imagen original de la ilustración. Pero copie la dirección en la barra de direcciones del navegador, se muestra el código de estado 403. En este momento, haga clic para regresar a la página web original y haga clic en la imagen para ingresar al modo de imagen grande, y luego copie la dirección en la barra de direcciones del navegador para ver la imagen, y descubrió que la imagen se puede mostrar correctamente.

 

2. Rastrear imágenes originales en HD

       Primero adjunte el código para rastrear la imagen original.

import requests

if __name__ == "__main__":
    # step 1: 指定url
    url = 'https://i.pximg.net/img-original/img/2020/09/19/02/56/19/84460298_p0.jpg'
    headers = {
        'referer': 'https://www.pixiv.net/artworks/84460298',
        'user-agent':'你的user-agent'
    }
    # step 2:发起请求
    res_data = requests.get(url, headers = headers)

    # step 3: 存储数据
    res_code = res_data.status_code
    msg = '下载成功!'
    if res_code == 200 :                    # 请求成功
        img_data = res_data.content
        # 存储数据
        img_path = './img/5.png'
        with open(img_path, 'wb') as fp:
            fp.write(img_data)
            print(msg)
    else:                                   # 请求失败
        msg = "下载失败,返回状态码为:"+str(res_code)
        print(msg)
    

       De acuerdo con la dirección de la imagen original obtenida anteriormente, el parámetro de referencia de los encabezados debe establecerse en el proceso de solicitud de la imagen original; de lo contrario, la solicitud no tendrá éxito.

       Para la solicitud, puede haber situaciones fallidas, que se pueden juzgar de acuerdo con el código de estado devuelto. Si el estado es 200, significa ok y la solicitud es exitosa; de lo contrario, significa que la solicitud no fue exitosa y se imprimirá la información del código de estado.

 

Cuarto, rastreo por lotes de imágenes originales de alta definición

      En comparación con "Hacer clic con el botón derecho manualmente y guardar como", el rastreo anterior de una sola imagen consume mucho tiempo y es laborioso y no solo no refleja ninguna ventaja del rastreo. Pero si le gustan la mayoría de las imágenes de este sitio web y espera guardarlas todas localmente, simplemente de forma manual Maquinaria demasiado engorrosa, el uso de orugas puede lograr esta operación fácil y rápidamente.

1. Analiza la dirección de la imagen original

      Como se puede ver en la sección anterior, aquí es para ver directamente la dirección de la imagen y luego obtener varias imágenes. Para obtener varias imágenes, un método es registrar todas las direcciones de las imágenes y guardarlas en un archivo, y descargar las imágenes leyendo las direcciones de las imágenes en el archivo; la otra forma es analizar la lógica, la composición y la relación de las direcciones de las imágenes. Evidentemente, este último es más científico y conveniente. Al hacer clic con el botón derecho en varias imágenes, obtenga las siguientes direcciones de imagen:

  1. https://i.pximg.net/img-original/img/2020/09/20/19/00/02/84495797_p0.jpg
  2. https://i.pximg.net/img-original/img/2020/09/19/18/00/29/84470884_p0.jpg
  3. https://i.pximg.net/img-original/img/2020/09/20/06/17/10/84484828_p0.png
  4. https://i.pximg.net/img-original/img/2020/09/19/00/00/44/84457006_p0.jpg

      Tomando la dirección de la primera imagen como ejemplo, se encuentra que " https://i.pximg.net/img-original/img/ " delante de la dirección y " _p0.jpg " en la parte posterior son la parte pública, solo la parte media " 2020 / 09/19/18/00/29/84470884 "La dirección es diferente a otras imágenes.

        Verifique el contenido del asunto de cada mensaje xhr viendo la vista previa de XHR en la red y obtenga el siguiente contenido de imagen.

       Los datos json en la figura anterior contienen información de imagen diferente, como la última clave para participar en la formación de la dirección de la imagen original y el referente, y el contenido de la URL en el interior es la dirección en miniatura de la imagen original, que tiene información sobre partes especiales de la imagen original. Por lo tanto, la URL de la imagen original se puede construir analizando los datos json.

 

2. Construya la dirección de la imagen original

      Primero busque la información xhr correspondiente a la vista previa y luego copie la URL de solicitud para solicitar acceso. La codificación se implementa de la siguiente manera:

import requests
import json
import pprint

if __name__ == "__main__":
    # step 1: 指定url
    url = 'https://www.pixiv.net/ajax/user/10797546/illusts?ids%5B%5D=84243244&ids%5B%5D=84089827&ids%5B%5D=83931617&ids%5B%5D=83817260&ids%5B%5D=83774711&ids%5B%5D=83630300&ids%5B%5D=83447790&ids%5B%5D=83294064&ids%5B%5D=83293792&ids%5B%5D=82883638&ids%5B%5D=82210044&ids%5B%5D=81883995&ids%5B%5D=81415445&ids%5B%5D=80789668&ids%5B%5D=79598338&ids%5B%5D=79218284&ids%5B%5D=78917052&ids%5B%5D=78768898&ids%5B%5D=78711808&lang=zh'
    headers = {
    'accept':'application/json',
    'accept-encoding':'gzip, deflate, br',
    'accept-language':'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7',
    'cookie':'你的cookie',
    'referer': 'https://www.pixiv.net/artworks/84460298',
    'sec-fetch-dest':'empty',
    'sec-fetch-mode':'cors',
    'sec-fetch-site':'same-origin',
    'user-agent':'你的user-agent',
    }
    # step 2:发起请求
    res_data = requests.get(url, headers = headers)

    # step 3: 查看请求结果
    res_json = res_data.json()
    pprint.pprint(res_json)

     Los resultados de la operación son los siguientes: 

       Se puede ver que la URL de solicitud es la dirección de interfaz correspondiente a los datos json y, al acceder a la dirección, se devuelven los datos json requeridos que contienen información de la imagen.

       De acuerdo con los datos json mostrados, se puede ver que contiene más de una información de imagen, y se pueden construir múltiples direcciones de imagen analizando el resultado de la solicitud. Los datos devueltos por el resultado de la solicitud son datos de tipo diccionario y el contenido del cuerpo es realmente útil. Primero, tal vez la parte del cuerpo de los datos del resultado, y luego, a través del método de lista, puede obtener todas las claves del diccionario, es decir, la identificación de la imagen. Al definir dos matrices, origin_url_list y origin_title_list, respectivamente, se guardan todas las direcciones de imágenes originales y los nombres de imágenes originales. Obtenga el título de la imagen tomando directamente el valor y agréguelo a la lista, analice la dirección de la miniatura mediante expresiones regulares para obtener la parte especial de la imagen original y luego realice un empalme de cadenas para obtener la dirección de la imagen original. Finalmente, puede verificar si los datos construidos son correctos imprimiendo.

    # step 3: 解析json数据
    res_json = json_res_data.json()
    res_json_body = res_json['body']                        # 获取json中的body内容
    id_list = list(res_json_body)                           # 获取body中的所有的key,即图片id
    origin_url_list = []                                        # 保存所有的原图地址
    origin_title_list = []

    # step 4: 构造原图地址
    for item in id_list:
        # 获取title
        origin_title_list.append(res_json_body[item]['title'])
        # 通过获取缩略图地址构造原图地址
        thumbnail_url = res_json_body[item]['url']          
        origin_specail_part = re.findall('img/(.*?)_p0',thumbnail_url)[0]
        origin_url_list.append("https://i.pximg.net/img-original/img/%s_p0.jpg" % origin_specail_part)

    # step 4: 打印查看结果是否正确
    i = -1
    for item in origin_url_list:
        # 更新索引
        print(origin_title_list[i]) 
        print(id_list)
        print(item)
        print()

       El resultado se muestra a continuación:

 

3. Rastrear imágenes originales en lotes

       Después de los pasos anteriores, puede obtener información como la URL, el título y la identificación de la imagen involucrados en el parámetro de referencia de la imagen, y luego iniciar una solicitud de acceso basada en esta información y luego guardar la imagen localmente. En este punto, el rastreo por lotes de imágenes es exitoso.

      el código se muestra a continuación:

import requests
import pprint
import json
import re

if __name__ == "__main__":
    # step 1: 指定url
    json_url = 'https://www.pixiv.net/ajax/user/10797546/illusts?ids%5B%5D=84243244&ids%5B%5D=84089827&ids%5B%5D=83931617&ids%5B%5D=83817260&ids%5B%5D=83774711&ids%5B%5D=83630300&ids%5B%5D=83447790&ids%5B%5D=83294064&ids%5B%5D=83293792&ids%5B%5D=82883638&ids%5B%5D=82210044&ids%5B%5D=81883995&ids%5B%5D=81415445&ids%5B%5D=80789668&ids%5B%5D=79598338&ids%5B%5D=79218284&ids%5B%5D=78917052&ids%5B%5D=78768898&ids%5B%5D=78711808&lang=zh'
    json_url_headers = {
        'accept':'application/json',
        'accept-encoding':'gzip, deflate, br',
        'accept-language':'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7',
        'cookie':'你的cookie',
        'referer': 'https://www.pixiv.net/artworks/84460298',
        'sec-fetch-dest':'empty',
        'sec-fetch-mode':'cors',
        'sec-fetch-site':'same-origin',
        'user-agent':'你的user-agent',
        'x-user-id':'你的user-id',
    }
    # step 2:发起请求
    json_res_data = requests.get(json_url, headers = json_url_headers)

    # step 3: 解析json数据
    res_json = json_res_data.json()
    res_json_body = res_json['body']                        # 获取json中的body内容
    id_list = list(res_json_body)                           # 获取body中的所有的key,即图片id
    origin_url_list = []                                    # 保存所有的原图地址
    origin_title_list = []

    # step 4: 构造原图地址
    for item in id_list:
        # 获取title
        origin_title_list.append(res_json_body[item]['title'])
        # 通过获取缩略图地址构造原图地址
        thumbnail_url = res_json_body[item]['url']          
        origin_specail_part = re.findall('img/(.*?)_p0',thumbnail_url)[0]
        origin_url_list.append("https://i.pximg.net/img-original/img/%s_p0.jpg" % origin_specail_part)

    # step 4: 遍历origin_url_list爬取图片
    i = -1
    for item in origin_url_list:
        # 更新id列表索引
        i = i+1

        # 获取地址
        origin_url = item
        # 设置headers
        origin_url_headers = {
            'referer': 'https://www.pixiv.net/artworks/%s' % str(id_list[i]),
            'user-agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.125 Safari/537.36'
        }
        # 发起请求
        img_res = requests.get(origin_url, headers=origin_url_headers)
        img_res_data = img_res.content
        img_res_code = img_res.status_code

        if img_res_code == 200:                 # 如果请求成功
            # 存储图片
            img_save_name = str(origin_title_list[i])+".png"
            with open("./img/"+img_save_name, 'wb') as fp:
                fp.write(img_res_data)
                msg = img_save_name+"保存成功!"
                print(msg)
        else:                                   # 否则输出状态码
            msg = "下载失败!状态码为:"+ img_res_code
            print(msg)      

       El resultado guardado es como se muestra a continuación:

 

Escrito al final:

1. La imagen que se rastrea en este artículo se completó bajo la guía del bloguero durante tanto tiempo , y en referencia al rastreo de la estación P de su blog , la imagen original png se rastreó por lotes durante el proceso de análisis .

2. Si a los lectores les resulta útil, puede iluminar el dedo meñique de abajo, porque el blogger estará muy feliz de que le guste.

 

Supongo que te gusta

Origin blog.csdn.net/VinWqx/article/details/108752290
Recomendado
Clasificación