数据存储
用之前学过的解析器解析出数据之后,就是数据的存储了。我们可以简单地保存为文本文件,如txt文本文档,json格式的数据,或者csv逗号表达式文件,也可以保存到MySQL、mongoDB等数据库中。
TXT文本存储
爬取完成数据之后,打开文件存储即可。
def txt_save(text): file = open('test1.txt', 'a', encoding='utf-8') file.write(text) file.close() if __name__ == '__main__': print("喵") # 这里test2返回的是一个list,每一个元素代表一段文本 contents = test2() # join方法是将序列中的元素以指定的字符连接生成一个新的字符串。 text1 = '\n'.join(contents) txt_save(text1)关于文件打开方式:
上述文件打开方式为a,代表以追加的方式写入到文本,这种打开方式不会清空文件,而是接着后面写。
其他的打开方式:
r 只读(默认) rb 二进制读 r+ 读写 rb+ 二进制读写 w写(文件存在将覆盖) wb 二进制写 w+读写 wb+二进制读写
a追加 ab二进制追加 a+读写追加 ab+ 基本同ab
另外,文件打开可以使用with语句来进行简化。
def txt_save(text): # file = open('test1.txt', 'a', encoding='utf-8') # file.write(text) # file.close() with open('test1.txt', 'w', encoding='utf-8') as file: file.write(text)
with控制块结束时,文件会自动关闭,这样就不用再自己写close了。
Json文件存储
Json全称为JavaScript Object Notation,它通过对象和数组的组合表示数据。
对象,用花括号包裹{},里面是键值对的形式(类似Python中的字典类型)。
键名可以用数字或字符串表示,键值可以是任意数据类型。
数组,用方括号[]包裹。(类似于Python中的列表)。
说到Python中的字典和列表,大家就不陌生了。正如Python中一样,他们在Json中也可以互相嵌套。
当然,字典和json也是可以相互转换的。
def json_test(): import json text = '{"msg":"ok","code":200, "fingure_list":[2,3,5,6],"text":"好家伙"}' # 把json文本转换为Python中的字典或列表(Json对象) j_dict = json.loads(text) # 把Python的字典或列表转换为Json(文本字符串) print(json.dumps(j_dict)) # ==> {"msg": "ok", "code": 200, "fingure_list": [2, 3, 5, 6], "text": "\u597d\u5bb6\u4f19"} # 有中文字符等,需要使用以下写法直接保留中文字符 print(json.dumps(j_dict, ensure_ascii=False)) # ==> {"msg": "ok", "code": 200, "fingure_list": [2, 3, 5, 6], "text": "好家伙"}如果要保存Json的格式(缩进),可以在dump的时候加上参数indent=2,代表加俩缩进字符。
print(json.dumps(j_dict, ensure_ascii=False, indent=2)) # ==> { "msg": "ok", "code": 200, "fingure_list": [ 2, 3, 5, 6 ], "text": "好家伙" }
CSV文件存储
CSV全称Comma-Separated Values,逗号分隔值或字符分隔值。说白了就是拿逗号和换行符写一个表格数据。
可以看一下写入的代码。写入可以使用writerow写入一行,也可以用writerows写入多行(传入二维列表参数)。
def csv_test(): import csv data_list = [ ['id', 'name', 'age'], ['100001', 'Bob', 13], ['100002', 'Alice', 18], ['100003', 'Mike', 22], ] # 指定newline='',避免空行问题 with open('test.csv', 'w', newline='') as csv_file: writer = csv.writer(csv_file) writer.writerows(data_list)写入之后就是csv文件了,你会惊奇的发现excell可以打开它。
这个写入默认是以逗号为分隔符。如果想改为空格,可以在csv.writer()里面加一个 delimiter=' '的参数修改为空格。
但是这样excell直接是不认的,需要在excell中设置一下才能正常显示。
当然,大部分时候我们爬取的数据是字典的形式存储的,这时也可以将字典写入:
def csv_test2(): import csv dict_list = [ {'id': '100001', 'name': 'Bob', 'age': 13}, {'id': '100002', 'name': 'Alice', 'age': 18}, {'id': '100003', 'name': 'Mike', 'age': 22}, ] with open('test2.csv', 'w', newline='') as csv_file: # 指定字典的key作为表头 fieldnames = ['id', 'name', 'age'] writer = csv.DictWriter(csv_file, fieldnames=fieldnames) writer.writeheader() writer.writerows(dict_list)这个是可以追加写入的,追加写入时,打开方式为a,然后写的时候不用执行writeheader这一句了。
读取时reader=csv.reader(file),然后循环遍历reader就可以了。
当然pandas库可以更加方便的查看读取的csv
def pandas_test(): import pandas print(pandas.read_csv('test2.csv')) # ==> id name age 0 100001 Bob 13 1 100002 Alice 18 2 100003 Mike 22
MySQL数据库存储
这个在之前的博文中讲过了PyMysql的使用方法,详见:
【点滴记录】MySQL的基本语法&&Python接入(pymysql) - 赵苦瓜のBlog (jixiaob.cn)
Ajax数据
有些网页是通过Javascript处理生成的,而requests只能抓取原始的内容,因此有时会出现看到的和爬到的不一样的情况。
有些页面原始没有数据,是在加载完原始页面后,又向服务器请求的数据填充的页面。这是一种异步加载的方式。
这时需要分析网页发起的Ajax请求,用requests模拟请求,获取数据抓取。
Ajax全称Asynchronous Javascript and XML,直译过来就是异步的Javascript和XML。
分析Ajax请求,我们一般使用浏览器的开发者工具(快捷键F12)
我们选择Network选项卡,查看网络请求
Ajax请求的类型是xhr,所以我们再点击xhr,如图所示
图示以今日头条首页为例,往下翻的时候会出现一个动态加载的过程。这时我们看右边的请求数据,可以看到这些正是Ajax请求的动态加载的数据。
我们点击右边的标头(Headers),就可以看到请求头,还有一些参数等详细信息。其中,X-Requested-With:XMLHttpRequest: XMLHttpRequest表示的就是这是Ajax请求。
之后我们可以对这个请求的Request和Response进行分析,就可以使用Python进行爬取了。(分析详见爬取课程表实例:【点滴记录】Python爬虫实战测试 - 爬取教务处的课程表 - 赵苦瓜のBlog (jixiaob.cn))
动态渲染页面爬取——模拟浏览器
有一些加密的Ajax不方便分析,还有一些不是使用的Ajax,但是是使用Javascript渲染的页面,这种情况要进行动态渲染页面爬取。
Python中的常用模拟浏览器的库,比如Selenium,Splash,PyV8,Ghost等。
本文地址:https://blog.jixiaob.cn/?post=67
版权声明:若无注明,本文皆为“赵苦瓜のBlog~”原创,转载请保留文章出处。