python晋江文学城数据分析(一)——爬虫(BeautifulSoup正则)

这篇具有很好参考价值的文章主要介绍了python晋江文学城数据分析(一)——爬虫(BeautifulSoup正则)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

0引言

学爬虫,拿平常看小说的绿色网站下手。

爬取的数据主要分为两部分,收藏榜的小说信息和小说详情页的部分数据。

1url解析

1.1收藏榜url

        通过点击榜单上侧选项(其实也可以用拼音猜一猜),观察url变化,寻找规律。如fw指代范围,fbsj指代发表时间,ycx指代原创性,以此类推。可以通过改变其后的数字,来改变榜单范围。而最重要的翻页就通过改变page=后的页码。

        我没什么要先定的范围,就只更改page。

2.1小说详情页url

        随意点击任意小说详情页,可以看到主要区别就在于最后novelid的一串数字,看起来没有什么规律的数字。

        但是通过后面的页面分析,可以看到小说详情页的url其实就包含在html中,只要记录下之后再转接即可。

2页面元素解析

2.1收藏榜

python晋江文学城数据分析(一)——爬虫(BeautifulSoup正则)

         鼠标右键查看审查元素,观察。

python晋江文学城数据分析(一)——爬虫(BeautifulSoup正则)

        可以看到,整个收藏榜信息均在一个table之内,一行是一个tr,每格是一个td。

<tr>
<td align="left">
<a href="oneauthor.php?authorid=966799" target="_blank">木苏里</a>
</td>
<td align="left">
<a href="onebook.php?novelid=3419133" target="_blank" title="简介:并肩炸考场
标签:强强 无限流 相爱相杀 未来架空">全球高考</a>
</td>
<td align="center">
         原创-纯爱-近代现代-剧情                                </td>
<td align="center">
           轻松                                </td>
<td align="center">
        <font color="red">完结</font>                                </td>
<td align="right">589514</td>
<td align="right">35908325376</td>
<td align="center">2018-10-10 20:03:00</td>
</tr>

        以第一部作品为例,按顺序,可以爬取到作者(木苏里)、作品详情页链接(oneauthor.php?authorid=966799)、简介+标签(简介:并肩炸考场
标签:强强 无限流 相爱相杀 未来架空)、作品(全球高考)、类型(原创-纯爱-近代现代-剧情)、风格(轻松)、进度(完结)、字数(589514)、作品积分(35908325376)、发表时间(2018/10/10 20:03:00)。

        整个表格都比较有规律,先findall tr,再根据html写出对应的正则compile。

2.2小说详情页

        详情页主要准备爬取三个地方:文案、文章基本信息、章节表格结尾数据

        1)文案

python晋江文学城数据分析(一)——爬虫(BeautifulSoup正则)

        2)作品视角、是否出版、签约状态

python晋江文学城数据分析(一)——爬虫(BeautifulSoup正则)

         3)总书评数、当前被收藏数、营养液数

python晋江文学城数据分析(一)——爬虫(BeautifulSoup正则)

         同样是查看审查元素,写出正则表达式,但在这里遇到了不少问题:

        1)审查元素与源代码有差别

        部分数据,如非v章节章均点击数,审查元素有,但是源代码里是空白:

python晋江文学城数据分析(一)——爬虫(BeautifulSoup正则)

python晋江文学城数据分析(一)——爬虫(BeautifulSoup正则)

         这是个动态元素,后来找到了解决办法,但是要再次跳转页码过于麻烦,所以决定放弃这个数据。

        2)区域html差别大

        爬取的三个地方,不像收藏榜是在一个table里,很难findall先锁定一个大区域,尝试之后,东拼西凑,文案和书评收藏数用compile,文章基本信息里,先findall了ul。

        3)是否出版扒不下来

python晋江文学城数据分析(一)——爬虫(BeautifulSoup正则)

         原本想把title里的文字给扒下来,但是无论如何compile都是空白,最后草率地写了个if else简单判断,手动append上是否出版的信息。

3cookie

        晋江不登录的话,只让爬取前十页的数据,十页以后会有登录提示,爬虫也自动断了,上网找到了解决方法,登录晋江账号后,查看审查元素,并刷新页面,找到如下所示: 

python晋江文学城数据分析(一)——爬虫(BeautifulSoup正则)

         将cookie复制,加到爬虫的请求头中。

4代码

import requests
from bs4 import BeautifulSoup
import time
import re
import xlwt

t1 = time.time()

def main(savepath):
    count=0
    for page in range(1,501):
        url = get_url(page)
        headers = {
            'cookie': '你的cookie'}
        html = requests.get(url, headers=headers)
        html.encoding = html.apparent_encoding
        try:
            datalist = getData(html.content)
        except:
            print("爬取失败:", page)
            continue
        if len(datalist) == 0:
            break
        saveData(savepath,datalist,count)
        count+=len(datalist)
        print(page)
        print(count)
        #time.sleep(3)


def get_url(page):
    url = f"https://www.jjwxc.net/bookbase.php?fw0=0&fbsj0=0&ycx0=0&xx0=0&mainview0=0&sd0=0&lx0=0&fg0=0&bq=-1&sortType=4&isfinish=0&collectiontypes=ors&page={page}"
    return url

#提取收藏榜数据的正则表达式
findAuthor = re.compile(r'">(.*?)</a>',re.U)
findName = re.compile(r'">(.*?)</a>',re.U)
findBookLink = re.compile(r'<a href="(.*?)"')
findTitle = re.compile(r"<a.*?href=.*?<\/a>", re.I|re.S|re.M)
findType = re.compile(r'<td align="center">(.*?)</td>', re.S|re.M)
findStyle = re.compile(r'<td align="center">(.*?)</td>', re.S|re.M)
findPro = re.compile(r'<td align="center">(.*?)</td>', re.S|re.M)
findSize = re.compile(r'<td align="right">(\d+)</td>')
findPoint = re.compile(r'<td align="right">(\d+)</td>')
findTime = re.compile(r'<td align="center">(.*?)</td>')

def getData(document):
    datalist = []
    soup = BeautifulSoup(document, "html.parser")
    i = 0
    for item in soup.findAll('tr'):
        data = [] # 保存一本书的所有信息
        item = str(item)         
        Author = re.findall(findAuthor, item)# 提取作者名     
        Name = re.findall(findName, item)# 提取文名            
        BookLink = re.findall(findBookLink, item)# 提取文章链接           
        Title = re.findall(findTitle, item)# 提取标签            
        Type = re.findall(findType, item)# 提取类型            
        Style = re.findall(findStyle, item)# 提取风格 
        Pro = re.findall(findPro, item)# 提取进度
        Size = re.findall(findSize, item)# 提取字数
        Point = re.findall(findPoint, item)# 提取积分
        Time = re.findall(findTime, item)# 提取发表时间

        if i:
            data.append(Author[0])
            data.append(Name[1])
            BookLink[1]='http://www.jjwxc.net/' + BookLink[1]
            data.append(BookLink[1])
            Title[1]=re.findall(r'title="(.*?)"', Title[1], re.S|re.M)
            data.append(Title[1])
            data.append(Type[0].strip())
            data.append(Style[1].strip())
            if '</font>' in Pro[2]:
                Pro[2]=re.findall(r'>(.*?)</font>', Pro[2])
                data.append(Pro[2])
            else:
                data.append(Pro[2].strip())
            data.append(int(Size[0]))
            data.append(int(Point[1]))
            data.append(Time[0])

            #进入小说详情页,爬取相关数据
            try:
                detail(BookLink[1],data)
            except:
                print("爬取失败:", BookLink[1])
                continue

            datalist.append(data)
        i = 1
    return datalist

def getURL(url):
    headers = {
    'User-Agent': 'Mozilla/5.0 (MSIE 10.0; Windows NT 6.1; Trident/5.0)'
    }
    response = requests.get(url,headers = headers)
    response.encoding = 'gbk'
    time.sleep(0.2)
    if response.status_code == 200:
        return response.text
    return None

def detail(url,data):
    html = getURL(url)
    soup = BeautifulSoup(html, "html.parser")
    #爬取书评、收藏、营养液数
    comment = re.compile('<tr>.*?<td.*?>.*?<div align="center">.*?<span.*?>(.*?)</span>.*?<span.*?>(.*?)</span>.*?<span.*?>(.*?)</span>.*?<span.*?>(.*?)</span>.*?',re.S)
    items = re.findall(comment,html)
    for j in items:
        data.append(j[1])#书评数
        data.append(j[2])#当前被收藏数
        data.append(j[3])#营养液数

    #爬取文案
    copywriting = re.compile('<tr>.*?<div id="novelintro" itemprop="description">(.*?)</div>',re.S)
    items = re.findall(copywriting,html)
    #value = items[0].replace('<br>', '').replace(' ', '')
    pattern = re.compile(r'<[^>]+>',re.S)
    value = pattern.sub('', items[0])
    data.append(value)

    # 爬取作品视角、出版、签约状态
    result_list = soup.find_all('ul',attrs={'name':'printright'})
    for results in result_list:
        result=str(results)
        infor = re.compile('</span>(.*?)</li>',re.S|re.M)
        items = re.findall(infor,result)
        data.append(items[2].strip())#作品视角
        if 'img' in items[7]:#是否出版
            data.append("已出版")
        else:
            data.append("尚未出版")
        items[9]=re.findall(r'>(.*?)</font>', items[9])#是否签约
        data.append(items[9][0])

workbook = xlwt.Workbook(encoding='utf-8',style_compression=0)
worksheet = workbook.add_sheet('晋江', cell_overwrite_ok=True)
col = ("作者","作品","链接","标签","类型","风格","进度","字数","作品积分","发表时间","总书评数","当前被收藏数","营养液数","文案","视角","出版状态","签约状态")
for i in range(0,17):
    worksheet.write(0,i,col[i])

# 3.保存数据
# 保存到文件中
def saveData(savepath,datalist,count):
    for i in range(0,len(datalist)):
        data = datalist[i]
        for j in range(0,len(data)):
            worksheet.write(count+i+1,j,data[j])
    workbook.save(savepath)

if __name__ == "__main__":
	main("你的存储路径")

print("耗时:", time.time() - t1)

5结果

python晋江文学城数据分析(一)——爬虫(BeautifulSoup正则)

        500页每页100本小说,最后爬取出来46953条数据。

6总结 

        回忆性文章,其实过程中遇到过很多问题和困难,但暂时只想起这些了。

        待改善的地方:

        1)爬取太慢,爬取250页花费近10个小时,看网上有多进程、多线程可以加快爬虫时间,之后有时间当学习改进;

        2)正则表达式不够精确,部分详情页爬取出来不是目的数据,因为错误的数据量不多,后续数据处理采取了直接删除的办法,之后可以在爬虫阶段尝试改进;

        3)部分收藏榜页整页爬取失败,部分详情页爬取失败,失败原因待查。文章来源地址https://www.toymoban.com/news/detail-474890.html

到了这里,关于python晋江文学城数据分析(一)——爬虫(BeautifulSoup正则)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 大数据爬虫分析基于Python+Django旅游大数据分析系统

    欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。    基于Python和Django的旅游大数据分析系统是一种使用Python编程语言和Django框架开发的系统,用于处理和分析旅游行业的大数据,为旅游从业者和决策者提供有关旅游趋势、客户需求、市场竞争

    2024年02月03日
    浏览(64)
  • 【Python爬虫与数据分析】基本数据结构

    目录 一、概述 二、特性 三、列表 四、字典 Python基本数据结构有四种,分别是列表、元组、集合、字典 ,这是Python解释器默认的数据结构,可以直接使用,无需像C语言那样需要手搓或像C++那样需要声明STL头文件。 Python的数据结构非常灵活,对数据类型没有限制,即一个数

    2024年02月11日
    浏览(48)
  • 【Python爬虫与数据分析】进阶语法

    目录 一、异常捕获 二、迭代器 三、拆包、聚合、映射 四、filter() 函数 五、匿名函数 六、闭包 七、装饰器 异常捕获可增强程序的健壮性,即程序在遇到遇到异常的时候并不会做中断处理,而是会将异常抛出,由程序员来分析异常和做异常处理。 迭代器通常用于数据结构对

    2024年02月12日
    浏览(43)
  • Python爬虫数据分析的基本概念

    Python爬虫数据分析是一种利用Python编程语言和相关的库来获取互联网上的数据,并对数据进行处理、分析和可视化的技术。Python爬虫数据分析技术在数据挖掘、商业智能、市场调研、舆情分析等领域都有广泛的应用。本文将介绍Python爬虫数据分析的基本概念、常用库和实战案

    2024年02月06日
    浏览(45)
  • 数据分析毕业设计 大数据招聘岗位数据分析与可视化 - 爬虫 python

    # 1 前言 🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。 为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项

    2024年02月10日
    浏览(48)
  • 【Python爬虫与数据分析】初阶语法

    目录 一、数据类型 二、输入输出 三、算术运算 四、逻辑与条件判断 五、循环控制 六、函数 Python的数据类型分为 常量 、 数值变量 、 字符串变量 、 布尔变量 (True、False) 常量可以直接参与运算与赋值, 变量无需声明可直接定义 整型与浮点型数值可以直接相互运算 ,整

    2024年02月11日
    浏览(43)
  • 【Python爬虫与数据分析】面向对象设计

    目录 一、类的构建与继承 二、多继承 三、钻石继承 四、多态 五、鸭子类型 六、类的组合 七、类的私有属性和方法 八、魔法方法 九、单例模式 类 的属性包含 成员变量 和 成员函数 (方法) 成员函数 又分为 静态方法 、 魔法方法 、 普通成员方法 静态方法可以直接被类

    2024年02月11日
    浏览(55)
  • 【Python爬虫与数据分析】进程、线程、协程

    目录 一、概述 二、进程的创建 三、线程的创建 四、协程的创建 五、全局变量的共享问题 六、消息队列与互斥锁 七、池化技术 进程是系统分配资源的基本单位,线程是CPU调度的基本单位。 一个进程可包含多个线程,一个线程可包含多个协程,协程就是最小的任务执行单位

    2024年02月13日
    浏览(41)
  • 【Python数据分析案例】——中国高票房电影分析(爬虫获取数据及分析可视化全流程)

    案例背景 最近总看到《消失的她》票房多少多少,《孤注一掷》票房又破了多少多少… 于是我就想自己爬虫一下获取中国高票房的电影数据,然后分析一下。 数据来源于淘票票:影片总票房排行榜 (maoyan.com) 爬它就行。 代码实现 首先爬虫获取数据: 数据获取 导入包 传入网

    2024年01月20日
    浏览(287)
  • 【Python爬虫与数据分析】爬虫常用标准库(时间、随机数)

    目录 一、模块化概述 二、time库 1. 时间获取 2. 时间格式化 3. 程序计时 三、datetime库 1. datetime.datetime类 2. datetime.timedelta类 四、random库 1. 基本随机函数 2. 扩展随机函数 3. 随机时间的生成 Python程序由模块组成,一个模块对应一个 .py 源文件。 模块分为 标准库模块 和 自定义模

    2024年02月15日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包