爬虫练习-爬取小说

# 程序启动文件    start.py#!/usr/bin/python
# -*- coding: utf-8 -*-
import os, sys
BASEPATH = os.path.dirname(os.path.dirname(os.path.realpath(__file__)))
print(BASEPATH)
sys.path.append(BASEPATH)

from core import SpiderMan
if __name__ == ‘__main__‘:
    s=SpiderMan.SpiderMan()
    s.async()
# 爬虫调度器#!/usr/bin/python
# -*- coding: utf-8 -*-
from gevent import spawn,monkey,joinall;monkey.patch_all()
from concurrent.futures import ThreadPoolExecutor

from core.UrlManager import UrlManager
from core.Htmldown import Htmldown
from core.Htmlparser import Htmlparser
# from core.DataOutput import DataOutput

class SpiderMan:
    def __init__(self):
        self.manager=UrlManager()               #url管理
        self.downloader=Htmldown()              #HTML下载
        self.parser=Htmlparser()                #HTML解析
        # self.output=DataOutput()

    def index_work(self):
        ‘‘‘
        爬取凌霄主页
        ‘‘‘
        url = ‘http://www.lingxiaozhishang.com‘
        self.manager.oldurls.add(url)              #列表中添加每次传进来的url
        html_dict = self.downloader.down_page(url)     #下载器下载
        if html_dict is None:
            # raise print("爬取主页出错了")
            print("爬取主页出错了")
            return None

        new_urls = self.parser.parser_index(html_dict,url)       # 解析二层链接
        self.manager.add_urls(new_urls)                          # 所有的a标签存放的列表
        print("爬取 主页 + 所有文章url 完成")

    def async(self):
        ‘‘‘
        开启协程
        ‘‘‘
        self.index_work()
        pool = ThreadPoolExecutor(10)         # 开启十个线程池
        while True:
            url = self.manager.get_url()      # 从url管理器中获取url
            if url is None:
                break
            pool.submit(self.downloader.down_page,url).add_done_callback(self.parser.parser_page)   # 提交下载任务,解析
        pool.shutdown(wait=True)                    #最后得关闭线程池
        print("完了-----------------------")
# URL管理器#!/usr/bin/python
# -*- coding: utf-8 -*-
class UrlManager:
    def __init__(self):
        self.newurls=set()
        self.oldurls=set()

    def add_url(self,newurl):
        ‘‘‘
        添加小说章节的url
        :return:
        ‘‘‘
        if newurl not in self.oldurls:
            self.newurls.add(newurl)

    def add_urls(self,newurls):
        ‘‘‘
        添加多个小说章节的url
        :param newurls:
        :return:
        ‘‘‘
        if len(newurls)==0:return
        for url in newurls:
            self.add_url(url)

    def get_url(self):
        ‘‘‘
        取出一个小说章节的url
        :return:
        ‘‘‘
        try:
            url = self.newurls.pop()
            if url is not None:
                self.oldurls.add(url)
                return url
        except KeyError:
            pass

    def has_oldurls(self):
        ‘‘‘
        返回已爬小说章节的数量
        :return:
        ‘‘‘
        return len(self.oldurls)
# HTML下载器#!/usr/bin/python
# -*- coding: utf-8 -*-
import requests
class Htmldown:
    def  down_page(self,url):
        ‘‘‘
        下载网页内容
        ‘‘‘
        headers={‘User-Agent‘:‘Mozilla/5.0 (Windows NT 6.1; WOW64; rv:55.0) Gecko/20100101 Firefox/55.0‘}
        r=requests.get(url,headers=headers)
        r.encoding=‘utf8‘
        if r.status_code==200:
            return r.text
# HTML解析器      解析完直接存储到文件了,应该持久化到MongoDB中#!/usr/bin/python
# -*- coding: utf-8 -*-
from bs4 import BeautifulSoup

class Htmlparser:

    def parser_index(self,html_conf,url):
        soup = BeautifulSoup(html_conf, ‘html.parser‘)

        list_a = soup.find(class_="chapterlist").find_all(‘a‘)
        new_urls=[]
        for a in list_a:
            #url=http://www.lingxiaozhishang.com
            #/book/439.html
            new_url ="%s%s"%(url,a.attrs["href"])
            new_urls.append(new_url)
        return new_urls

    def parser_page(self,html_conf):
        ‘‘‘
        解析小说章节页面
        :param html_conf:
        :return:
        ‘‘‘
        html_conf =html_conf.result()
        soup=BeautifulSoup(html_conf,‘html.parser‘)
        title = soup.find(‘h1‘).get_text()
        text = soup.find(id="BookText").get_text()

        filepath = r"C:\Users\Administrator\Desktop\Article\db\%s.txt"%title
        with open(filepath,"w") as f:
            f.write(text)
        print("%s 下载完成"%title)

原文地址:https://www.cnblogs.com/52-qq/p/8343014.html

时间: 2024-08-30 07:44:51

爬虫练习-爬取小说的相关文章

Python实战项目网络爬虫 之 爬取小说吧小说正文

本次实战项目适合,有一定Python语法知识的小白学员.本人也是根据一些网上的资料,自己摸索编写的内容.有不明白的童鞋,欢迎提问. 目的:爬取百度小说吧中的原创小说<猎奇师>部分小说内容 链接:http://tieba.baidu.com/p/4792877734 首先,自己定义一个类,方便使用.其实类就像一个"水果篮",这个"水果篮"里有很多的"水果",也就是我们类里面定义的变量啊,函数啊等等,各种各样的.每一种"水果&q

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) Chrom

python2.7 爬虫_爬取小说盗墓笔记章节及URL并导入MySQL数据库_20161201

1.爬取页面 http://www.quanshu.net/book/9/9055/ 2.用到模块urllib(网页下载),re正则匹配取得title及titleurl,urlparse(拼接完整url),MySQLdb(导入MySQL) 数据库 3.for 循环遍历列表 取得盗墓笔记章节title 和 titleurl 4.try except 异常处理 5.python 代码 #-*-coding: utf-8 -*- import urllib import re import urlpa

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'

Golang 简单爬虫实现,爬取小说

为什么要使用Go写爬虫呢? 对于我而言,这仅仅是练习Golang的一种方式. 所以,我没有使用爬虫框架,虽然其很高效. 为什么我要写这篇文章? 将我在写爬虫时找到资料做一个总结,希望对于想使用Golang写爬虫的你能有一些帮助. 爬虫主要需要解决两个问题: 获取网页 解析网页 如果这两个都无法解决的话就没法再讨论其他了. 开发一个爬取小说网站的爬虫会是一个不错的实践. 这是两个实例: Golang 简单爬虫实现 golang 用/x/net/html写的小爬虫,爬小说 这是需要的两个项目: go

scrapy初探之实现爬取小说

一.前言 上文说明了scrapy框架的基础知识,本篇实现了爬取第九中文网的免费小说. 二.scrapy实例创建 1.创建项目 C:\Users\LENOVO\PycharmProjects\fullstack\book9>scrapy startproject book9 2.定义要爬取的字段(item.py) import scrapy class Book9Item(scrapy.Item): # define the fields for your item here like: # na

多线程爬取小说时如何保证章节的顺序

前言 爬取小说时,以每一个章节为一个线程进行爬取,如果不加以控制的话,保存的时候各个章节之间的顺序会乱掉. 当然,这里说的是一本小说保存为单个txt文件,如果以每个章节为一个txt文件,自然不会存在这种情况. 不仅仅是小说,一些其他的数据在多线程爬取时也有类似情况,比如: 漫画:漫画其实是由大量图片组成,一般一本漫画会保存为一个pdf文件,在此过程要保证图片的顺序. 视频:现在网络上的视频大部分是由多个ts文件拼合,最后保存为一个mp4文件,要保证ts文件的顺序. 它们都有一个共同的特点,那就是

[Python爬虫] Selenium爬取新浪微博客户端用户信息、热点话题及评论 (上)

一. 文章介绍 前一篇文章"[python爬虫] Selenium爬取新浪微博内容及用户信息"简单讲述了如何爬取新浪微博手机端用户信息和微博信息. 用户信息:包括用户ID.用户名.微博数.粉丝数.关注数等. 微博信息:包括转发或原创.点赞数.转发数.评论数.发布时间.微博内容等. 它主要通过从文本txt中读取用户id,通过"URL+用户ID" 访问个人网站,如柳岩: http://weibo.cn/guangxianliuya 因为手机端数据相对精简简单,所以采用输

用JAVA制作一个爬取商品信息的爬虫(爬取大众点评)

很多企业要求利用爬虫去爬取商品信息,一般的开发模型如下: for i=1;i<=最大页号;i++ 列表页面url=商品列表页面url+?page=i(页号) 列表页面=爬取(列表页面url) 商品链接列表=抽取商品链接(列表页面)  for 链接 in 商品链接列表: 商品页面=爬取(链接) 抽取(商品页面); 这样的模型看似简单,但是有一下几个问题: 1)爬虫没有线程池支持. 2)没有断点机制. 3)没有爬取状态存储,爬取商品网站经常会出现服务器拒绝链接(反问次数过多),导致一旦出现 拒绝链接