python小爬虫1-夜不语档案

/ python / 没有评论 / 154浏览

python

python作为一个脚本语言,还是可以很方便的处理一些日常需求。由于我不是专业的python研发人员,所以可能理解的不深,一般请夸下,都是将python作为一个工具语言来使用。这次文章主要是介绍下基本的东西,还有我一个小需求,爬 夜不语诡异档案的小说内容,然后做个小程序给我自己使用

1.安装和升级

一般linux系统和mac系统都会安装python,但是版本可能有些古老,所以我们可以安装较新的版本,而且可以和老版本共存。

几个简单的命令可以查看下python的版本和安装情况

rpm -qa |grep python 

rpm -ql python[具体的名字]

rpm -qi python[具体的名字]

首先,下载和编译python的安装包,我选择的是3.5.2版本

wget https://www.python.org/ftp/python/3.5.2/Python-3.5.2.tgz

tar -zxvf Python-3.5.2.tgz

cd Python-3.5.2

./configure --prefix=/usr/local/python3.5.2

make 

make install

如果缺少什么库或者缺少make的话,自己安装吧

默认安装后,bash的python仍然是老的版本,可以自己建立软连接覆盖旧的的软链。但是如果以前的bin下的并不是软链的话,就需要注意了。尽量不要覆盖否则依赖python2的脚本将服务发使用了。例如:yum

ln -s /usr/local/python3.5.2/python3 /usr/bin/python

2.第三方库的管理

python 安装时会默认安装pip工具。但是我们使用的是python3.5.2的pip/所以使用的使用需要带上绝对路径

/usr/local/python3.5.2/bin/pip3 install --upgrade pip //升级一下pip

然后就可以使用pip安装第三方的库了。安装库的位置一般是

/usr/local/python3.5.2/lib/python3.5/site-packages

TIP:

为了方便使用自己安装的python和pip可以建一个软链到bin下

ln -s /usr/local/python3.5.2/bin/python3  /usr/bin/python3
ln -s /usr/local/python3.5.2/bin/pip3  /usr/bin/pip3

小说爬虫脚本~

前言

由于我喜欢看,夜不语诡异档案小说,但是网上不太好,只在某个网站上有连载的,而且应该是手打的,所以我就想写个爬虫,把小说全部爬下来,弄个小程序来看。

由于没有用过python所以借鉴下了路远的博客的内容,万分感谢!

我要抓取的网站是隐藏起来。所以整个抓取的思路很简单。首先通过目录页获取所有小说章节的url地址,然后分别抓取每个章节的html内容,通过分析,转换,加载获取小说的内容,并分别保存到文本中就可以了,以后在弄个小程序的服务,加载到手机里就ok了。

使用到的python 库大概有正则表达,urllib,Beautiful Soup。基本就够用了 代码地址是传送带

抓取目录和章节

由于细节比较多,所以着重挑几个重点说下,其他的细节可以直接看我的代码

由于抓取的是网页,所以需要对页面内容进行解析,定位好章节内容的html标签,组织形式等等,然后使用Beautiful Soup进行内容的提取

获取章节内容
class YebuyuChapterResolve(ResolveEngine):

    def __init__(self, content):
        super().__init__(content)

    def execute(self):
        content = self.soup.select(".yd_text2")[0]
        contents = list()
        for tag in content.children:
            if isinstance(tag, NavigableString):
                str = tag.string.replace("\r\n", "").replace("\xa0", "").strip()
                if str != "":
                    contents.append("   " + str)
        return contents

content即是整个html内容,通过soup的select的定位章节的内容节点,然后清洗一下数据格式和内容。

获取章节目录
class YebuyuMuLuResolve(ResolveEngine):

    def __init__(self, content):
        super().__init__(content)

    def execute(self):
        chapters = list()
        mulu = self.soup.select(".mulu > ul li a")
        for index, child in enumerate(mulu):
            title = child.string.strip().replace(" ", "")
            title = convert_num(title)
            titles = title.split(".")
            if len(titles) == 3:
                title = titles[1] + "." + titles[2]
            elif len(titles) == 2:
                title = titles[0] + "." + titles[1]
            else:
                pass
            chapters.append(UrlChapter(__baseUrl__ + child.get('href'), title, index))
        return chapters

获取章节目录的方式和章节的内容基本一样,需要对格式进行专门的处理。我这里主要是处理了下汉子的数子,还有格式等。章节的顺序也是按照节点的顺序作为判定的


控制小说章节版本

由于小说采取的是抓取模式,所以对于抓取小说的更新,上次抓取章节失败,章节标题不可控等众多等问题,比较琐碎。所以决定使用数据库存储上次抓取章节过程的设计。

表设计

由于是脚本,所以一切从简,怎么方便怎么来。

1534324498884.jpg

设计思路

简单来说就只有三个步骤!

  1. 抓取小说所有章节title和url地址信息

  2. 和数据库章节chapter数据对比,找出上次抓取章节失败和本次抓取更新的章节信息。

  3. 对本次需要抓取的章节信息进行抓取工作,同时持久化到数据库

    • 第一个步骤 这步,需要存入小说基本信息,同时抓取出所有目前网站的章节目录(上面已经消息说过了)

    • 对比数据库数据 这步是对版本进行控制的主要内容。根据抓取网页的最新章节信息,获取数据库存入的信息,如果本条章节不存在,则认为是新的章节信息,如果章节存在,但是章节状态不对,那么认为该章节为需要重新抓取的章节信息。整合这两部分的章节信息。

    • 最后一步 根据上部整合的章节信息,进行抓取工作并存入数据库

具体内容可以看代码


整理抓取模版,通用抓取代码

后续中...

ISSUES

因为,pymysql的execute有独占锁机制,所以需要在多线程操作数据库的时候,对connection锁

一般调用decode()函数都是decode('gbk'),此时隐含的另一个参数是'strict',即出现解码错误即抛出UnicodeError错误;这里使用参数'ignore',即出现解码错误直接忽略,不抛出任何异常。实际上还可以设置为'replace',即对解码出错的地方进行替换。