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

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

第一步:先获取小说内容

#!/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

执行后结果如下:

第二步:存储到数据库

1、设计数据库

1.1 新建库:novel

1.2 设计表:novel

1.3 设计表:chapter

并设置外键

2、编写脚本

#!/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、执行脚本

4、查看数据库

可以看到已经存储成功了。

报错:

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

解决:执行sql语句

SELECT @@GLOBAL.sql_mode;

SET @@GLOBAL.sql_mode="NO_ENGINE_SUBSTITUTION";

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

时间: 2025-01-14 09:31:22

Python爬虫:爬取小说并存储到数据库的相关文章

python爬虫——爬取小说 | 探索白子画和花千骨的爱恨情仇(转载)

转载出处:药少敏   ,感谢原作者清晰的讲解思路! 下述代码是我通过自己互联网搜索和拜读完此篇文章之后写出的具有同样效果的爬虫代码: 1 from bs4 import BeautifulSoup 2 import requests 3 4 if __name__ == '__main__': 5 html = requests.get('http://www.136book.com/huaqiangu/') 6 soup = BeautifulSoup(html.content, 'lxml'

用Python爬虫爬取广州大学教务系统的成绩(内网访问)

用Python爬虫爬取广州大学教务系统的成绩(内网访问) 在进行爬取前,首先要了解: 1.什么是CSS选择器? 每一条css样式定义由两部分组成,形式如下: [code] 选择器{样式} [/code] 在{}之前的部分就是"选择器"."选择器"指明了{}中的"样式"的作用对象,也就是"样式"作用于网页中的哪些元素.可参考:http://www.w3school.com.cn/cssref/css_selectors.asph

python爬虫—爬取英文名以及正则表达式的介绍

python爬虫—爬取英文名以及正则表达式的介绍 爬取英文名: 一.  爬虫模块详细设计 (1)整体思路 对于本次爬取英文名数据的爬虫实现,我的思路是先将A-Z所有英文名的连接爬取出来,保存在一个csv文件中:再读取csv文件当中的每个英文名链接,采用循环的方法读取每一个英文名链接,根据每个英文名链接爬取每个链接中的数据,保存在新的csv文件当中. 需要写一个爬取英文名链接的函数.将爬取的内容保存在csv文件的函数以及读取csv文件内容的函数.爬取英文名详情页内容的函数. 表5.3.1 函数名

python爬虫爬取微博评论案例详解

这篇文章主要介绍了python爬虫爬取微博评论,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 数据格式:{"name":评论人姓名,"comment_time":评论时间,"comment_info":评论内容,"comment_url":评论人的主页} 以上就是我们需要的信息. 具体操作流程: 我们首相将主页获取完成以后,我们就会发现,其中 的内容带有相

python爬虫爬取csdn博客专家所有博客内容

python爬虫爬取csdn博客专家所有博客内容: 全部过程采取自动识别与抓取,抓取结果是将一个博主的所有 文章存放在以其名字命名的文件内,代码如下 结果如下: 版权声明:本文为博主原创文章,未经博主允许不得转载.

python爬虫爬取美女图片

python 爬虫爬取美女图片 #coding=utf-8 import urllib import re import os import time import threading def getHtml(url): page = urllib.urlopen(url) html = page.read() return html def getImgUrl(html,src): srcre = re.compile(src) srclist = re.findall(srcre,html)

Python爬虫爬取博客园并保存

Python爬虫爬取博客园并保存        爬取博客园指定用户的文章修饰后全部保存到本地 首先定义爬取的模块文件: crawlers_main.py 执行入口 url_manager.py url管理器 download_manager.py 下载模块 parser_manager.py html解析器(解析html需要利用的内容) output_manager.py 输出html网页全部内容文件(包括css,png,js等) crawlers_main.py 执行入口 1 # coding

Python爬虫爬取数据的步骤

爬虫: 网络爬虫是捜索引擎抓取系统(Baidu.Google等)的重要组成部分.主要目的是将互联网上的网页下载到本地,形成一个互联网内容的镜像备份. 步骤: 第一步:获取网页链接 1.观察需要爬取的多网页的变化规律,基本上都是只有小部分有所变化,如:有的网页只有网址最后的数字在变化,则这种就可以通过变化数字将多个网页链接获取: 2.把获取得到的多个网页链接存入字典,充当一个临时数据库,在需要用时直接通过函数调用即可获得: 3.需要注意的是我们的爬取并不是随便什么网址都可以爬的,我们需要遵守我们的

Python爬虫爬取知乎小结

博客首发至Marcovaldo's blog (http://marcovaldong.github.io/) 最近学习了一点网络爬虫,并实现了使用python来爬取知乎的一些功能,这里做一个小的总结.网络爬虫是指通过一定的规则自动的从网上抓取一些信息的程序或脚本.我们知道机器学习和数据挖掘等都是从大量的数据出发,找到一些有价值有规律的东西,而爬虫则可以帮助我们解决获取数据难的问题,因此网络爬虫是我们应该掌握的一个技巧. python有很多开源工具包供我们使用,我这里使用了requests.Be