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

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

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

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

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

# -*- coding: UTF-8 -*-
#!/usr/bin/env python
#-------------------------------------------------------------------------------
# Name:        Mir_LongZd
# Purpose:
# 操作数据库帮助类
# Author:      Long



import pymysql
import  sqlite3

class 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:      Long

import  requests
from bs4 import BeautifulSoup

class 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:      Long

import  requests  #导入模块
from bs4 import  BeautifulSoup
import  datetime
from  Helper.RequestHe import  RequestHelper  #导入帮助类
import  uuid #guid
from 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数据库

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





















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值