Python_数据存储

文章未经允许,不可转载

阅读本文需要Python基础,MongoDB基础,关系型数据库基础。如果你是一名正在学习爬虫的Pythoner,相信本文会很有帮助,:)

写在前面

如果爬虫是为了接下来的数据分析服务的,那么数据存储就是一个很关键的问题。

短平快的存储方式

  • txt
    • 只要有规律,用类似Power Query的工具都可以进行处理
  • csv
    • 比txt更加喜闻乐见一点
  • MongoDB
    • 虽然也是数据库,但是拿来就用,不用定义数据类型

稍微复杂的存储方式

  • Mysql
    • 定义数据类型
    • 数据分析可以结合sql进行
  • Microsoft SQL Server
    • 同上
  • PostgreSQL
    • 同上

如果能用txt解决问题

1
2
3
4
# 示意代码
with open('duohappy.txt', 'w') as f:
for data in result:
f.write(data + '\n')

如果txt不行呢,那么用csv试试

1
2
3
4
5
6
7
8
9
10
# 示意代码
import csv

with open('duohappy.csv', 'w', newline='', encoding='utf-8') as f:
field_names = ['nick_name', 'true_name']
writer = csv.DictWriter(f, field_names)
writer.writeheader()

for data in result:
writer.writerow(data)

如果csv不行呢,那么用数据库试试

1
2
3
4
5
6
7
8
# 示意代码
import pymongo

client = pymongo.MongoClient('localhost', 27017)
db = client['>_>']
col = db['>_>']

col.insert_one(data)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 示意代码
import pymysql

conn = pymysql.connect(host='localhost',
user='>_>',
password='>_>',
db='>_>',
charset='utf8mb4',
cursorclass=pymysql.cursors.DictCursor)
try:
with conn.cursor() as cursor:
cursor.execute(sql)
finally:
conn.close()

csv

仅仅讲讲DictWriter,如果没有爬虫基础,请先看看简单网站爬虫的所有技能

本来想用百度贴吧来做演示的,但是需要涉及很多正则知识,所以用了我自己的网站,beautifulsoup就可以处理了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# -*- coding: utf-8 -*-
__author__ = 'duohappy'

import csv

import requests
from bs4 import BeautifulSoup

def get_info_from(url):
result = [] # 保存结果

headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36"
}

web_data = requests.get(url, headers=headers)

web_data.encoding = 'utf-8'
content = web_data.text

soup = BeautifulSoup(content, 'lxml')

include_title_url_tags = soup.select('a.post-title-link')

for tag in include_title_url_tags:
# 组成一个结构化的数据
data = {
"url": 'http://zhouww.com' + tag.get('href'),
"title": tag.text
}

result.append(data)

return result

def export_to_csv(result):
# newline这个参数很重要,试试去掉了会怎么样
with open('./duohappy.csv', 'w', newline='', encoding='utf-8') as f:
field_names = ['url', 'title']
writer = csv.DictWriter(f, field_names)
writer.writeheader() # 第一行写标题

# 开始写数据
for data in result:
writer.writerow(data)

if __name__ == "__main__":
url = 'http://zhouww.com'

result = get_info_from(url)

export_to_csv(result)

pymongo

为什么写入数据要这门麻烦啊,直接insert不行么?csv太难用了

嗯,可以!但是简单的背后需要付出更多的学习成本,当然这是一劳永逸的事情

如果没有MonogoDB基础,请先阅读一下MongoDB入门教程(一) - hsd2012的专栏 - CSDN博客,谢谢这篇文章的作者!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# -*- coding: utf-8 -*-
__author__ = 'duohappy'

import requests
from bs4 import BeautifulSoup
import pymongo

client = pymongo.MongoClient('localhost', 27017) # 连接本地数据库
duohappy_db = client['duohappy_blog'] # 建立一个数据
article_info_col = duohappy_db['article_info'] # 建立一个集合


def get_info_from(url):

headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36"
}

web_data = requests.get(url, headers=headers)

web_data.encoding = 'utf-8'
content = web_data.text

soup = BeautifulSoup(content, 'lxml')

include_title_url_tags = soup.select('a.post-title-link')

for tag in include_title_url_tags:
data = {
"url": 'http://zhouww.com' + tag.get('href'),
"title": tag.text
}

article_info_col.insert_one(data) # insert_one就够了,没有乱七八糟的csv,DictWriter

if __name__ == "__main__":
url = 'http://zhouww.com'

result = get_info_from(url)

pymysql

虽然MongoDB很简单,但是想用sql进行数据分析,可以么?

嗯,可以,这么可爱的你,说什么都可以!存储数据的方式换一下,用关系型数据来存储吧比如Mysql

还是以爬取我博客文章为例,在Mysql中创建一个duohappy_blog的数据库

1
CREATE DATABASE duohappy_blog

在duohappy_blog这个数据库见一个表

1
2
3
4
5
6
CREATE TABLE `article_info` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`url` varchar(200) DEFAULT NULL,
`title` varchar(100) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB CHARSET=utf8;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# -*- coding: utf-8 -*-
__author__ = 'duohappy'

import requests
from bs4 import BeautifulSoup
import pymysql

conn = pymysql.connect(host='localhost',
user='>_>', # 填入用户名
password='>_>', # 填入密码
db='duohappy_blog', # 需要连接的数据库
charset='utf8mb4', # 指定数据集编码,很重要
cursorclass=pymysql.cursors.DictCursor) # 这个也很有用,特别是从数据库中读数据的时候

def get_info_from(url, cur):

headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36"
}

web_data = requests.get(url, headers=headers)

web_data.encoding = 'utf-8'
content = web_data.text

soup = BeautifulSoup(content, 'lxml')

include_title_url_tags = soup.select('a.post-title-link')

for tag in include_title_url_tags:
article_url = 'http://zhouww.com' + tag.get('href')
article_title = tag.text

sql = 'INSERT INTO article_info (url, title) VALUES (%s, %s)' # 定制插入数据的sql,插入的数据,均用%s,不用管数据类型

cur.execute(sql, (article_url, article_title)) # 执行sql


if __name__ == "__main__":
url = 'http://zhouww.com'

try:
with conn.cursor() as cur:
get_info_from(url, cur)

conn.commit() # 必须!没有这条语句,数据不会真正写入数据库
finally:
conn.close()

写在后面

文本文件如CSV、非关系型数据库如MongoDB、关系型数据库如Mysql,都可以成为爬虫中的数据存储工具。如果你有更好的理解,欢迎投稿,:)

纸上得来终觉浅,绝知此事要躬行
我博客上处理文章链接和标题,还有一个显著的信息就是发表时间。怎么把文章链接,标题,发表时间提取出来,分别存储到CSV、MongoDB、Mysql中呢?

看别人的代码是学不会爬虫的

您的支持将鼓励我继续创作!