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
相关文章
|
17天前
|
数据采集 Python
【python】爬虫-西安医学院-校长信箱
本文以西安医学院-校长信箱为基础来展示爬虫案例。来介绍python爬虫。
【python】爬虫-西安医学院-校长信箱
|
3天前
|
数据采集 存储 JSON
Python爬虫面试:requests、BeautifulSoup与Scrapy详解
【4月更文挑战第19天】本文聚焦于Python爬虫面试中的核心库——requests、BeautifulSoup和Scrapy。讲解了它们的常见问题、易错点及应对策略。对于requests,强调了异常处理、代理设置和请求重试;BeautifulSoup部分提到选择器使用、动态内容处理和解析效率优化;而Scrapy则关注项目架构、数据存储和分布式爬虫。通过实例代码,帮助读者深化理解并提升面试表现。
13 0
|
6天前
|
数据采集 JavaScript 前端开发
使用Python打造爬虫程序之破茧而出:Python爬虫遭遇反爬虫机制及应对策略
【4月更文挑战第19天】本文探讨了Python爬虫应对反爬虫机制的策略。常见的反爬虫机制包括User-Agent检测、IP限制、动态加载内容、验证码验证和Cookie跟踪。应对策略包括设置合理User-Agent、使用代理IP、处理动态加载内容、验证码识别及维护Cookie。此外,还提到高级策略如降低请求频率、模拟人类行为、分布式爬虫和学习网站规则。开发者需不断学习新策略,同时遵守规则和法律法规,确保爬虫的稳定性和合法性。
|
6天前
|
存储 关系型数据库 MySQL
Python搭建代理IP池实现存储IP的方法
Python搭建代理IP池实现存储IP的方法
|
7天前
|
存储 关系型数据库 MySQL
如何处理爬取到的数据,例如存储到数据库或文件中?
处理爬取的数据,可存储为txt、csv(适合表格数据)或json(适合结构化数据)文件。若需存储大量数据并执行复杂查询,可选择关系型(如MySQL)或非关系型(如MongoDB)数据库。以MySQL为例,需安装数据库和Python的pymysql库,创建数据库和表,然后编写Python代码进行数据操作。选择存储方式应考虑数据类型、数量及后续处理需求。
15 1
|
14天前
|
存储 SQL Oracle
【Oracle】玩转Oracle数据库(二):体系结构、存储结构与各类参数
【Oracle】玩转Oracle数据库(二):体系结构、存储结构与各类参数
35 7
|
17天前
|
数据采集 存储 前端开发
Python爬虫如何快速入门
写了几篇网络爬虫的博文后,有网友留言问Python爬虫如何入门?今天就来了解一下什么是爬虫,如何快速的上手Python爬虫。
21 0
|
1月前
|
数据采集 JSON 数据格式
python爬虫之app爬取-charles的使用
charles 基本原理,charles抓包,分析,重发。
54 0
|
2月前
|
数据采集 存储 架构师
上进计划 | Python爬虫经典实战项目——电商数据爬取!
在如今这个网购风云从不间歇的时代,购物狂欢持续不断,一年一度的“6.18年中大促”、“11.11购物节”等等成为了网购电商平台的盛宴。在买买买的同时,“如何省钱?”成为了大家最关心的问题。 比价、返利、优惠券都是消费者在网购时的刚需,但在这些“优惠”背后已产生灰色地带。
|
4月前
|
数据采集 Python
Python爬虫:实现爬取、下载网站数据的几种方法
Python爬虫:实现爬取、下载网站数据的几种方法
201 1

热门文章

最新文章