使用python抓取csdn博客访问量并保存在sqlite3数据库中

转载请注明来源:http://blog.csdn.net/imred
解析网页使用的是BeautifulSoup,具体不解释了,代码里有注释,不懂欢迎提问。

# -*- coding: utf-8 -*-

import os
import sqlite3
import urllib.request
from bs4 import BeautifulSoup

# 前缀+页数+后缀拼成URL,HOST用来把链接相对地址转为绝对地址
PREFIX = "http://blog.csdn.net/imred/article/list/"
SUFFIX = "?viewmode=contents"
HOST = "http://blog.csdn.net"

# t_article保存文章信息,t_time保存抓取时时间,t_view保存访问量
SQL_CREATE_T_ARTICLE = "CREATE TABLE IF NOT EXISTS t_article ( \
                            id INTEGER PRIMARY KEY AUTOINCREMENT, \
                            title TEXT NOT NULL, \
                            link TEXT NOT NULL)"
SQL_CREATE_T_TIME = "CREATE TABLE IF NOT EXISTS t_time ( \
                            id INTEGER PRIMARY KEY AUTOINCREMENT, \
                            time TEXT DEFAULT (datetime('now', 'localtime')))"
SQL_CREATE_T_VIEW = "CREATE TABLE IF NOT EXISTS t_view ( \
                            id INTEGER PRIMARY KEY AUTOINCREMENT, \
                            tid INTEGER, \
                            aid INTEGER, \
                            view INTEGER NOT NULL, \
                            FOREIGN KEY(tid) REFERENCES t_time(id) ON DELETE CASCADE, \
                            FOREIGN KEY(aid) REFERENCES t_article(id) ON DELETE CASCADE)"

# 得到最近插入的时间id
SQL_QUERY_MAX_TID = "SELECT MAX(id) max_tid FROM t_time"
SQL_INSERT_TIME = "INSERT INTO t_time(time) VALUES(datetime('now', 'localtime'))"
# 通过链接地址查询文章id
SQL_QUERY_ARTICLE = "SELECT id FROM t_article WHERE link=?"
SQL_INSERT_ARTICLE = "INSERT INTO t_article(title, link) VALUES(?, ?)"
SQL_INSERT_VIEW = "INSERT INTO t_view(tid, aid, view) VALUES(?, ?, ?)"

class MyError(Exception):
    def __init__(self, value):
        self.value = value
    def __str__(self):
        return repr(self.value)

def getHtml(url):
    HEADERS = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0'}
    try:
        req = urllib.request.Request(url, headers=HEADERS)
        response = urllib.request.urlopen(req)
        html = response.read().decode()
        return html
    except urllib.error.HTTPError as e:
        raise MyError("Request for " + url + " failed: " + str(e))

# 获取文章总共有多少页
def getPageNum(soup):
    soupPageListDiv = soup.find("div", class_="pagelist")

    if soupPageListDiv is None:
        raise MyError("No any articles")

    soupPageNumSpan = soupPageListDiv.span
    strSpan = soupPageNumSpan.string
    left = strSpan.find("共")
    right = strSpan.find("页")
    strNum = strSpan[left + 1:right]
    return int(strNum)

def main():
    html = getHtml(PREFIX + "1" + SUFFIX)

    soup = BeautifulSoup(html, "lxml")
    iPageNum = getPageNum(soup)

    # 文章标题列表
    titleListHTML = soup.find_all("span", class_="link_title")
    titleList = []

    # 文章访问量列表和文章链接列表
    viewListHTML = soup.find_all("span", class_="link_view")
    viewList = []
    linkList = []

    if iPageNum > 1:
        for i in range(2, iPageNum + 1):
            tmpHtml = getHtml(PREFIX + str(i) + SUFFIX)
            tempSoup = BeautifulSoup(tmpHtml, "lxml")
            titleListHTML += tempSoup.find_all("span", class_="link_title")
            viewListHTML += tempSoup.find_all("span", class_="link_view")

    for title in titleListHTML:
        titleList.append(title.a.string.strip())
    for view in viewListHTML:
        viewList.append(view.contents[1].strip("()"))
        linkList.append(HOST + view.contents[0]['href'])

    for i in range(len(titleList)):
        print(titleList[i] + " " + viewList[i] + " " + linkList[i])

    strDbPath = os.path.join(os.path.dirname(__file__), 'blog_stat.db')

    try:
        conn = sqlite3.connect(strDbPath)
        try:
            cursor = conn.cursor()

            cursor.execute(SQL_CREATE_T_ARTICLE)
            cursor.execute(SQL_CREATE_T_TIME)
            cursor.execute(SQL_CREATE_T_VIEW)

            cursor.execute(SQL_INSERT_TIME)

            for i in range(len(titleList)):
                title = titleList[i]
                link = linkList[i]
                # 在t_article中查询是否有这篇文章,如果没有,则插入一条新纪录
                cursor.execute(SQL_QUERY_ARTICLE, (link,))
                result = cursor.fetchall()
                if len(result) == 0:
                    cursor.execute(SQL_INSERT_ARTICLE, (title, link))

            # 得到时间id
            cursor.execute(SQL_QUERY_MAX_TID)
            result = cursor.fetchone()
            max_tid = result[0]
            for i in range(len(titleList)):
                link = linkList[i]
                view = viewList[i]
                cursor.execute(SQL_QUERY_ARTICLE, (link, ))
                result = cursor.fetchone()
                # 得到文章id
                aid = result[0]
                # 插入新纪录
                cursor.execute(SQL_INSERT_VIEW, (max_tid, aid, view))
        finally:
            cursor.close()
        conn.commit()
    finally:
        conn.close()

if __name__ == "__main__":
    main()

本文采用 CC-BY 协议进行授权 cc-by

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Python使用sqlite3数据库需要先安装sqlite3库。可以使用pip install sqlite3来安装。 使用时需要导入sqlite3库,然后连接数据库并创建游标。之后就可以使用SQL语句对数据库进行操作了。 示例代码: ``` import sqlite3 # 连接数据库 conn = sqlite3.connect('example.db') # 创建游标 cursor = conn.cursor() # 执行SQL语句 cursor.execute('''CREATE TABLE COMPANY (ID INT PRIMARY KEY NOT NULL, NAME TEXT NOT NULL, AGE INT NOT NULL, ADDRESS CHAR(50), SALARY REAL);''') # 提交事务 conn.commit() # 关闭连接 conn.close() ``` 这是一个创建表的示例,在此基础上可以进行查询,插入,修改等操作。 ### 回答2: Python是一门高级的编程语言,可以用于开发各种应用程序,包括Web应用、桌面应用、数据分析等。在Python编程使用数据库是常见的需求之一。其SQLite3数据库是一种轻量级的关系型数据库,它提供了一种简单的存储方式,适合小型项目或者试验性质的应用程序。 在Python使用SQLite3数据库,需要先安装SQLite3数据库支持,然后通过Python的内置模块sqlite3来进行操作。在Python,与SQLite3数据库交互的主要流程为:连接数据库 -> 执行SQL语句 -> 处理结果。 连接数据库:在Python使用sqlite3模块的connect方法可以连接SQLite3数据库。connect方法接收一个字符串参数,表示要连接的数据库文件名,同时也可以指定其它参数,如超时时间、检查类型等。连接成功后,会返回一个Connection对象,通过该对象可以进行后续操作。 执行SQL语句:Python使用sqlite3模块的cursor方法可以创建一个游标对象,通过该游标对象可以执行SQL语句。执行SQL语句主要有三种方式:execute、executemany、executescript。其,execute方法用于执行单个SQL语句;executemany方法用于批量执行SQL语句,如插入多条数据;executescript方法用于执行多个SQL语句,如创建表结构等。在执行SQL语句时,也可以使用参数化查询,避免SQL注入攻击。 处理结果:执行SQL语句后,可以通过游标对象的fetch系列方法获取SQL查询的结果。其,fetchone方法用于获取一条结果;fetchmany方法用于获取多条结果;fetchall方法用于获取所有结果。在处理结果时,还需要注意异常处理和资源释放,避免程序出现故障或者资源浪费等问题。 总之,Python是一门流行的编程语言,可以使用SQLite3数据库来存储和管理数据。在Python使用sqlite3模块连接SQLite3数据库,并执行SQL查询。通过Python的内置函数,可以轻松实现对SQLite3数据库的增、删、改、查等操作。 ### 回答3: Python 是一种非常流行的编程语言,很多人都喜欢使用 Python 开发应用程序。Python 的优点是它简单易学、语法简洁、易于阅读、功能强大。而且,Python 社区非常活跃,有很多开源库供程序开发者使用SQLite数据库Python 常用的一种数据库类型,它是一种轻型的数据库,简单易用,非常适合小型应用程序的开发。 SQLite3 是Python的一个标准库,提供了一种内置式的数据库。虽然其不像MySQL和Oracle,并不允许多个用户同时修改同一个数据库,但对于很多小型项目来说,SQLite数据库是一种非常有效的解决方案。SQLite3在 Python 的应用非常广泛。事实上,用 Python 来操作 SQLite3 是一个非常方便的事情。 Python使用 SQLite3 的过程,可以首先使用 Python 内置的 sqlite3 模块来连接数据库。连接成功之后,我们就可以通过 SQL 语句来进行数据库的操作。如下: ```python import sqlite3 #连接数据库 conn = sqlite3.connect('test.db') #创建一个表 conn.execute('''CREATE TABLE COMPANY (ID INT PRIMARY KEY NOT NULL, NAME TEXT NOT NULL, AGE INT NOT NULL, ADDRESS CHAR(50), SALARY REAL);''') print("Table created successfully") #插入数据 conn.execute("INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) \ VALUES (1, 'Paul', 32, 'California', 20000.00 )") conn.execute("INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) \ VALUES (2, 'Allen', 25, 'Texas', 15000.00 )") conn.execute("INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) \ VALUES (3, 'Teddy', 23, 'Norway', 20000.00 )") conn.execute("INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) \ VALUES (4, 'Mark', 25, 'Rich-Mond', 65000.00 )") #查找数据 cursor = conn.execute("SELECT id, name, address, salary from COMPANY") for row in cursor: print("ID = ", row[0]) print("NAME = ", row[1]) print("ADDRESS = ", row[2]) print("SALARY = ", row[3], "\n") #更新数据 conn.execute("UPDATE COMPANY set SALARY = 25000.00 where ID = 1") conn.commit() print("Total number of rows updated :", conn.total_changes) #删除数据 conn.execute("DELETE from COMPANY where ID = 2;") conn.commit() print("Total number of rows deleted :", conn.total_changes) #关闭连接 conn.close() ``` 可以看到,Python 通过 sqlite3 模块可以轻松地连接 SQLite3 数据库,并进行增删改查等基本操作。因此,SQLite 非常适合开发小型项目,同时也是 Python 开发工具箱的重要功能之一。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值