Hi!请登陆

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

2020-11-3 45 11/3

首先,毕竟站长已经开源了,我还是倒腾着写了几行代码,代码仅供学习使用,望谅解。

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

  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代表类型,后边如果要爬取正能量、诗词等句子,只需要改变类型即可。

  1. 获取数据

    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
    
  2. 配置数据库
    根据要求,配置自己的数据库信息,
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()

相关推荐