
首先,要给站长说一声:“对不起”。毕竟站长已经开源了,我还是倒腾着写了几行代码,代码仅供学习使用,望谅解。
如果你只是纯粹需要数据的,请查看站长的开源项目。
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()