Python爬虫:爬取小说并存储到数据库

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:

爬取小说网站的小说,并保存到数据库


第一步:先获取小说内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#!/usr/bin/python
# -*- coding: UTF-8 -*-
 
import  urllib2,re
 
domain  =  'http://www.quanshu.net'
headers  =  {
     "User-Agent" "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"
}
 
def  getTypeList(pn = 1 ):  #获取分类列表的函数
     req  =  urllib2.Request( 'http://www.quanshu.net/map/%s.html'  %  pn)  #实例将要请求的对象
     req.headers  =  headers   #替换所有头信息
     #req.add_header() #添加单个头信息
     res  =  urllib2.urlopen(req)    #开始请求
     html  =  res.read().decode( 'gbk' )   #decode解码,解码成Unicode
     reg  =  r '<a href="(/book/.*?)" target="_blank">(.*?)</a>'
     reg  =  re. compile (reg)  #增加匹配效率  正则匹配返回的类型为List
 
     return  re.findall(reg,html)
 
def  getNovelList(url):   #获取章节列表函数
     req  =  urllib2.Request(domain  +  url)
     req.headers  =  headers
     res  =  urllib2.urlopen(req)
     html  =  res.read().decode( 'gbk' )
     reg  =  r '<li><a href="(.*?)" title=".*?">(.*?)</a></li>'
     reg  =  re. compile (reg)
     return  re.findall(reg,html)
 
def  getNovelContent(url):   #获取章节内容
     req  =  urllib2.Request(domain  +  url)
     req.headers  =  headers
     res  =  urllib2.urlopen(req)
     html  =  res.read().decode( 'gbk' )
     reg  =  r 'style5\(\);</script>(.*?)<script type="text/javascript">style6\(\)'
     return  re.findall(reg,html)[ 0 ]
 
 
if  __name__  = =  '__main__' :
     for  type  in  range ( 1 , 10 ):
         for  url,title  in  getTypeList( type ):
             for  zurl,ztitle  in  getNovelList(url):
                 print  u '正则爬取----%s'  % ztitle
                 content  =  getNovelContent(url.replace( 'index.html' ,zurl))
                 print  content
             break
         break


执行后结果如下:

wKiom1kpIdThRNdaAAIyGKHHJXo728.png




第二步:存储到数据库

1、设计数据库

1.1 新建库:novel

wKiom1kpOr7yfa9aAABoSmd-OnA036.png


1.2 设计表:novel

wKioL1kpOvXi6UDzAABUheeLxB0623.png


1.3 设计表:chapter

wKiom1kpO4CgKxdUAAB6tbFOxwU677.png


并设置外键

wKioL1kpO4CANrBSAABInMXtb-E068.png




2、编写脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#!/usr/bin/python
# -*- coding: UTF-8 -*-
 
import  urllib2,re
import  MySQLdb
 
class  Sql( object ):
     conn  =  MySQLdb.connect(host = '192.168.19.213' ,port = 3306 ,user = 'root' ,passwd = 'Admin123' ,db = 'novel' ,charset = 'utf8' )
     def  addnovels( self ,sort,novelname):
         cur  =  self .conn.cursor()
         cur.execute( "insert into novel(sort,novelname) values(%s , '%s')"  % (sort,novelname))
         lastrowid  =  cur.lastrowid
         cur.close()
         self .conn.commit()
         return  lastrowid
     def  addchapters( self ,novelid,chaptername,content):
         cur  =  self .conn.cursor()
         cur.execute( "insert into chapter(novelid,chaptername,content) values(%s , '%s' ,'%s')"  % (novelid,chaptername,content))
         cur.close()
         self .conn.commit()
 
 
domain  =  'http://www.quanshu.net'
headers  =  {
     "User-Agent" "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"
}
 
def  getTypeList(pn = 1 ):  #获取分类列表的函数
     req  =  urllib2.Request( 'http://www.quanshu.net/map/%s.html'  %  pn)  #实例将要请求的对象
     req.headers  =  headers   #替换所有头信息
     #req.add_header() #添加单个头信息
     res  =  urllib2.urlopen(req)    #开始请求
     html  =  res.read().decode( 'gbk' )   #decode解码,解码成Unicode
     reg  =  r '<a href="(/book/.*?)" target="_blank">(.*?)</a>'
     reg  =  re. compile (reg)  #增加匹配效率  正则匹配返回的类型为List
 
     return  re.findall(reg,html)
 
def  getNovelList(url):   #获取章节列表函数
     req  =  urllib2.Request(domain  +  url)
     req.headers  =  headers
     res  =  urllib2.urlopen(req)
     html  =  res.read().decode( 'gbk' )
     reg  =  r '<li><a href="(.*?)" title=".*?">(.*?)</a></li>'
     reg  =  re. compile (reg)
     return  re.findall(reg,html)
 
def  getNovelContent(url):   #获取章节内容
     req  =  urllib2.Request(domain  +  url)
     req.headers  =  headers
     res  =  urllib2.urlopen(req)
     html  =  res.read().decode( 'gbk' )
     reg  =  r 'style5\(\);</script>(.*?)<script type="text/javascript">style6\(\)'
     return  re.findall(reg,html)[ 0 ]
 
mysql  =  Sql()
if  __name__  = =  '__main__' :
     for  sort  in  range ( 1 , 10 ):
         for  url,title  in  getTypeList(sort):
             lastrowid  =  mysql.addnovels(sort, title)
             for  zurl,ztitle  in  getNovelList(url):
                 print  u '正则爬取----%s'  % ztitle
                 content  =  getNovelContent(url.replace( 'index.html' ,zurl))
                 print  u '正在存储----%s'  % ztitle
                 mysql.addchapters(lastrowid,ztitle,content)


3、执行脚本

wKioL1kpO_SwfYOdAAHAvlowP2k275.png


4、查看数据库

wKioL1kpRJ7hsGI_AABKvJGXbtY583.png


wKioL1kpRKvyQVNUAAEwW-UKPY8568.png

可以看到已经存储成功了





报错:

_mysql_exceptions.OperationalError: (1364, "Field 'novelid' doesn't have a default value")


解决:执行sql语句

SELECT @@GLOBAL.sql_mode;

SET @@GLOBAL.sql_mode="NO_ENGINE_SUBSTITUTION";


wKioL1kpPCXjTHm5AABPJKISpZs573.png



报错参考:http://blog.sina.com.cn/s/blog_6d2b3e4901011j9w.html






      本文转自M四月天 51CTO博客,原文链接:http://blog.51cto.com/msiyuetian/1931102,如需转载请自行联系原作者






相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
9天前
|
数据采集 Python
【python】爬虫-西安医学院-校长信箱
本文以西安医学院-校长信箱为基础来展示爬虫案例。来介绍python爬虫。
【python】爬虫-西安医学院-校长信箱
|
20天前
|
缓存 NoSQL 关系型数据库
在Python Web开发过程中:数据库与缓存,MySQL和NoSQL数据库的主要差异是什么?
MySQL是关系型DB,依赖预定义的表格结构,适合结构化数据和复杂查询,但扩展性有限。NoSQL提供灵活的非结构化数据存储(如JSON),无统一查询语言,但能横向扩展,适用于大规模、高并发场景。选择取决于应用需求和扩展策略。
110 1
|
16天前
|
数据采集 安全 Python
python并发编程:Python实现生产者消费者爬虫
python并发编程:Python实现生产者消费者爬虫
23 0
python并发编程:Python实现生产者消费者爬虫
|
27天前
|
数据采集 数据挖掘 调度
异步爬虫实践攻略:利用Python Aiohttp框架实现高效数据抓取
本文介绍了如何使用Python的Aiohttp框架构建异步爬虫,以提升数据抓取效率。异步爬虫利用异步IO和协程技术,在等待响应时执行其他任务,提高效率。Aiohttp是一个高效的异步HTTP客户端/服务器框架,适合构建此类爬虫。文中还展示了如何通过代理访问HTTPS网页的示例代码,并以爬取微信公众号文章为例,说明了实际应用中的步骤。
|
4天前
|
SQL 关系型数据库 数据库
Python中SQLite数据库操作详解:利用sqlite3模块
【4月更文挑战第13天】在Python编程中,SQLite数据库是一个轻量级的关系型数据库管理系统,它包含在一个单一的文件内,不需要一个单独的服务器进程或操作系统级别的配置。由于其简单易用和高效性,SQLite经常作为应用程序的本地数据库解决方案。Python的内置sqlite3模块提供了与SQLite数据库交互的接口,使得在Python中操作SQLite数据库变得非常容易。
|
6天前
|
存储 SQL Oracle
【Oracle】玩转Oracle数据库(二):体系结构、存储结构与各类参数
【Oracle】玩转Oracle数据库(二):体系结构、存储结构与各类参数
31 7
|
10天前
|
数据采集 存储 前端开发
Python爬虫如何快速入门
写了几篇网络爬虫的博文后,有网友留言问Python爬虫如何入门?今天就来了解一下什么是爬虫,如何快速的上手Python爬虫。
17 0
|
14天前
|
数据库 存储 BI
SAP ABAP CDS View 源代码存储的数据库表揭秘和其他相关数据库表介绍试读版
SAP ABAP CDS View 源代码存储的数据库表揭秘和其他相关数据库表介绍试读版
10 0
SAP ABAP CDS View 源代码存储的数据库表揭秘和其他相关数据库表介绍试读版
|
23天前
|
数据采集 存储 Web App开发
一键实现数据采集和存储:Python爬虫、Pandas和Excel的应用技巧
一键实现数据采集和存储:Python爬虫、Pandas和Excel的应用技巧
|
24天前
|
存储 SQL 数据库
C# 将 Word 转文本存储到数据库并进行管理
C# 将 Word 转文本存储到数据库并进行管理