今天刚刚接触到了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