Python爬虫:“毒鸡汤”网站的爬取过程。

首先,要给站长说一声:“对不起”。毕竟站长已经开源了,我还是倒腾着写了几行代码,代码仅供学习使用,望谅解。

如果你只是纯粹需要数据的,请查看站长的开源项目。

1. 创建表

数据库为MySQL,首先创建我们要存储毒鸡汤的表,表结构如下:

CREATE TABLE `spider_dujitang` (
  `id` int(255) NOT NULL AUTO_INCREMENT,
  `type` varchar(255) NOT NULL COMMENT '类型',
  `type_text` varchar(255) NOT NULL COMMENT '值',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=6044 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;

其中,id是主见,type代表类型,后边如果要爬取正能量、诗词等句子,只需要改变类型即可。

2. 获取数据

import requests
from lxml import etree
import conndb
import time


# 根据HTML,获取爬取字段,并拼成SQL
def getSQL():
    url = "http://www.nows.fun/"
    r = requests.get(url).text  # 获取网页的HTML
    html = etree.HTML(r)
    html_data = html.xpath('//*[@id="sentence"]/text()')[0]  # 获取爬取字段
    if selectText(html_data) == 1:  # 判断当前字段数据库是否已存在,调用查重方法
        return  None
    sql = "INSERT INTO spider_tgriji(type,type_text) VALUES ('%s','%s')"% ("毒鸡汤",html_data)  # 拼写插入语句,并返回
    return sql


# 对spider_dujitang表进行查重,防止数据重复插入
def selectText(html_data):
    seSQL = "select type_text from spider_tgriji"
    sList = conndb.exe_query(cur, seSQL)  # 调用查询方法
    for s in sList:  # 遍历查询出来的所有值
        typeTextOld = s[0]
        if typeTextOld == html_data:
            print("==========遇到重复数据了======="+html_data)
            time.sleep(2)
            return 1
    return 0


# 主方法
if __name__ == '__main__':
    i = 1
    while i > 0:
        conn = conndb.conn_db()[0]
        cur = conndb.conn_db()[1]
        sql = getSQL()
        if sql is None:  # 判断当前SQL是否为None,如果是,则重新循环。
            continue
        conndb.exe_update(cur, sql)
        conndb.exe_commit(cur)
        conndb.conn_close(conn, cur)
        print("数据条数:"+str(i)+",两秒后继续")
        time.sleep(2)
        i+= 1

3. 配置数据库

根据要求,配置自己的数据库信息,

import pymysql

def conn_db():  # 连接数据库函数
    conn = pymysql.connect(
        host='数据库地址',
        port='端口',
        user='数据库账户',
        passwd='数据库密码',
        db='数据库名称',
        charset='utf8')
    cur = conn.cursor()
    return conn, cur


def exe_update(cur, sql):  # 更新语句,可执行update,insert语句
    sta = cur.execute(sql)
    return sta


def exe_delete(cur, ids):  # 删除语句,可批量删除
    for eachID in ids.split(' '):
        sta = cur.execute('delete from cms where id =%d' % int(eachID))
    return sta


def exe_query(cur, sql):  # 查询语句
    cur.execute(sql)
    return cur


def exe_commit(cur):
    cur.connection.commit()  # 执行commit操作,插入语句才能生效


def conn_close(conn, cur):  # 关闭所有连接
    cur.close()
    conn.close()

发表评论

邮箱地址不会被公开。 必填项已用*标注