使用Python爬取笔趣阁小说列表并添加到

来源:互联网 发布:光盘直接复制数据 编辑:程序博客网 时间:2024/06/04 18:48

1:首先需要安装爬虫所需要的第三方库

  • requests
  • BeautifulSoup
  • pymysql或者sqllit3(安装python自带)
  • lxml 解析器

2:安装完之后接下来是代码部分:

首先新建一个sql帮助类 SqlServerHelper.py

# -*- coding: UTF-8 -*-#!/usr/bin/env python#-------------------------------------------------------------------------------# Name:        Mir_LongZd# Purpose:# 操作数据库帮助类# Author:      Longimport pymysqlimport  sqlite3class MSSQL:    """    初始化数据库    """    def __init__(self,host,user,pwd,db):        self.host=host        self.user=user        self.pwd=pwd        self.db=db    """    获取connection    """    def __GetConnect(self):        if not  self.db:            raise (NameError,"没有设置数据库信息")        self.conn=pymysql.connect(host=self.host,user=self.user,password=self.pwd,database=self.db,charset="utf8")        cur = self.conn.cursor()        if not cur:            raise(NameError,"连接数据库失败")        else:            return cur    def ExecQuery(self,sql):        cur = self.__GetConnect()        cur.execute(sql)        resList = cur.fetchall()        #查询完毕后必须关闭连接        self.conn.close()        return resList    def ExecNonQuery(self,sql):        cur = self.__GetConnect()        cur.execute(sql)        self.conn.commit()        self.conn.close()"""sqllit3操作数据库"""class SQLLIT:    def __init__(self,dbpath):        self.dbpath=dbpath    def __Getcontent(self):        if str(self.dbpath)=="" or self.dbpath is None:            raise (NameError,"没有数据库")        else:            self.conn=sqlite3.connect(self.dbpath)            self.cu=self.conn.cursor()            if not self.cu:                raise(NameError,"连接数据库失败")            else:               return self.cu    #    #查    #    def GetList(self,sql):        cur = self.__Getcontent()        cur.execute(sql)        resList = cur.fetchall()        #查询完毕后必须关闭连接        self.conn.close()        return resList    #    #增删改    #    def ExecNonQuery(self,sql):        cur = self.__Getcontent()        cur.execute(sql)        self.conn.commit()        self.conn.close()

然后我们在建一个发起请求的帮助类

# -*- coding: UTF-8 -*-#!/usr/bin/env python#-------------------------------------------------------------------------------# Name:        Mir_LongZd# Purpose:# 爬取网页帮助类# Author:      Longimport  requestsfrom bs4 import BeautifulSoupclass RequestHelper:    def __init__(self,url,encoding):        if url is not None and str(url)!="":          self.wb_data=requests.get(url)          self.wb_data.encoding=encoding        else:            raise (NameError,"请输入爬取地址")    def GetContent(self,select):        self.soup=BeautifulSoup(self.wb_data.text,'lxml')        self.select_data=self.soup.select(select)        return self.select_data


我们先看下笔趣阁网站 ,分析下网页




这里我们只爬取这些列表
f12可以看到文章名和作者所在的层级,找到元素之后我们就可以用代码实现爬取了









# -*- coding: UTF-8 -*-#!/usr/bin/env python#-------------------------------------------------------------------------------# Name:        Mir_LongZd# Purpose:# 爬取笔趣阁小说网站# Author:      Longimport  requests  #导入模块from bs4 import  BeautifulSoupimport  datetimefrom  Helper.RequestHe import  RequestHelper  #导入帮助类import  uuid #guidfrom Helper.SqlServerHelper import SQLLIT  #导入数据库帮助类url="http://www.biquzi.com/xuanhuan/" #发起请求 笔趣阁网站wb_data=RequestHelper(url,"gbk")href_data=wb_data.GetContent("#newscontent .l li .s2 a")#获取书名集合au_data=wb_data.GetContent("#newscontent .l li .s5")#获取作者au_href=[]novellist=[]#存储文章章节列表for h,a in zip(href_data,au_data):#循环获取的书名和作者    getdata={        'guid':str(uuid.uuid1()),        'href':h.get("href"),        'title':h.string,        'author':a.string    }    au_href.append(getdata) #将字典加入到列表中  便于后面操作    """    将循环的数据加入到数据库中    """"""  将循环的数据加入到数据库中 """for item in au_href:#遍历所有的小说    data=SQLLIT("C:\\Users\Mir_LongZd\\Documents\\py.db") #实例化数据库方法    t_url=item['href']    guid=item['guid']    selectsql="select count(1) FROM novel WHERE ID='"+guid+"' and title='"+item['title']+"' "    count=tuple(data.GetList(selectsql)) #data.GetList(selectsql)返回的是一个元组    if count[0][0]>0:#判断是否存在次记录,不存在则添加        print(count[0][0])        print("大于0")        print(len(data.GetList(selectsql)))    else:        insertsql="insert INTO novel VALUES('"+guid+"','"+item['title']+"','"+item['author']+"','"+t_url+"') "        data.ExecNonQuery(insertsql) #执行数据添加操作        """        根据当前的小说连接发起requests请求,抓取该小说对应的章节        """    t_data=RequestHelper(t_url,"gbk")    soup=t_data.GetContent("#list dd a")    for item1 in soup:#遍历抓取的章节        href=item1.get("href")        title=item1.string        t_selectsql="select count(1) FROM novel_list WHERE pid='"+guid+"' and title='"+title+"' "        t_count=tuple(data.GetList(t_selectsql))        if t_count[0][0]>0:            print("大于0")        else:            t_insertsql="insert INTO novel_list VALUES('"+str(uuid.uuid1())+"','"+title+"','"+guid+"','"+href+"') "            data.ExecNonQuery(t_insertsql)#执行数据添加操作

执行完之后 等待  我们查看下sqllit数据库

可以看到数据已经添加进来了





















阅读全文
1 0
原创粉丝点击