首页 > 其他分享 >19. [实例]抓取网络照片

19. [实例]抓取网络照片

时间:2022-09-19 17:01:16浏览次数:111  
标签:word 19 self 抓取 url 实例 https com image

1. 前言

本节编写一个快速下载照片的程序,通过百度图片下载您想要的前 60 张图片,并将其保存至相应的目录。本节实战案例是上一节《Python Request库安装和使用》图片下载案例的延伸。

2. 分析url规律

打开百度图片翻页版(点击访问),该翻页版网址要妥善保留。其 url 规律如下:

第一页:https://image.baidu.com/search/flip?tn=baiduimage&word=python&pn=0
第二页:https://image.baidu.com/search/flip?tn=baiduimage&word=python&pn=20
第三页:https://image.baidu.com/search/flip?tn=baiduimage&word=python&pn=40
第n页:https://image.baidu.com/search/flip?tn=baiduimage&word=python&pn=20*(n-1)

百度为了限制爬虫,将原来的翻页版变为了“瀑布流”浏览形式,也就是通过滚动滑轮自动加载图片,此种方式在一定程度上限制了爬虫程序。

3. 写正则表达式

通过上一节可以得知每一张图片有一个源地址如下所示:

data-imgurl="图片源地址"

复制图片源地址,并检查网页源代码,使用 Ctrl+F 搜索该地址,如下图所示:

request模块使用

图1:检查网页结构(点击看高清图


使用上述方式依次检查几张图片,您会发现每张图片源地址,有如下三种匹配结果:

"thumbURL":"https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=38785274,1357847304&fm=26&gp=0.jpg"
"middleURL":"https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=38785274,1357847304&fm=26&gp=0.jpg"
"hoverURL":"https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=38785274,1357847304&fm=26&gp=0.jpg"

任选其一,写出图片源地址正则表达式,如下所示:

re_bds='"hoverURL":"(.*?)"'

4. 编写程序代码

下面使用 Requests 库的相应方法和属性编写程序代码,最终实现一个快速下载照片的小程序。

# -*- coding:utf8 -*-
import requests
import re
from urllib import parse
import os
class BaiduImageSpider(object):
    def __init__(self):
        self.url = 'https://image.baidu.com/search/flip?tn=baiduimage&word={}'
        self.headers = {'User-Agent':'Mozilla/4.0'}
    # 获取图片
    def get_image(self,url,word):
        #使用 requests模块得到响应对象
        res= requests.get(url,headers=self.headers)
        # 更改编码格式
        res.encoding="utf-8"
        # 得到html网页
        html=res.text
        print(html)
        #正则解析
        pattern = re.compile('"hoverURL":"(.*?)"',re.S)
        img_link_list = pattern.findall(html)
        #存储图片的url链接 
        print(img_link_list)
        # 创建目录,用于保存图片
        directory = 'C:/Users/Administrator/Desktop/image/{}/'.format(word)
        # 如果目录不存在则创建,此方法常用
        if not os.path.exists(directory):
            os.makedirs(directory)
        
        #添加计数 
        i = 1
        for img_link in img_link_list:
            filename = '{}{}_{}.jpg'.format(directory, word, i)
            self.save_image(img_link,filename)
            i += 1
    #下载图片
    def save_image(self,img_link,filename):
        html = requests.get(url=img_link,headers=self.headers).content
        with open(filename,'wb') as f:
            f.write(html)
        print(filename,'下载成功')
    # 入口函数 
    def run(self):
        word = input("您想要谁的照片?")
        word_parse = parse.quote(word)
        url = self.url.format(word_parse)
        self.get_image(url,word)
if __name__ == '__main__':
    spider = BaiduImageSpider()
    spider.run()

程序执行结果如下图:

程序执行结果
图2:程序执行图


目录文件下载图如下所示:

python爬虫实战
图3:程序执行结果

标签:word,19,self,抓取,url,实例,https,com,image
From: https://www.cnblogs.com/jiajunling/p/16708273.html

相关文章

  • 在CentOS上编译最新版linux内核(linux-5.19.9)
    从官网下载最新版的Linux内核源码,本教程使用linux-5.19.9进行编译。实验环境(CentOS-Stream-8)$uname-aLinuxlocalhost.localdomain4.18.0-338.el8.x86_64#1SMPFri......
  • vue3中vuex使用实例
    通过脚手架创建项目会自动创建store/index.js1.vuex基本结构import{createStore}from'vuex'exportdefaultcreateStore({//全局的状态初始值state:{},......
  • 2022.9.19周学习总结
    一.本周学习进度1.本周打了一场ICPC2.打了一场cf3.补了一场atcoder4.做了一些思维题+状压题二.下周学习计划1.完成网络流的掌握2.刷10到概......
  • 20220919
    计算机网络网络网络(Network)由若干结点(Node)和连接这些结点的链路(Link)组成。internet与Internet的区别internet(互联网)是一个通用名词,泛指有多个计算机网络互联而......
  • 实例-rust-延迟5秒锁屏
    main.rs#![windows_subsystem="windows"]usestd::process::Command;usestd::os::windows::process::CommandExt;usestd::thread::sleep;usestd::time::Duration......
  • ckeditor粘贴word文档图片的实例解析.
    ​ 在之前在工作中遇到在富文本编辑器中粘贴图片不能展示的问题,于是各种网上扒拉,终于找到解决方案,在这里感谢一下知乎中众大神以及TheViper。通过知乎提供的思路找到粘......
  • 互联网摸鱼日报(2022-09-19)
    互联网摸鱼日报(2022-09-19)InfoQ热门话题Forrester发布最新中国企业区块链平台报告,蚂蚁链唯一入选领导者象限将MVP和MVA应用于遗留应用程序开源中国资讯深度......
  • 0-4 测试面试题_16合并两个排序数组_17tcp和udp_18单元集成系统验收回归_19测试和开发
    面试题(除个别外)及部分解析答案来自牛客网https://www.nowcoder.com/exam/interview/以下所述内容并不是百分之百正确,仅供参考。16手写代码:合并两个排序数组Merge1......
  • 实例-rust-打开系统信息
    main.rs#![windows_subsystem="windows"]usestd::process::Command;usestd::os::windows::process::CommandExt;fnmain(){letoutput=ifcfg!(target_o......
  • 实例-rust-锁屏
    main.rs#![windows_subsystem="windows"]usestd::process::Command;usestd::os::windows::process::CommandExt;fnmain(){letoutput=ifcfg!(target_o......