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