【爬虫】3.5 实践项目——爬取网站的图像文件

这篇具有很好参考价值的文章主要介绍了【爬虫】3.5 实践项目——爬取网站的图像文件。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 项目简介                

        指定一个网站(例如中国天气网站),可以爬取这个网站中的所有图像文件,同时把这些文件保存到程序所在文件夹的images子文件夹中。 首先设计了一个单线程的爬取程序,这个程序会因网站的某个图像下载过程缓慢而效率低下,为了提高爬取的效率,另外设计了一个多线程的爬取程序。在多线程程序中,如果一个图像下载缓慢,那么也就是爬取它的那个线程缓慢,不影响别的线程的爬取过程

2. 单线程爬取图像的程序

singleThread.py如下:
# 单线程爬取图像的程序
from bs4 import BeautifulSoup
from bs4.dammit import UnicodeDammit  # BS内置库,用于推测文档编码
import urllib.request  # 发起请求,获取响应
import urllib.parse
import os


def imageSpider(start_url):
    try:
        urls = []
        req = urllib.request.Request(start_url, headers=headers)
        data = urllib.request.urlopen(req)
        data = data.read()
        dammit = UnicodeDammit(data, ["utf-8", "gbk"])
        data = dammit.unicode_markup  # 解码
        soup = BeautifulSoup(data, "lxml")
        images = soup.select("img")
        for image in images:
            try:
                src = image["src"]
                url = urllib.parse.urljoin(start_url, src)  # 拼接成一个URL。
                if url not in urls:
                    urls.append(url)
                    print(url)
                    download(url)
            except Exception as err:
                print(err)
    except Exception as err:
        print(err)


def download(url):
    global count
    try:
        count = count + 1
        if url[len(url) - 4] == ".":  # 提取文件后缀扩展名
            ext = url[len(url) - 4:]
        else:
            ext = ""
        req = urllib.request.Request(url, headers=headers)
        data = urllib.request.urlopen(req, timeout=100)
        data = data.read()
        if not os.path.exists("images"):  # 如果images目录不存在
            os.mkdir("images")  # 创建该目录                      
        fobj = open("images\\" + str(count) + ext, "wb")
        fobj.write(data)
        fobj.close()
        print("downloaded " + str(count) + ext)
    except Exception as err:
        print(err)


start_url = "http://www.weather.com.cn/weather/101280601.shtml"
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
                         "Chrome/114.0.0.0 Safari/537.36"}

count = 0
imageSpider(start_url)

        在这个单线程的爬取程序中是逐个取下载图像文件的,如果一个文件 没有完成下载,后面一个下载任务就必须等待。如果一个文件没有完成下载或者下载出现问题,就直接会影响下一个文件的下载,因此效率低,可靠性低

3. 多线程爬取图像的程序

multiThread.py如下:
# 多线程爬取图像的程序
from bs4 import BeautifulSoup
from bs4.dammit import UnicodeDammit
import urllib.request
import urllib.parse
import threading
import os


def imageSpider(start_url):
    global threads
    global count
    try:
        urls = []
        req = urllib.request.Request(start_url, headers=headers)
        data = urllib.request.urlopen(req)
        data = data.read()
        dammit = UnicodeDammit(data, ["utf-8", "gbk"])
        data = dammit.unicode_markup
        soup = BeautifulSoup(data, "lxml")
        images = soup.select("img")
        for image in images:
            try:
                src = image["src"]
                url = urllib.parse.urljoin(start_url, src)
                if url not in urls:
                    urls.append(url)
                    print(url)
                    count = count + 1
                    T = threading.Thread(target=download, args=(url, count))
                    T.setDaemon(False)
                    T.start()
                    threads.append(T)
            except Exception as err:
                print(err)
    except Exception as err:
        print(err)


def download(url, count):
    try:
        if url[len(url) - 4] == ".":  # 提取文件后缀扩展名
            ext = url[len(url) - 4:]  # .jpg  or .png
        else:
            ext = ""
        req = urllib.request.Request(url, headers=headers)
        data = urllib.request.urlopen(req, timeout=100)
        data = data.read()
        if not os.path.exists("images"):  # 如果images目录不存在
            os.mkdir("images")  # 创建该目录
        fobj = open("images\\" + str(count) + ext, "wb")
        fobj.write(data)
        fobj.close()
        print("downloaded " + str(count) + ext)
    except Exception as err:
        print(err)


start_url = "http://www.weather.com.cn/weather/101280601.shtml"
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
                         "Chrome/114.0.0.0 Safari/537.36"}

count = 0
threads = []
imageSpider(start_url)
for t in threads:
    t.join()
print("The End")

        在这个多线程的爬取程序中,下载一个图像文件的过程是一个线程,因此,可以有多个文件在同时下载,而且互不干扰,如果一个文件没有完成下载或者下载出现问题,也不会影响别的文件的下载,因此效率高,可靠性高


恭喜你成功突破第三章!每一次努力都是进步的证明,继续坚持下去!

下一篇文章:4.1 Scrapy 框架爬虫简介 
实战源码:Python网络爬虫实战文章来源地址https://www.toymoban.com/news/detail-471711.html

到了这里,关于【爬虫】3.5 实践项目——爬取网站的图像文件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • Python爬虫入门:使用selenium库,webdriver库模拟浏览器爬虫,模拟用户爬虫,爬取网站内文章数据,循环爬取网站全部数据。

    Python爬虫入门:使用selenium库,webdriver库模拟浏览器爬虫,模拟用户爬虫,爬取网站内文章数据,循环爬取网站全部数据。

    *严正声明:本文仅限于技术讨论与分享,严禁用于非法途径。 目录 准备工具: 思路: 具体操作: 调用需要的库: 启动浏览器驱动: 代码主体:  完整代码(解析注释): Python环境; 安装selenium库; Python编辑器; 待爬取的网站; 安装好的浏览器; 与浏览器版本相对应的

    2023年04月24日
    浏览(49)
  • 爬虫源码---爬取小猫猫交易网站

    爬虫源码---爬取小猫猫交易网站

    前言: 本片文章主要对爬虫爬取网页数据来进行一个简单的解答,对与其中的数据来进行一个爬取。 Python版本:3.7.3 IDE:PyCharm 所需库:requests ,parsel  我们需要获取以下数据: \\\'地区\\\', \\\'店名\\\', \\\'标题\\\', \\\'价格\\\', \\\'浏览次数\\\', \\\'卖家承诺\\\', \\\'在售只数\\\', \\\'年龄\\\', \\\'品种\\\', \\\'预防\\\', 

    2024年02月10日
    浏览(11)
  • 【爬虫】3.4 爬取网站复杂数据

    【爬虫】3.4 爬取网站复杂数据

    进一步把前面的Web网站的mysql.html, python.html, java.html丰富其中 的内容,并加上图形: mysql.html java.html python.html 服务器 server.py 程序还是前面3.2的,如下:         爬取网站中的mysql, python, java的简介与图像。我们看到简介在网页的第一个div中,图像在img中,而且只有这3个网

    2024年02月08日
    浏览(8)
  • 【爬虫系列】Python爬虫实战--招聘网站的职位信息爬取

    【爬虫系列】Python爬虫实战--招聘网站的职位信息爬取

    1. 需求分析 从网上找工作,大家一般都会通过各种招聘网站去检索相关信息,今天利用爬虫采集招聘网站的职位信息,比如岗位名称,岗位要求,薪资,公司名称,公司规模,公司位置,福利待遇等最为关心的内容。在采集和解析完成后,使用 Excel 或 csv 文件保存。 2. 目标

    2024年02月02日
    浏览(15)
  • selenium爬虫框架爬取某壁纸网站

    selenium爬虫框架爬取某壁纸网站

    基础知识 环境配置 开始爬虫 简单分析目标网站 写函数 获取浏览器对象: 下载每一张图片: 获取每一页的源代码: 运行print_result_every_page python基础语法 面向对象基础 html基础 xpath基础 selenium框架的基本使用 request库 lxml库      3.安装浏览器xpath插件         打开谷歌浏览

    2024年02月05日
    浏览(9)
  • 《python爬虫练习2》爬取网站表情包

    运行环境: 1.分析: 目标网址:https://www.runoob.com/ 首先想要获取什么就从哪里入手,打开图所在的网页,F12查看代码的内容,此处抓取的是资源文件,爬取中发现ajax类型的文件加载出来的无法知道图片的源地址所以暂时不能用这种方式获取。因此可以生成第一步的代码。

    2024年02月01日
    浏览(13)
  • Python爬虫:如何使用Python爬取网站数据

    更新:2023-08-13 15:30 想要获取网站的数据?使用Python爬虫是一个绝佳的选择。Python爬虫是通过自动化程序来提取互联网上的信息。本文章将会详细介绍Python爬虫的相关技术。 在使用Python爬虫之前,我们需要理解网络协议和请求。HTTP是网络传输的重要协议,它是在Web浏览器和

    2024年02月13日
    浏览(15)
  • 黑丝,白丝,全都要。某站的视频爬取加合成

    还是很久之前写的爬虫,爬取某站的视频,因为某站的视频和音频是分开的,所以最后还需要合成在一起。 某站的舞蹈区大家都知道有很多的黑丝、白丝。嗯。。。都懂的,所以,下载下来被窝里偷偷看。 详细解释都在注释区 大家爬取的时候要注意延时一段时间,某站的访

    2024年02月12日
    浏览(11)
  • 使用PyCharm编写Scrapy爬虫程序,爬取古诗词网站

    使用PyCharm编写Scrapy爬虫程序,爬取古诗词网站

    本次测试案例参考厦门大学数据库实验室 链接: https://dblab.xmu.edu.cn/blog/3937/ 在PyCharm中新建一个名称为“scrapyProject”的工程,如下图所示,Python解释器就选择我们之前已经安装好的 本次测试环境为 Python3.7.6 在“scrapyProject”工程底部打开Terminal窗口(如下图所示),在命令提示

    2024年02月11日
    浏览(12)
  • Python爬虫:实现爬取、下载网站数据的几种方法

    使用脚本进行下载的需求很常见,可以是常规文件、web页面、Amazon S3和其他资源。Python 提供了很多模块从 web 下载文件。下面介绍 requests 模块是模仿网页请求的形式从一个URL下载文件 示例代码: 安装 wget 库 示例代码 有些 URL 会被重定向到另一个 URL,后者是真正的下载链接

    2024年02月05日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包