Imagen de reptil-Baidu arrastrándose

Rastreadores generales y rastreadores enfocados
Según los escenarios de uso, los rastreadores web se pueden dividir en rastreadores generales y rastreadores enfocados.

Rastreador web general: es una parte importante del sistema de rastreo de motores de búsqueda (Baidu, Google, Yahoo, etc.). Es para recopilar páginas web y recopilar información de Internet. Esta información de la página web se utiliza para indexar los motores de búsqueda para proporcionar soporte. Determina Si el contenido de todo el sistema del motor es rico y si la información es instantánea, por lo que su rendimiento afecta directamente la efectividad del motor de búsqueda. El propósito principal es descargar páginas web en Internet al área local para formar una copia de respaldo reflejada del contenido de Internet.

Inserte la descripción de la imagen aquí

Rastreador enfocado: es un programa de rastreo web que está orientado a las necesidades de temas específicos. La diferencia entre este y el rastreador general del motor de búsqueda es que el rastreador enfocado procesará y filtrará el contenido al implementar el rastreo web. Trate de asegurarse de que solo el rastreo esté relacionado con los requisitos. Información de la página. Eso es un reptil en un sentido general.
El
análisis de las necesidades de rastreo de imágenes de Baidu debe realizarse, al menos, dos funciones: una es buscar imágenes y la otra es descargar y
analizar automáticamente la página web http://image.baidu.com/search/index?tn=baiduimage&word=cat (nota: se puede eliminar Parámetros no utilizados, no afecta la carga de la página), el código fuente, coopera con F12 para
escribir expresiones regulares u otro código de analizador,
almacena datos en el local,
escribe formalmente el
análisis de la página del código del rastreador de Python es muy importante, diferentes necesidades corresponden a diferentes URL, diferentes URL El código fuente es obviamente diferente, por lo que dominar cómo analizar la página es el primer paso para un rastreador exitoso. El análisis del código fuente de esta página se muestra a continuación:

Inserte la descripción de la imagen aquí

import os
import re

import requests
from colorama import Fore


def download_image(url, keyword):
    """
    下载图片
    :param url: 百度图片的网址
    :return: Bool
    """
    #  1. 向服务器发起HTTP请求
    response = requests.get(url)
    #  2. 获取服务器端的响应信息
    #  响应信息: status_code, text, url
    data = response.text  # 获取页面源码
    #  3. 编写正则表达式,获取图片的网址
    # data = ...[{"ObjURL":"http:\/\/images.freeimages.com\/images\/large-previews\/3bc\/calico-cat-outside-1561133.jpg",....}]...
    # 需要获取到的是: http:\/\/images.freeimages.com\/images\/large-previews\/3bc\/calico-cat-outside-1561133.jpg
    # 正则的语法: .代表除了\n之外的任意字符, *代表前一个字符出现0次或者无数次. ?代表非贪婪模式
    pattern = r'"objURL":"(.*?)"'
    # 4. 根据正则表达式寻找符合条件的图片网址.
    image_urls = re.findall(pattern, data)
    # 5. 根据图片网址下载猫的图片到本地
    index = 1
    for image_url in image_urls:
        print(image_url)  # 'xxxx.jpg   xxxx.png'
        # response.text 返回 unicode 的文本信息, response.text 返回 bytes 类型的信息
        try:
            response = requests.get(image_url)  # 向每一个图片的url发起HTTP请求
        except Exception as e:
            print(Fore.RED + "[-] 下载失败: %s" % (image_url))
        else:
            old_image_filename = image_url.split('/')[-1]
            if old_image_filename:
            	# 获取图片的后缀
                image_format = old_image_filename.split('.')[-1]
                # 处理 url 为...jpeg?imageview&thumbnail=550x0 结尾(传参)的情况
                if '?' in image_format:
                    image_format = image_format.split('?')[0]
            else:
                image_format = 'jpg'
                
            # 生成图片的存储目录
            keyword = keyword.split(' ', '-')
            if not os.path.exists(keyword):
                os.mkdir(keyword)
            image_filename = os.path.join(keyword, str(index) + '.' + image_format)
			# 保存图片
            with open(image_filename, 'wb') as f:
                f.write(response.content)
                print(Fore.BLUE + "[+] 保存图片%s.jpg成功" % (index))
                index += 1


if __name__ == '__main__':
    keyword = input("请输入批量下载图片的关键字: ")
    url = 'http://image.baidu.com/search/index?tn=baiduimage&word=' + keyword
    print(Fore.BLUE + '[+] 正在请求网址: %s' % (url))
    download_image(url, keyword)

Resultados de implementación:
Inserte la descripción de la imagen aquí
problemas comunes:

¿Por qué solo hay 30 imágenes, y más de 30
imágenes de Baidu de Baidu responden, y el menú desplegable continuo continuará cargando nuevas imágenes, lo que significa que la página en el navegador es el resultado del procesamiento de datos JS, que incluye el contenido del rastreador Ajax No se dará una explicación detallada aquí.
La URL de una sola imagen en la que se hace clic debajo de la página de búsqueda es incompatible con la ObjURL obtenida en el programa.
Esto puede ser el resultado del procesamiento de caché de Baidu. Cada imagen es esencialmente "externa", no Baidu, por lo que en el programa Elija iniciar una solicitud HTTP a la URL que realmente almacena la imagen.

Publicado 29 artículos originales · elogiado 0 · visitas 891

Supongo que te gusta

Origin blog.csdn.net/weixin_45734982/article/details/105700489
Recomendado
Clasificación