欢迎食用『主界面』~,这里是赵苦瓜的看板娘desu~

#
【点滴记录】爬虫基础 - Ⅲ(数据存储、Ajax请求)
首页 > 点滴记录    作者:赵苦瓜   2021年8月10日 10:15 星期二   热度:27778°   百度已收录  
时间:2021-8-10 10:15   热度:27778° 

数据存储

用之前学过的解析器解析出数据之后,就是数据的存储了。我们可以简单地保存为文本文件,如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等。

本文作者:赵苦瓜      文章标题: 【点滴记录】爬虫基础 - Ⅲ(数据存储、Ajax请求)
本文地址:https://blog.jixiaob.cn/?post=67
版权声明:若无注明,本文皆为“赵苦瓜のBlog~”原创,转载请保留文章出处。

返回顶部    首页    后花园  
版权所有:赵苦瓜のBlog~    站长: 赵苦瓜    程序:emlog   鲁ICP备20030743号-1   鲁公网安备37048102006726 萌ICP备20222268号    sitemap