学习目标
数据提取的基础概念和数据分类
json模块的复习
正则表达式的复习
认识xml
xpath的学习
LXML类库的学习
2 数据提取的概念和数据的分类
2.1 什么是数据提取
简单的来说,数据提取就是从响应中获取我们想要的数据的过程
2.2 爬虫中数据的分类
结构化数据:json,xml等
处理方式:直接转化为python类型
非结构化数据:HTML
处理方式:正则表达式、xpath
下面以今日头条的首页为例,介绍结构化数据和非结构化数据
结构化数据例子:
非结构化数据:
XML数据:
<bookstore>
<book category="COOKING">
<title lang="en">Everyday Italian</title>
<author>Giada De Laurentiis</author>
<year>2005</year>
<price>30.00</price>
</book>
<book category="CHILDREN">
<title lang="en">Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
<book category="WEB">
<title lang="en">Learning XML</title>
<author>Erik T. Ray</author>
<year>2003</year>
<price>39.95</price>
</book>
</bookstore>
从上面可以看出,xml数据也是结构非常明显的
3 数据提取之json
3.1 什么是json
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,它使得人们很容易的进行阅读和编写。同时也方便了机器进行解析和生成。适用于进行数据交互的场景,比如网站前台与后台之间的数据交互。
3.2 哪里能找到返回json的url
下面以豆瓣热映电影为例,来了解那里能够找到返回json的url地址:https://movie.douban.com/cinema/nowplaying/beijing/
3.3.1 我们如何确定数据在哪里
在url地址对应的响应中搜索关键字即可
注意:
url地址对应的响应中,中文往往是被编码之后的内容,所以更推荐大家去搜索英文和数字
另外一个方法就是在perview中搜索,其中的内容都是转码之后的
3.3.2 切换手机版寻找返回json的地址
在chrome中点击切换手机版的选项,需要重新刷新页面才能够切换成功,部分网站还需要重新进入主页面之后再继续点击才能够切换成功,比如:豆瓣热映
会发现响应中可能包含部分数据并不是我们想要的,如下:
;jsonp1({"count": 18, "start": 0, "subject_collection_items": "...."})
其中jsonp1似乎是很眼熟,在请求的地址中包含一个参数callback=jsonp1,正是由于这个参数的存在,才导致结果中也会有这部分数据,对应的解决方法是:直接删除url地址中的callback字段即可,在url地址中很多字段都是没用的,可以大胆尝试
3.3.3 json数据格式化方法
在preview中观察
在线解析工具进行解析
比如:https://www.bejson.com/
pycharm进行reformat code
在pycharm中新建一个json文件,把数据存入后,点击code下面的reformat code,但是中文往往显示的是unicode格式
3.3.4 json数据的其他来源
抓包app,但是很多时候app中的数据是被加密的,但是仍然值得尝试
3.4 json模块中方法的学习
其中类文件对象的理解:
具有read()或者write()方法的对象就是类文件对象,比如f = open(“a.txt”,”r”) f就是类文件对象
具体使用方法:
#json.dumps 实现python类型转化为json字符串
#indent实现换行和空格
#ensure_ascii=False实现让中文写入的时候保持为中文
json_str = json.dumps(mydict,indent=2,ensure_ascii=False)
#json.loads 实现json字符串转化为python类型
my_dict = json.loads(json_str)
#json.dump 实现把python类型写入类文件对象
with open("temp.txt","w") as f:
json.dump(mydict,f,ensure_ascii=False,indent=2)
# json.load 实现类文件对象中的json字符串转化为python类型
with open("temp.txt","r") as f:
my_dict = json.load(f)
3.5 json模块的作用
Json在数据交换中起到了一个载体的作用,承载相互传递的数据
3.6 练习
爬取豆瓣电视剧上英剧和美剧两个分类的电视数据,地址:https://m.douban.com/tv/
4 数据提取之正则
(参考资料:正则表达式概述、正则表达式(总结版))
4.1 什么是正则表达式
用事先定义好的一些特定字符、及这些特定字符的组合,组成一个规则字符串,这个规则字符串用来表达对字符串的一种过滤逻辑。
4.2 正则表达式的常见语法
知识点
正则中的字符
正则中的预定义字符集
正则中的数量词
正则的语法很多,不能够全部复习,对于其他的语法,可以临时查阅资料,比如:表示或还能使用|
练习: 下面的输出是什么?
string_a = '<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">\n\t\t<meta http-equiv="content-type" content="text/html;charset=utf-8">\n\t\t<meta content="always" name="referrer">\n <me