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

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介:

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


第一步:先获取小说内容

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,如需转载请自行联系原作者






相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
2天前
|
数据采集 存储 XML
构建高效的Python爬虫系统
【9月更文挑战第30天】在数据驱动的时代,掌握如何快速高效地获取网络信息变得至关重要。本文将引导读者了解如何构建一个高效的Python爬虫系统,从基础概念出发,逐步深入到高级技巧和最佳实践。我们将探索如何使用Python的强大库如BeautifulSoup和Scrapy,以及如何应对反爬措施和提升爬取效率的策略。无论你是初学者还是有经验的开发者,这篇文章都将为你提供宝贵的知识和技能,帮助你在信息收集的海洋中航行得更远、更深。
14 6
|
1天前
|
数据采集 数据挖掘 数据处理
Python中实现简单爬虫并处理数据
【9月更文挑战第31天】本文将引导读者理解如何通过Python创建一个简单的网络爬虫,并展示如何处理爬取的数据。我们将讨论爬虫的基本原理、使用requests和BeautifulSoup库进行网页抓取的方法,以及如何使用pandas对数据进行清洗和分析。文章旨在为初学者提供一个易于理解的实践指南,帮助他们快速掌握网络数据抓取的基本技能。
9 3
|
3天前
|
数据采集 关系型数据库 MySQL
如何用Python+sqlalchemy创建数据库
如何用Python+sqlalchemy创建数据库
12 2
|
5天前
|
数据采集 JSON 数据格式
Python:南京地铁每日客流数据的爬虫实现
Python:南京地铁每日客流数据的爬虫实现
14 1
|
3天前
|
数据采集 Linux 网络安全
python 爬虫遇到的aiohttp证书错误解决办法
python 爬虫遇到的aiohttp证书错误解决办法
12 0
|
5天前
|
关系型数据库 MySQL 数据管理
pymysql:Python操作MySQL数据库的又一利器
pymysql:Python操作MySQL数据库的又一利器
11 0
|
16天前
|
NoSQL 关系型数据库 MySQL
微服务架构下的数据库选择:MySQL、PostgreSQL 还是 NoSQL?
在微服务架构中,数据库的选择至关重要。不同类型的数据库适用于不同的需求和场景。在本文章中,我们将深入探讨传统的关系型数据库(如 MySQL 和 PostgreSQL)与现代 NoSQL 数据库的优劣势,并分析在微服务架构下的最佳实践。
|
18天前
|
存储 SQL 关系型数据库
使用MySQL Workbench进行数据库备份
【9月更文挑战第13天】以下是使用MySQL Workbench进行数据库备份的步骤:启动软件后,通过“Database”菜单中的“管理连接”选项配置并选择要备份的数据库。随后,选择“数据导出”,确认导出的数据库及格式(推荐SQL格式),设置存储路径,点击“开始导出”。完成后,可在指定路径找到备份文件,建议定期备份并存储于安全位置。
154 11
|
2月前
|
弹性计算 关系型数据库 数据库
手把手带你从自建 MySQL 迁移到云数据库,一步就能脱胎换骨
阿里云瑶池数据库来开课啦!自建数据库迁移至云数据库 RDS原来只要一步操作就能搞定!点击阅读原文完成实验就可获得一本日历哦~
|
13天前
|
存储 SQL 关系型数据库
MySQL的安装&数据库的简单操作
本文介绍了数据库的基本概念及MySQL的安装配置。首先解释了数据库、数据库管理系统和SQL的概念,接着详细描述了MySQL的安装步骤及其全局配置文件my.ini的调整方法。文章还介绍了如何启动MySQL服务,包括配置环境变量和使用命令行的方法。最后,详细说明了数据库的各种操作,如创建、选择和删除数据库的SQL语句,并提供了实际操作示例。
56 13
MySQL的安装&数据库的简单操作
下一篇
无影云桌面