美文网首页数据蛙强化课程第一期
2019-01-07至2019-01-13,本周学习总结

2019-01-07至2019-01-13,本周学习总结

作者: bf3780a4db09 | 来源:发表于2019-01-13 11:31 被阅读40次

    这周是强化班开始的第一周,好久都没有这种疯狂学习的经历了,为了一个问题纠结一下午、一晚上,不过当问题解决的时候,觉得还是很值得的。下面总结一下本周的学习内容,主要包括两块:班级学习计划(SQL)以及自己在学习爬虫相关的知识(爬虫基本原理、requests库和正则表达式),具体如下:
    1)将数据导入到MySQL workbench中
    有两种方法
    第一种是直接在workbench界面上操作,这一块,之前写过文章记录我踩到的坑(workbench 默认不选中数据库,需要先执行use data

    image.png
    但是当数据量大的时候,这种方法很耗时间。
    第二种是用命令行导入,这一块,我也写过文章记录我踩到的坑(MySQL默认禁止本地导入文件的功能,需要修改ini文件和设置全局变量,1148这个数字大概很长一段时间不会忘记

    2)select基础查询语句
    基础查询语句格式
    select 字段名
    from table
    where 条件语句
    

    这是最基本的查询语句
    3)like与%的结合使用
    这一块,是需要用到模糊查询的时候,用like结合%进行匹配

    SELECT * FROM data.dataanalyst
    where
    secondType like "%开发%"; #(包含“开发”两个字的职位)
    SELECT * FROM data.dataanalyst
    where
    secondType like "开发%"; #(以“开发”两个字开头的职位)
    SELECT * FROM data.dataanalyst
    where
    secondType like "%开发"; #(以“开发”两个字结尾的职位)
    

    4)group by函数和having结合使用
    这一块我觉得需要注意的有两点
    第一点:group by + having 先于select执行;
    第二点:having字句只对聚合函数(count,sum,avg)有效,对列名无效,即
    having score > 80,这种表达无效。
    5)and和or的执行逻辑(and优先执行)
    这一块加粗的原因是因为之前没有注意到这个问题,预感这个会成为之后写查询语句的一个大坑,这边先备注一下

    SELECT * FROM data.dataanalyst
    where city = "上海"
    and education = "本科"
    or workYear = "1-3年";
    

    上述查询语句,本意是查询city在上海的(结果中city应该只等于上海),education为本科或者工作1-3年的人(education和workYear二选一),但是结果中出现了city为非上海的数据,此处涉及到and和or同时出现时,SQL的执行优先级问题。


    lip_image002.png

    实际上该语句的查询目标为

    SELECT * FROM data.dataanalyst
    where (city = "上海"
    and education = "本科")
    or workYear = "1-3年";
    

    此处,and优先计算组成条件1,即city是上海的且education是本科为条件1,workYear等于1-3年为条件2,结果为条件1成立或者条件2成立的数据,因此出现了city为北京、深圳,以及education等于大专的数据。
    如果要实现原来的查询目标,SQL语句如下

    SELECT * FROM data.dataanalyst
    where city = "上海"
    and (education = "本科"
    or workYear = "1-3年");
    

    结果如下


    lip_image004.png

    6)select子查询的使用
    稍微复杂一点的查询都会带有子查询,这个用的非常多
    7)表连接join(inner join和left join非常实用)
    在刷题过程中,发现表连接用的真的超级多,特别是left join ,用起来很方便,这一块的主要问题应该是不知道什么时候用哪种连接更方便,这也和解题思路有关,感觉这个需要长期积累,不断实践,才能有这个觉悟。
    8)关于日期函数的使用
    关于日期函数,之前已经总结过一篇文章,我只想说,日期函数真的太多了!个人在这一块踩到的坑是关于日期格式的指定问题(%格式),之前一直以为大小写不分,实际上是区分的
    例子:%M和%m,分别表示月份名称和月份数值

    SELECT DATE_format('2008-12-30','%m') as t1,DATE_format('2008-12-30','%M') as t2
    
    image.png
    9)练习题目(这一块非常重要)
    不管哪一种语言,不用肯定会生疏,做练习可以不断的复习知识点以及发现新的问题,这一块在之后的学习中需要保持。这一块的总结之前也写过文章。
    10)requests库的常用方法
    说实话,这周由于刷SQL题目,有点疏于学习爬虫了,希望下周能努力跟上计划。
    爬虫的基本流程:
    1、发起请求:向目标站点发送一个request,其中可包含headers等信息,等待服务器响应;
    2、获取响应内容:服务器正常响应的话,会返回一个response,response的内容可能是HTML、json或者二进制数据;
    3、解析内容:如果response的内容是HTML,可以用正则表达式或者网页解析库进行解析;json,可转为json对象解析,最后保存成结构化数据。
    该库用的最多的是requests.get()、requests.post()以及requests.Session()【保持登录状态】。
    响应中包含的一些东西,当然,发送请求的时候最好带上请求头headers
    import requests
    response = requests.get('http://www.jianshu.com')
    print(response.status_code)
    print(response.headers)
    print(response.text)
    print(response.cookies)
    print(response.url)
    print(response.history)
    
    #添加post请求,需要带form data发送请求请求的意义
    import requests
    data = {
        'name':'gemery',
        'age':2
    }
    response = requests.post('http://httpbin.org/post',data=data)
    print(response.text)
    
    #第一种:实施了两次requests.get,相当于在两个浏览器中独立运行
    import requests
    requests.get('http://httpbin.org/cookies/set/number/123456789')
    response = requests.get('http://httpbin.org/cookies')  #登录装态没有维持,在两个浏览器中独立运行,不相关
    print(response.text)
    

    返回{
    "cookies": {}
    }

    解决方法:设置session

    import requests
    s = requests.Session()  #相当于在同一个浏览器中
    s.get('http://httpbin.org/cookies/set/number/123456789')
    response = s.get('http://httpbin.org/cookies') 
    print(response.text)  #得到了cookie
    

    返回{
    "cookies": {
    "number": "123456789"
    }
    }
    11)正则表达式
    这一块加粗的原因是第一次接触正则表达式,觉得真的不是很容易写。
    Python中的正则表达式库是re
    常用方法有
    re.match(),从第一个字符开始匹配 如果最开始不匹配的话 就会返回none;
    re.search(),扫描整个字符串 返回第一个匹配的字符;
    re.sub(),替换字符串中每一个匹配的子串后返回替换后的字符串;
    re.findall(),搜索字符串 以列表形式返回全部能匹配的子串。

    import re
    html = '''<div id="songs-list">
    <h2 class="title">经典老歌</h2>
    <p class="introduction">
    经典老歌列表
    </p>
    <ul id="list" class="list-group">
    <li data--view=2>一路上有你</li.>
    <li data-view=“7”,class="active">
    <a href="/3.mp3 singer="齐秦"> 往事随风</a>
    </li>
    <li data-view=“4”>
    <a href="/3.mp3 singer="任贤齐"> 沧海一声笑</a>
    </li>
    <li data-view=“4”>
    <a href="/3.mp3 singer="陈慧琳"> 记事本</a>
    </li>
    </div>
    '''
    result = re.search('<li.*active.*singer="(.*?)">(.*?)</a>',html,re.S)
    print(result)
    print(result.group())
    print(result.group(1),result.group(2))
    

    返回

    <_sre.SRE_Match object; span=(121, 348), match='<li data--view=2>一路上有你</li》\n<li data-view=“7”,cl>
    <li data--view=2>一路上有你</li>
    <li data-view=“7”,class="active">
    <a href="/3.mp3 singer="齐秦"> 往事随风</a>
    </li>
    <li data-view=“4”>
    <a href="/3.mp3 singer="任贤齐"> 沧海一声笑</a>
    </li>
    <li data-view=“4”>
    <a href="/3.mp3 singer="陈慧琳"> 记事本</a>
    陈慧琳  记事本
    

    此处,使用了贪婪匹配,只返回了最后一位歌手以及歌名
    这一块需要注意的有
    尽量使用非贪婪算法和泛匹配;
    换行的时候,设置re.S;
    需要多多练习,这一块还不是很熟悉。

    关于SQL,还有一些其他的问题,等弄懂了再整理出来。

    相关文章

      网友评论

        本文标题:2019-01-07至2019-01-13,本周学习总结

        本文链接:https://www.haomeiwen.com/subject/lzekdqtx.html