使用Python脚本爬取网站图片

今天刚刚接触到了python的urllib模块,尝试着用urllib模块写了一个爬取网站图片的小脚本,如果网站有反爬虫的功能,我这个脚本就没卵用了

"""根据用户输入的网址,自动下载网站的所用图片
图片保存在/root/桌面/test目录中
图片名为网站上的名称"""
from urllib import request
import re
import os
import chardet

def get_file(url,fname):
    """将url指向的网页文件保存到指定的路径下"""
    html = request.urlopen(url)
    with open(fname,'wb') as fobj:
        while True:
            data = html.read(1024)
            if not data:
                break
            fobj.write(data)

        # print(dicts)
        # return dicts['encoding']

def get_urls(fname):
    """在指定的网页文件中查找所有图片的url"""
    img_patt = '(http|https)://[\w./]+\.(jpg|png|gif|jpeg)'     #匹配图片的url
    url_list = []       #将匹配到的网址放到列表中
    cpatt = re.compile(img_patt)       #将模式编译,提升效率
    with open(fname,'rb') as fobj:      #通过chardet模块自动识别爬取下来的文件是什么字符编码
        data =fobj.read(1024)
        dicts = chardet.detect(data)
    charset1 = dicts['encoding']
    with open(fname,encoding=charset1) as fobj:     #不同网站的编码格式不一样,在打开文件的时候如果不指定编码格式,就会报错
        for line in fobj:
            m = cpatt.search(line)
            if m:
                url_list.append(m.group())
    return url_list

def get_imgs(list,url_name):
    """批量将图片url列表中的图片下载到本地"""
    dst = '/root/桌面/test/'
    url_name = url_name.split('.')[1]
    dst = os.path.join(dst,url_name)
    if not os.path.exists(dst):
        os.mkdir(dst)
    for url in list:
        fname = url.split('/')[-1]
        print(fname)
        fname = os.path.join(dst,fname)
        get_file(url,fname)

def main(fname,url):
    get_file(url,fname)
    #print(charset)
    url_list = get_urls(fname)
    get_imgs(url_list,url)

if __name__ == "__main__":
    url = input("请输入网址:")
    if not re.match('^http',url):
        url = 'http://'+url
    try:
        fname = url.split('.')[1]+'.html'
    except IndexError:
        print('The http url has some wrony!!')
    else:
        fname = os.path.join('/root/桌面/test/',fname)
        main(fname,url)

代码中有指定图片存放的位置,在/root/桌面/test目录中,如果希望存放在其他路径下,可以直接在代码中将这个字段修改为你希望的路径就可以,一共是有两个位置指定了

其中有一个模块是chardet模块,这个模块可能没有默认安装,所以需要在系统中先安装这个模块。
在这里我提供在先按照的方法,对于以后安装其他的模块也很有用。
首先在当前目录下创建一个名叫pip的隐藏目录

mkdir ~/.php

然后在创建一个配置文件

vim ~/.php/pip.conf
[global]
index-url=http://pypi.douban.com/simple/		#这里使用的是豆瓣的镜像网址,也可以更换为其他的
[install]
trusted-host=pypi.douban.com	

这样一个在先安装的模块仓库就建立好了,需要什么模块直接安装就可以了

pip3 install chardet
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值