• Stage6--Python简单爬虫


    正则表达式简单介绍

    正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将匹配的子串做替换或者从某个串中取出符合某个条件的子串等。

    字符 [a-z]
    数字 [0-9] 或 

    * 匹配前面的子表达式零次或多次
    + 匹配前面的子表达式一次或多次
    ? 匹配前面的子表达式零次或一次

    一个简单爬虫例子

    import re
    import urllib.request
    
    url = "http://mall.csdn.net/coin"
    
    savePath = "G:/QQData/"
    
    def getHtml(url):
        page = urllib.request.urlopen(url)
        html = page.read().decode('utf-8')
        return html
    
    def getImg(html):
        reg = r'http://img.bss.csdn.net/[0-9]+.jpg'
        imgre = re.compile(reg)
        imglist = re.findall(imgre, html)
        return imglist;
    
    def saveImg(url):
        conn = urllib.request.urlopen(url)
        file = open(savePath + getFileName(url), 'wb')
        file.write(conn.read())
        file.close()
        return
    
    def getFileName(url):
        reg = r'[a-z0-9]+.jpg'
        matchObj = re.search(reg, url)
        if matchObj:
            return matchObj.group()
        return
    
    html = str(getHtml(url));
    imgurls = getImg(html);
    
    for imgurl in imgurls:
        print(imgurl)
        saveImg(imgurl)    
    

    这个例子很简单,里面的正则简单的到没有,是爬取CSDN U币商城的图片,很容易看懂。

    可以自定义正则和Url的爬虫

    from tkinter import *
    import re
    import urllib.request
    
    
    
    savePath = "G:/QQData/"
    
    class ControllPanel(Frame):
    
        default_url = "http://www.xingyongshe.com/man/ddfeijibei"
        default_regix = r'<img src="(.+)&amp;w=228&amp;q=90&amp;type=jpg'
        __status_label = None  #私有属性
        url_input = None
        regix_input = None
    
        def __init__(self, master):
            Frame.__init__(self, master, width=360, height=260)
            self.master = master
            self.pack()
            self.add_urlarea()
            self.add_regixarea()
            self.add_buttonarea()
            self.add_statusbar()
    
    
        def add_urlarea(self):
            urlAreaFrame = Frame(self)
            urlAreaFrame.pack(pady=20)
            label = Label(urlAreaFrame, text="网址:")
            label.pack(side=LEFT)
            self.url_input = Entry(urlAreaFrame, width=40)
            self.url_input.insert(0, ControllPanel.default_url)
            self.url_input.pack(side=RIGHT)
    
    
        def add_regixarea(self):
            regixAreaFrame = Frame(self)
            regixAreaFrame.pack()
            label = Label(regixAreaFrame, text="正则:")
            label.pack(side=LEFT)
            self.regix_input = Entry(regixAreaFrame, width=40)
            self.regix_input.insert(0, self.default_regix)     #注意这里的访问方式和上面方式不同
            self.regix_input.pack(side=RIGHT)
    
    
        def add_buttonarea(self):
            buttonAreaFrame = Frame(self)
            buttonAreaFrame.pack(pady=40)
            verify_button = Button(buttonAreaFrame, text="验证正则", command=self.verifyRegix) 
            verify_button.pack(padx=50, side=LEFT)
            start_button = Button(buttonAreaFrame, text="开始爬取", command=self.startRun)
            start_button.pack(padx=50, side=RIGHT)
    
        def verifyRegix(self):
            if self.url_input == None or self.regix_input == None:
                return
            url = self.url_input.get()
            regix = self.regix_input.get()
            runfunction = RunFunction(url, regix)
            imgurls = runfunction.verifyRegix()
            if len(imgurls) > 0:
                self.setStatus("有%d张图片可以爬取", len(imgurls))
            for imgurl in imgurls:
                print(imgurl)
            return imgurls
    
        def startRun(self):
            imgurls = self.verifyRegix()
            runfunction = RunFunction(None, None)
            size = runfunction.runTask(imgurls)
            self.setStatus("爬取了%d张图片放在了" + savePath, size)
    
        def add_statusbar(self):
            statusBarFrame = Frame(self.master)
            statusBarFrame.pack(side=BOTTOM, fill=X)
            self.status_label = Label(statusBarFrame, bd=1, relief=SUNKEN, anchor=W)
            self.status_label.pack(fill=X)
    
        def setStatus(self, format, *args):
            if self.status_label == None:
                return
            self.status_label.config(text=format % args)
            self.status_label.update_idletasks()
            return
    
        def clearStatus(self):
            self.status_label.config(text="")
            self.status_label.update_idletasks()
    
    
    
    
    class RunFunction:
    
        def __init__(self, url, regix):
            self.url = url
            self.regix = regix
    
        def getHtml(self, url):
            page = urllib.request.urlopen(url)
            html = page.read().decode('utf-8')
            return html
    
        def getImg(self, html, reg):
            imgre = re.compile(reg)
            imglist = re.findall(imgre, html)
            return imglist;
    
        def saveImg(self, url):
            conn = urllib.request.urlopen(url)
            file = open(savePath + self.getFileName(url), 'wb')
            file.write(conn.read())
            file.close()
            return
    
        def getFileName(self, url):
            reg = r'[a-z0-9]+.jpg'
            matchObj = re.search(reg, url)
            if matchObj:
                return matchObj.group()
            return
    
        def verifyRegix(self):
            html = str(self.getHtml(self.url))
            imgurls = self.getImg(html, self.regix)
            return imgurls
    
        def runTask(self):
            imgurls = self.verifyRegix(self.url, self.regix)
            for imgurl in imgurls:
                self.saveImg(imgurl)
            return len(imgurls)
    
        def runTask(self, imgurls):
            for imgurl in imgurls:
                self.saveImg(imgurl)
            return len(imgurls)
    
    
    
    root = Tk()
    root.title("爬虫管理窗口")
    
    #让窗口居中显示
    scnWidth, scnHeight = root.maxsize()
    tmpcnf = '%dx%d+%d+%d'%(308, 101, (scnWidth-308)/2, (scnHeight-101)/2)
    root.geometry(tmpcnf)
    
    root.maxsize(600, 300)
    root.minsize(360, 220)
    #root.resizable(False, False) #让窗口尺寸不变
    
    controllPanel = ControllPanel(root)
    controllPanel.setStatus("等待爬取……")
    
    
    root.mainloop()
    root.destroy()
    

    这里写图片描述

  • 相关阅读:
    Sqlserver的Transaction做Rollback的时候要小心(转载)
    注意Sqlserver中使用with(nolock)后实际上还是会加架构锁,只是不对要查询的数据加S锁而已(转载)
    为什么Sql Server的查询有时候第一次执行很慢,第二次,第三次执行就变快了
    Sql Server 中如果使用TransactionScope开启一个分布式事务,使用该事务两个并发的连接会互相死锁吗
    Css中路径data:image/png;base64的用法详解 (转载)
    android获取mp4视频文件总时长和视频宽高<转>
    “Avoid non-default constructors in fragments: use a default constructor plus Fragment#setArguments(Bundle)instead”
    android 除法运算保留小数点
    Directshow 采集音视频数据H264+AAC+rtmp效果还不错
    VS2010中将CString转换为const char*
  • 原文地址:https://www.cnblogs.com/lanzhi/p/6468422.html
Copyright © 2020-2023  润新知