python网络数据采集——存储数据

文件下载

1
2
3
4
5
6
7
8
9
10
11
12
13
抛出一个问题:
对于爬虫而言,链接中的文件是下载呢,还是只是保存url链接,使用时直接链路?

这里我总结我所知道的优缺点:
不下载优点:
1.爬虫运行更快,耗费的流量更少
2.可以节省很多的存储空间
3.存储url的代码更容易写,不需要实现文件下载代码
4.降低目标主机服务器的负载
缺点:
1.盗链,每个网站可能会实施防盗链措施
2.文件仍然在别人服务器上,跟着别人的节凑走
3.盗链的图片容易改变

在python中可以引入 urlretrieve 进行文件的直接下载,在下载之前找到链接是必须的,这就要使用之前的 find 函数了。

1
2
3
4
5
6
7
8
9
10
11
from urllib.request import urlopen
from urllib.request import urlretrieve
from bs4 import BeautifulSoup

html = urlopen("http://www.pythonscraping.com/")
bsObject = BeautifulSoup(html, "html.parser")
b = bsObject.find("a", {"id": "logo"})
img = b.find("img")
location = img["src"]
print(location)
urlretrieve(location, "logo.jpg")

用爬虫下载文件会使你的电脑处于危险的环境当中,因为不知道下载的文件是否恶意软件。
如果不能确定下载的文件是否安全,请不要轻易尝试这个.py脚本。

以csv格式存储

csv,Comma-Separated Values,逗号分隔值,是存储表格数据的常用格式,如:

1
2
3
4
fruit,cost
apple,1.00
banana,0.30
pear,1.25

参考以下代码,如何将数据写入到csv格式文件中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 这边在引入的时候要注意,千万不要引入 python3 框架中的模块
import _csv as csv
# import os

path = "./csv/test.csv"
# if not os.path.exists(path):
# os.mkdir(path)

with open(path, 'w+') as csvFile:
try:
writer = csv.writer(csvFile)
writer.writerow(('number', 'number plus 2', 'number times 2'))
for i in range(10):
writer.writerow((i, i+2, i*2))
finally:
csvFile.close()

python 中新建文件的机制考虑的非常周到,如果文件不存在则会创建。然后注意引入代码上面的注释,python3 框架中也存在csv模块,应该引入内置申明中的包。

csv 的数据形式和html中的表格数据展示相似,所以一般用来存储爬取到的表格中的数据。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import _csv as csv
from urllib.request import urlopen
from bs4 import BeautifulSoup

html = urlopen("http://en.wikipedia.org/wiki/Comparison_of_text_editors")
bsObj = BeautifulSoup(html, "html.parser")
# 获取页面上的第一个表格
table = bsObj.find_all("table", {"class": "wikitable"})[0]
# print(table)
rows = table.find_all("tr")
# print(rows)

path = "./csv/table.csv"
with open(path, "wt", newline="", encoding="utf-8") as csvFile:
writer = csv.writer(csvFile)
try:
for row in rows:
csvRow = []
for cell in row.find_all({"td", "th"}):
csvRow.append(cell.get_text())
writer.writerow(csvRow)
finally:
csvFile.close()

mysql整合

之所以需要mysql,因为爬取的数据不能光在内存中处理,还需要进行持久化处理。因为我们可能需要将数据进行展示或者进行后一步的处理。

关于mysql的下载,自行google。
macOS系统 可以使用 brew install mysql命令下载。
这里使用 pymysql 这个第三方工具整合 mysql ,可以使用pip进行下载。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import pymysql

# 打开数据库
db = pymysql.connect("localhost", "root", None, "wyc")

# 创建游标
cursor = db.cursor()

# 执行sql语句
cursor.execute("select version()")

# 打印信息
print(cursor.fetchone())

# 关闭数据库
db.close()

这段程序有两个对象:连接对象(conn )和光标对象(cur ),一个连接可以有很多个光标。一个光标跟踪一种状态 (state)信息,用完光标和连接之后,千万记得把它们关闭。如果不关闭就会导致连接泄漏 (connection leak)。

显示 Gitment 评论