Python爬虫入门,快速抓取大规模数据(第三部分)

如果没有读过前两部份的读者,建议先看前两部份:
Python爬虫入门,快速抓取大规模数据(第一部分)
Python爬虫入门,快速抓取大规模数据(第二部分)

在这一部份我们将看看如何存储数据。需要存储的数据有两部份,一部分是我们已经抓取和未被抓取的网页地址;另一部不份是我们抓取到的数据。首先想到的存储方式是使用关系数据库来存储。

在关系数据库中,表是数据库中存放关系数据的集合,一个数据库里面通常都包含多个表,要操作关系数据库,首先需要连接到数据库,一个数据库连接称为Connection;连接到数据库后,需要打开游标cursor,通过Cursor执行SQL语句。

使用SQLite存储数据

SQLite是一种嵌入式数据库,它的数据库就是一个文件。python就内置了SQLite3,所以我们不需要安装任何额外的东西。本着从最简单的入手然后逐步深入的原则,我们先看看如何使用SQLite存储数据,然后在看看如何使用其他关系数据库。

在我们的数据库中创建一张urls的表,这张表包含两个字段url和timestamp。timestamp字段记录url采集的时间,没有采集的timestamp为空。

import sqlite3

# 创建数据库表,只需要运行一次
def initialize_db(url):

    connection = sqlite3.connect('test.db')
    cursor = connection.cursor()

    cursor.execute("CREATE TABLE urls(url string PRIMARY KEY NOT NULL, timestamp TimeStamp)")

    connection.commit()
    connection.close()

下面函数add_new_url()用来添加新的未采集的url数据库表中。

import sqlite3

def add_new_url(url):

    connection = None
    cursor  = None

    # 建立mysql数据库的connection
    connection = sqlite3.connect('test.db')
    cursor  = conn.cursor()    

    # 添加新的URL到数据库的urls表中
    sql = "INSERT INTO urls(url) VALUES('%s')" % (url)
    cursor.execute(sql)
    connnection.commit()

    connection.close()

下面函数get_unvisited_url()将从数据库中返回一条待采集的url。

import sqlite3

def get_unvisited_url():

    url = None
    connection = None
    cursor  = None

    # 建立mysql数据库的connection
    connection = sqlite3.connect('test.db')
    cursor  = connection.cursor()    

    # 从数据库的url表中选择新的一个URL
    sql = "SELECT url FROM urls WHERE timestamp IS NULL LIMIT 1"; 
    cursor.execute(sql)
    for r in cursor.fetchall(): 
        url = r[0]

    # 更新当前记录的时间戳为当前时间
    sql = "UPDATE urls SET timestamp = CURRENT_TIMESTAMP WHERE url = '%s'" % (url)
    cursor.execute(sql)
    connection.commit()

    connection.close()
    return url

使用MySQL存储数据

这一部分我们已经安装和搭建了一台Mysql的数据库,这里就不讨论如何搭建Mysql数据库了。如果你已经学习了上一节中如何SQLite来存储数据,那么你已经学会了基本的python的数据库编程。对于理解下面的代码不会有任何问题,和SQLite版本的区别只是数据库连接的方式不一样而已。

import MySQLdb

def add_new_url(url):

    connection = None
    cursor  = None

    # 建立mysql数据库的connection
    connection = MySQLdb.connect(host = DB_HOSTNAME, user = DB_USER, passwd = DB_PASSWORD, db = DB_NAME, port = DB_PORT)
    cursor  = conn.cursor()    

    # 添加新的URL到数据库的urls表中
    sql = "INSERT INTO urls SET url='%s'" % (MySQLdb.escape_string(url))
    curor.execute(sql)
    connnection.commit()

    connection.close()
import MySQLdb

def get_unvisited_url():

    url = None
    connection = None
    cursor  = None

    # 建立mysql数据库的connection
    connection = MySQLdb.connect(host = DB_HOSTNAME, user = DB_USER, passwd = DB_PASSWORD, db = DB_NAME, port = DB_PORT)
    cursor  = conn.cursor()    

    # 从数据库的url表中选择新的一个URL
    sql = "SELECT url FROM urls WHERE timestam IS NULL ORDER BY rand() LIMIT 1"; 
    cur.execute(sql)
    for r in cur.fetchall(): 
        url = r[0]

    # 更新当前记录的时间戳为当前时间
    sql = "UPDATE urls SET timestamp = '%s' WHERE url = '%s'" % (MySQLdb.escape_string(url)
    cursor.execute(sql)
    connection.commit()

    connection.close()
    return url

总结

这部分我们讨论了如何让我们的URL存储到关系数据库中,作为扩展练习读者还可以用同样的方法保存抓取到的网页内容。除了关系数据库之外,我们也可以使用非关系数据来保存数据。

另外,在接下来的章节中我们将讨论如何抓取动态生成内容的网页。

猜你喜欢

转载自blog.csdn.net/nj_kevin_peng/article/details/80379975