All Projects → hahaha108 → Copybook

hahaha108 / Copybook

用爬虫爬取小说网站上所有小说,存储到数据库中,并用爬到的数据构建自己的小说网站

Programming Languages

python
139335 projects - #7 most used programming language

Projects that are alternatives of or similar to Copybook

Funpyspidersearchengine
Word2vec 千人千面 个性化搜索 + Scrapy2.3.0(爬取数据) + ElasticSearch7.9.1(存储数据并提供对外Restful API) + Django3.1.1 搜索
Stars: ✭ 782 (+568.38%)
Mutual labels:  spider, scrapy, django
Django Dynamic Scraper
Creating Scrapy scrapers via the Django admin interface
Stars: ✭ 1,024 (+775.21%)
Mutual labels:  spider, scrapy, django
Seeker
Seeker - another job board aggregator.
Stars: ✭ 16 (-86.32%)
Mutual labels:  spider, scrapy, django
Py Elasticsearch Django
基于python语言开发的千万级别搜索引擎
Stars: ✭ 207 (+76.92%)
Mutual labels:  spider, scrapy, django
Python Spider
豆瓣电影top250、斗鱼爬取json数据以及爬取美女图片、淘宝、有缘、CrawlSpider爬取红娘网相亲人的部分基本信息以及红娘网分布式爬取和存储redis、爬虫小demo、Selenium、爬取多点、django开发接口、爬取有缘网信息、模拟知乎登录、模拟github登录、模拟图虫网登录、爬取多点商城整站数据、爬取微信公众号历史文章、爬取微信群或者微信好友分享的文章、itchat监听指定微信公众号分享的文章
Stars: ✭ 615 (+425.64%)
Mutual labels:  spider, scrapy, django
Gerapy
Distributed Crawler Management Framework Based on Scrapy, Scrapyd, Django and Vue.js
Stars: ✭ 2,601 (+2123.08%)
Mutual labels:  spider, scrapy, django
Icrawler
A multi-thread crawler framework with many builtin image crawlers provided.
Stars: ✭ 629 (+437.61%)
Mutual labels:  spider, scrapy
Mailinglistscraper
A python web scraper for public email lists.
Stars: ✭ 19 (-83.76%)
Mutual labels:  spider, scrapy
App comments spider
爬取百度贴吧、TapTap、appstore、微博官方博主上的游戏评论(基于redis_scrapy),过滤器采用了bloomfilter。
Stars: ✭ 38 (-67.52%)
Mutual labels:  spider, scrapy
Reptile
🏀 Python3 网络爬虫实战(部分含详细教程)猫眼 腾讯视频 豆瓣 研招网 微博 笔趣阁小说 百度热点 B站 CSDN 网易云阅读 阿里文学 百度股票 今日头条 微信公众号 网易云音乐 拉勾 有道 unsplash 实习僧 汽车之家 英雄联盟盒子 大众点评 链家 LPL赛程 台风 梦幻西游、阴阳师藏宝阁 天气 牛客网 百度文库 睡前故事 知乎 Wish
Stars: ✭ 1,048 (+795.73%)
Mutual labels:  spider, scrapy
Fbcrawl
A Facebook crawler
Stars: ✭ 536 (+358.12%)
Mutual labels:  spider, scrapy
Crawlab
Distributed web crawler admin platform for spiders management regardless of languages and frameworks. 分布式爬虫管理平台,支持任何语言和框架
Stars: ✭ 8,392 (+7072.65%)
Mutual labels:  spider, scrapy
Awesome Python Primer
自学入门 Python 优质中文资源索引,包含 书籍 / 文档 / 视频,适用于 爬虫 / Web / 数据分析 / 机器学习 方向
Stars: ✭ 57 (-51.28%)
Mutual labels:  spider, django
Jspider
JSpider会每周更新至少一个网站的JS解密方式,欢迎 Star,交流微信:13298307816
Stars: ✭ 914 (+681.2%)
Mutual labels:  spider, scrapy
Capturer
capture pictures from website like sina, lofter, huaban and so on
Stars: ✭ 76 (-35.04%)
Mutual labels:  spider, scrapy
Image Downloader
Download images from Google, Bing, Baidu. 谷歌、百度、必应图片下载.
Stars: ✭ 1,173 (+902.56%)
Mutual labels:  spider, scrapy
Maria Quiteria
Backend para coleta e disponibilização dos dados 📜
Stars: ✭ 115 (-1.71%)
Mutual labels:  scrapy, django
Hive
lots of spider (很多爬虫)
Stars: ✭ 110 (-5.98%)
Mutual labels:  spider, scrapy
Elves
🎊 Design and implement of lightweight crawler framework.
Stars: ✭ 315 (+169.23%)
Mutual labels:  spider, scrapy
Haipproxy
💖 High available distributed ip proxy pool, powerd by Scrapy and Redis
Stars: ✭ 4,993 (+4167.52%)
Mutual labels:  spider, scrapy

copyBook

嘻嘻,这个网站内容好像挺有意思,不过,下一秒它们就是我的了


一、用到的技术:

运行环境:python3.6
爬虫框架:scrapy
数据库:sqlite
web框架:Django,bootstrap
安装依赖:
python -m pip install scrapy
python -m pip install django
python -m pip install Pillow

运行方式:

启动爬虫

cd bookspider

python start.py

启动网站

cd djangotest

python manage.py migrate

python manage.py runserver

http://127.0.0.1:8000/index

二、数据模型建立:

本项目数据库表使用Django数据库迁移命令自动生成,为了保证爬虫爬取到的数据可以用于自己的Web项目,因此定义的scrapy中item和Django中的数据模型必须存在一定的对应关系,具体如下:

Book表:

class Book(models.Model):

	#title对应item中的bookName
    title = models.CharField(max_length=80, verbose_name='书名')

	#cover对应item中的cover
    cover = models.ImageField(upload_to='cover/',verbose_name='封面')

	#author对应item中的author
    author = models.CharField(max_length=50, verbose_name='作者')

	#intror对应item中的intro
    intro = models.TextField(verbose_name='简介')

	#外键关联tag,对应category
    tag = models.ForeignKey('Tag',verbose_name='标签')

Chapter表:

class Chapter(models.Model):

	#number对应item的number
    number = models.IntegerField(verbose_name='章节号')

	#title对应item的chapterName
    title = models.CharField(max_length=50,verbose_name='章节名')

	#content对应item的chapterContent
    content = models.TextField(verbose_name='内容')

	#外键关联book表
    book = models.ForeignKey('Book',verbose_name='书名')

Tag表:

class Tag(models.Model):

	#Tag其实就是item中的category,因此tagname对应categoryName
    tagname = models.CharField(max_length=30,verbose_name='标签名')

对应关系搞好了后,爬虫下载下来的数据便可以直接用于自身web项目,无需多做别的操作。

三、爬虫主逻辑:

爬虫基本是直接移植了我之前写的全书网爬虫,主要业务逻辑没变,只是将最后分类存储为txt文本改变为存储到数据库,完善了部分代码,加入了文章简介、作者信息的提取。

class QuanshuwangSpider(scrapy.Spider):
    name = 'quanshuwang'
    allowed_domains = ['quanshuwang.com']
    start_urls = ['http://quanshuwang.com/']

    def parse(self, response):
		#提取网页上每个分类
        categorys = response.xpath("//ul[@class='channel-nav-list']/li/a")
		
		#循环遍历每个分类
        for category in categorys:
			#获取分类url链接
            categoryUrl = category.xpath("./@href").extract()[0]
			#获取分类名称
            categoryName = category.xpath("./text()").extract()[0]
			#传递
            yield scrapy.Request(categoryUrl,meta={"categoryName":categoryName},callback=self.getNext)

以上代码功能为提取网站各分类信息:

提取到各分类信息后,记录下分类的名称,然后循环遍历各分类,getNext方法用于遍历每个分类下的所有子页面,并提取所有书本的url

    def getNext(self,response):
		#接收上面传过来的类别名称
        categoryName = response.meta["categoryName"]
		#获取下一页url
        nextUrl = response.xpath("//a[@class='next']/@href").extract()[0]
		#获取当前页面上所有图书的url
        urls = response.xpath("//ul[@class='seeWell cf']/li/span/a[1]/@href").extract()
        for url in urls:
            yield scrapy.Request(url,meta={"categoryName":categoryName},callback=self.getBooks)
		#递归终止条件:不存在下一页则结束
        if not response.xpath("//a[@class='next']/@href").extract():
            pass
        else:
			#若存在下一页则调用自己,继续提取下一页
            yield scrapy.Request(nextUrl,meta={"categoryName":categoryName},callback=self.getNext)


接下来用getBooks方法爬取每本图书的详情页,利用xpath可以很方便的提取到书名,作者,简介,封面图片等各类信息:

    def getBooks(self,response):
		#接收参数
        categoryName = response.meta["categoryName"]
		#xpath提取各类信息
        bookName = response.xpath("//div[@class='b-info']/h1/text()").extract()[0]
        bookUrl = response.xpath("//div[@class='b-oper']/a[@class='reader']/@href").extract()[0]
        author = response.xpath("//div[@class='bookDetail']/dl[@class='bookso']/dd[1]/text()").extract()[0].strip()
        intro = response.xpath("//div[@id='waa']/text()").extract()[0].strip()
        imgUrl = response.xpath("//a[@class='l mr11']/img/@src").extract()[0]

		#保存封面图片(应该写在pipelines.py里面的,为了方便就直接写这里了)
        filename = bookName + '.jpg'
        dirpath = './cover'
        if not os.path.exists(dirpath):
            os.makedirs(dirpath)
        filepath = os.path.join(dirpath, filename)
        urllib.request.urlretrieve(imgUrl, filepath)
        cover = 'cover/' + filename

        # 继续下一个页面
        yield scrapy.Request(bookUrl,meta={"categoryName":categoryName,
                                           'bookName':bookName,
                                           'bookUrl':bookUrl,
                                           'author':author,
                                           'intro':intro,
                                           'cover':cover
                                           },callback=self.getChapter)


getChapter方法用于提取书本各章节的顺序以及名称等信息,并获取到所有章节内容对应的url

    def getChapter(self,response):
		#接收参数
        categoryName = response.meta["categoryName"]
        bookName = response.meta["bookName"]
        bookUrl = response.meta["bookUrl"]
        author = response.meta["author"]
        intro = response.meta["intro"]
        cover = response.meta["cover"]

		#提取页面上所有章节
        chapters = response.xpath("//div[@class='clearfix dirconone']//li/a")
		#number用于记录章节顺序,防止错位
        number = 0

		#循环遍历每个章节
        for chapter in chapters:
            number += 1
			#获取章节名称、url
            chapterName = chapter.xpath("./text()").extract()[0]
            chapterUrl = chapter.xpath("./@href").extract()[0]


			#继续传递
            yield scrapy.Request(chapterUrl,meta={
                'categoryName':categoryName,
                'bookName': bookName,
                'bookUrl': bookUrl,
                'chapterName': chapterName,
                'chapterUrl': chapterUrl,
                'author': author,
                'intro': intro,
                'cover': cover,
                'number':number
            },callback=self.getContent)


getContent方法为提取信息的最后一步,这一步可以获取到章节的详细内容,生成并返回item

    def getContent(self,response):
		#接收传过来的参数
        categoryName = response.meta["categoryName"]
        bookName = response.meta["bookName"]
        bookUrl = response.meta["bookUrl"]
        chapterName = response.meta["chapterName"]
        chapterUrl = response.meta["chapterUrl"]
        author = response.meta["author"]
        intro = response.meta["intro"]
        cover = response.meta["cover"]
        number = response.meta["number"]

		#提取章节的文本内容并调整格式
        chapterContent = "".join(response.xpath("//div[@id='content']/text()").extract())
        chapterContent = chapterContent.replace(r'''
''',"<br>")
        chapterContent = chapterContent.replace(r" ", "&nbsp")

		#生成并返回item
        item = BookSpiderItem()
        item["categoryName"] = categoryName
        item["bookName"] = bookName
        item["bookUrl"] = bookUrl
        item["chapterName"] = chapterName
        item["chapterUrl"] = chapterUrl
        item["chapterContent"] = chapterContent
        item["author"] = author
        item["intro"] = intro
        item["cover"] = cover
        item["number"] = number

        return item

至此爬虫的主要代码已经基本写完了,剩下的就是信息存储到数据库的各种sql语句了,若程序执行时间够久,理论上可以爬取到此网站上的全部书本。

四、Django图书网站:

在上述爬虫爬取到数据之后,便可以直接将存有数据的数据库移动到Django项目中,从而达到建立自己的图书网站的目的。 本次使用了Django官方推荐的通用视图类,网站主要分为三个页面:主页(IndexView)、图书详情页(BookView)以及章节详情页(ChapterView),前端模板页面使用了bootstrap框架,整个网站风格比较简洁,运行效果如下:

  • 主页:

  • 图书详情页:

  • 章节详情页:

一个专属的,没有广告的图书网站就诞生了。→_→
Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].