使用python实现简单网页图片抓取

使用python程序实现简单的网页图片抓取

终极目标:使用python中的urllib、gevent、re模块完成从一个网页源码到抓取整个网页图片的功能。

第一步:获取网页源码

1、使用Google浏览器打开需要抓取图片的网页,在空白处点击右键查看网页源代码

2、CTRL+a 全选  CTRL+c复制整个网页源码

3、新建文件(img.html) 保存网页源码

第二步:使用正则表达式处理网页源码
import re
def get_img_link():
    """使用正则表达式处理网页源码"""
    # 打开保存网页源码的文件
    f = open("img.html", "rb")
    # 读取文件里的内容
    file_content = f.read()
    # 关闭文件
    f.close()
    # 使用正则表达式筛选链接
    img_link_list = re.findall(r"https://.*?.jpg", file_content.decode("utf-8"))
    return img_link_list

第三步:访问链接并下载图片

import urllib.request
import os
def download_img(img_link):
    # 访问链接
    link_file = urrlib.request.urlopen(img_link)
    # 读取链接图片信息
    link_img_content = link_file.read()
    # 创建文件夹保存download文件
    download_folder = os.mkdir("download")
    # 以读的方式打开一个文件
    with open(download + "/" + "[复制]图片.jpg", "wb")
        f.write(link_img_content)

第四步:由于下载的过程会出现网络延迟,所以可使用多线程实现多任务提高下载效率

import gevent
from gevent import monkey
gevent.monkey.patch_all()  # gevent 补丁包
def main():
    link_lists = get_link()
    # 多任务download
    i = 0
    link_lists_length = len(link_lists)
    while i < link_lists_length:
        j = i + 1
        k = i + 2
        gevent.joinall([gevent.spawn(download, link_lists[i], i + 1, link_lists_length),
                        gevent.spawn(download, link_lists[j], j + 1, link_lists_length),
                        gevent.spawn(download, link_lists[k], k + 1, link_lists_length)])
        i += 3
    print("下载已完成!")

if __name__ == '__main__':
    main()

代码

import re
import urllib.request
import gevent
from gevent import monkey
import os


num = 0


def get_link():

    # 打开保存从网上得到的网页源码
    f = open("link_resource.txt", "rb")
    # 读取里面的内容
    file_content = f.read()
    # 关闭文件
    f.close()
    # 使用正则表达式筛选正确的链接
    link_lists = re.findall(r"https://.*?.jpg", file_content.decode("utf-8"))
    return link_lists


def download(link_list, i, link_list_length):

    global num
    # 访问链接
    link_file = urllib.request.urlopen(link_list)
    # 读取内容
    file_content = link_file.read()
    try:
        # 建文件夹 文件保存内容
        os.mkdir("download")
    except:
        pass
    folder = "download"
    with open(folder + "/" "图片%d.jpg" % i, "wb") as f:
        f.write(file_content)
    num += 1
    # print("\r总共:%d已经下载:%d张照片,下载进度%.2f%%,%.2f%%" % (link_list_length, i, i / link_list_length * 100, num / link_list_length * 100), end="")

    print("\r总共:%d已经下载:%d张照片,下载进度%.2f%%" % (link_list_length, num, num / link_list_length * 100), end="")


def main():

    gevent.monkey.patch_all()
    # 过去网上链接资源 get_link
    link_lists = get_link()
    # 多任务download
    i = 0
    link_lists_length = len(link_lists)
    while i < link_lists_length:
        j = i + 1
        k = i + 2
        gevent.joinall([gevent.spawn(download, link_lists[i], i + 1, link_lists_length),
                        gevent.spawn(download, link_lists[j], j + 1, link_lists_length),
                        gevent.spawn(download, link_lists[k], k + 1, link_lists_length)])
        i += 3
    print("下载已完成!")

if __name__ == '__main__':
    main()


猜你喜欢

转载自blog.csdn.net/weixin_42369926/article/details/80859493