python入门 实例之爬取图片

@从爬取图片 开始讲起

python入门实例之爬取图片

程序结构总览

python入门 实例之爬取图片_第1张图片
从上图可以大致看出,为了让操作更加方面,我用pyqt5做了一个界面(关于python gui工具的选型后面介绍),代码方面的话,其实主要就是爬取图片的代码和界面实现的代码,整体来说很简单,但是因为入门实例,一开始还是踩了不少坑的,这篇文章主要内容其实就是记录新手入门时一些需要注意的点
python入门 实例之爬取图片_第2张图片
search.py里的主代码,相当于c/c++的main 程序入口,主要操作就是实例化主窗口,绑定相关响应函数(按钮和菜单项)

if __name__ == '__main__':  # 1
    app = QApplication(sys.argv)  # 2
    main_window = QMainWindow()  # 3
    ui = search_main_window.Ui_MainWindow()  # 4创建窗口
    ui.setupUi(main_window)  # 将生成的mainwindow去初始化窗口数据
    main_window.show() # 调用显示函数
    ui.start.clicked.connect(partial(click_button_start, ui))  # 绑定开启线程函数
    ui.action_Preferences.triggered.connect(partial(openDialog, ui))  #绑定一个菜单项来打开对话框
    sys.exit(app.exec_()) # 开始循环

ui.start.clicked.connect(partial(click_button_start, ui))
ui.action_Preferences.triggered.connect(partial(openDialog, ui))
这两行可以简单讲一下,ui是窗口资源名称,start是里面的一个按钮(也就是最上面图中的“开始下载”),按钮的可以通过调用connect函数来绑定响应函数,不要参数的话直接 .connect(响应函数名称) 就行了,要传参数的话就 用partial 如上。 而action_Preferences是一个菜单
项,它是没有connect函数的,所以绑定方法为 .triggered.connect() ,具体原因的话可以从下面的初始化函数可以看出
self.start = QtWidgets.QPushButton(self.centralwidget)
self.action_saveDir = QtWidgets.QAction(MainWindow)
它们是继承自不同的父类,详细原因请自查

爬取图片代码

从最基本的说起,网页请求用的是requests模块,

def geturlDeatil(url):
   try:
       headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)''Chrome/51.0.2704.63 Safari/537.36'}
       r = requests.get(url, timeout=30, headers=headers, verify=False)
       r.raise_for_status()  # 如果状态不是200,引发异常
       r.encoding = 'utf-8'  # 无论原来用什么编码,都改成utf-8
       return r.text
   except Exception as e:
       return "访问网站异常"

这里要注意的是requests.get()这个函数要记得加上headers,主要是用来模拟浏览器访问,很多网站现在都做了反爬虫设置,不加的话,不加header的话,基本上是访问不了的,另外有些网站会做反盗链设计,需要额外增加信息,具体做法是:增加(‘Referer’, str1)字段,如下

def getPicture(listUrl, savePath):
    countDown = 0
    countDele = 0
    # 获取当前图片网址
    str1 = listUrl[0]
    str2 = str1.rsplit('/', 1) 
    str1 = str2[0]
    opener = urllib.request.build_opener()  # 
    opener.addheaders = [('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.75 Safari/537.36'),  ('Referer', str1)]
    urllib.request.install_opener(opener)
    for i in range(len(listUrl)):
        try:
            path = savePath + str(i) + ".jpg"
            urllib.request.urlretrieve(listUrl[i], path)
            fp = open(path, 'rb')
            im = Image.open(fp)
            fp.close()
            x, y = im.size
            if x < 1920 or y < 1080:
                os.remove(path)
                countDele += 1
            else:
                countDown += 1
        except Exception:
            continue
    return "下载图片成功", countDown, countDele

界面实现代码

本来是不打算做界面的,后来一想,反正都是初学python,就当时练习一下了,因为之前有用qt写过c++,所以在网上看到qt有支撑python的库,名为pyqt5,所以就直接拿来用了,具体的话需要安装pyqt5的库,和pyqt5designer ,需要的可以去网上找教程安装
python入门 实例之爬取图片_第3张图片
我这里一共做了两个界面,一个主界面search_main_window.py,一个对话框界面preferences.py ,都是通过qt designer 生成的ui文件转换过来的,转换的命令是
pyqt5 ui文件生成py命令
pyuic5 -o name.py name.ui

总结

爬取图片这个实例算是很多人入门python的必经之路了,网上的例子也是非常的多,技术方面我就不再说了,关于网址选择方面有一些建议
常用网址有:

这次算是检验python学习效果的一次练习,学了python之后确实印证了那句老话:“人生苦短,我用python” ,用来写一些小工具确实非常的方便。
代码在github上:https://github.com/Blakeyi/DownloadPic
csdn资源也有:https://download.csdn.net/download/blake321/12391015

就这么多了,今年五一哪里都没去,在家学python

你可能感兴趣的:(python)