Image de Reptile-Baidu rampant

Explorateurs généraux et explorateurs ciblés
Selon les scénarios d'utilisation, les explorateurs Web peuvent être divisés en explorateurs généraux et explorateurs ciblés.

Explorateur Web général: il s'agit d'une partie importante du système d'exploration des moteurs de recherche (Baidu, Google, Yahoo, etc.). Il s'agit de collecter des pages Web et de collecter des informations sur Internet. Ces informations de page Web sont utilisées pour indexer les moteurs de recherche afin de fournir un soutien. Il détermine Si le contenu de l'ensemble du système de moteur est riche et si les informations sont instantanées, ses performances affectent directement l'efficacité du moteur de recherche. L'objectif principal est de télécharger des pages Web sur Internet dans la zone locale pour former une sauvegarde miroir du contenu Internet.

Insérez la description de l'image ici

Robot d'indexation ciblé: il s'agit d'un programme d'indexation Web axé sur les besoins de rubriques spécifiques. La différence entre ce dernier et le moteur de recherche général est que le robot ciblé traitera et filtrera le contenu lors de la mise en œuvre de l'exploration Web. Informations sur la page. C'est un reptile au sens général.
L'
analyse d' images Baidu nécessite une analyse, au moins deux fonctions doivent être réalisées: l'une consiste à rechercher des images et l'autre à télécharger et
analyser automatiquement la page Web http://image.baidu.com/search/index?tn=baiduimage&word=cat (remarque: elle peut être supprimée Paramètres inutilisés, n'affecte pas le chargement de la page) code source, coopérer avec F12 pour
écrire des expressions régulières ou un autre code analyseur,
stocker des données dans la page de
code du robot d'indexation de l'écriture formelle locale
est très important, différents besoins correspondent à une URL différente, une URL différente Le code source est évidemment différent, donc maîtriser l'analyse de la page est la première étape d'un robot réussi. L'analyse du code source de cette page est présentée ci-dessous:

Insérez la description de l'image ici

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)

Résultats de la mise en œuvre:
Insérez la description de l'image ici
problèmes courants:

Pourquoi n'y a-t-il que 30 images, et plus de 30
images Baidu de Baidu sont réactives, et un menu déroulant continu continuera à charger de nouvelles images, ce qui signifie que la page dans le navigateur est le résultat des données de traitement JS, impliquant le contenu du robot Ajax Aucune explication détaillée ne sera donnée ici.
L'URL d'une seule image cliquée sous la page de recherche n'est pas cohérente avec l'ObjURL obtenu dans le programme.
Cela peut être le résultat du traitement du cache de Baidu. Chaque image est essentiellement "externe", pas Baidu, donc dans le programme Choisissez d'initier une requête HTTP vers l'URL qui stocke réellement l'image.

Publié 29 articles originaux · loué 0 · visites 891

Je suppose que tu aimes

Origine blog.csdn.net/weixin_45734982/article/details/105700489
conseillé
Classement