爬虫大作业

一、选一个自己感兴趣的主题(所有人不能雷同)。

因为以前很喜欢看小说,看到一些小说情节时会想象这样写好不好,怎样写能更好。因为好的剧情和文章质量能够吸引更多的读者,并且从商业角度出发有质量的文章能留住‘老书虫‘,而大部分的小说打赏其实是来自老读者的。 

这次的爬虫网站是起点中文网,此网站可以说是中国最热门的小说网站了

 

网站盈利很大一部分来自读者的消费,读者消费可以从月票体现,因为地点必须是充值才会有月票。所以获得月票多的作家,收入就多。

这里收集了起点网前400人气作品的月票当月月票总数,并进行词云分析。可以分析出当月月票数最多的几部作品。看出最近什么作品比较赚钱。

 

二、实现步骤:

先获取一部小说的具体消息

#获取一部小说相关信息
def getDetailNovel(novelUrl):
    res = requests.get(novelUrl)
    res.encoding = 'utf-8'
    soup = BeautifulSoup(res.text, 'html.parser')
    news={}
    news['novel']=soup.select('h1')[0].select('em')[0].text
    news['author'] = soup.select('h1')[0].select('span')[0].select('a')[0].text
    news['ticket']= soup.select('.num')[0].select('i')[0].text
    news['context'] =soup.select('.book-info')[0].select('p')[1].text
    zidian[news['author']]=int(news['ticket'])
    return news

再获取一页小说的信息(起点网是一页陈列20部小说信息)

def getOnePageDetailNovle(url):
    resd = requests.get(url)
    resd.encoding = 'utf-8'
    soupd = BeautifulSoup(resd.text, 'html.parser')
    onePageNews=[]

    for i in range (0,20):
        oneUrl='http://'+soupd.select('ul')[10].select('li')[i].select('h4')[0].select('a')[0].attrs['href'].strip('/')
        novleNews = getDetailNovel(oneUrl)
        print(novleNews)
        onePageNews.append(novleNews)
    return onePageNews

 

最后选择获取多少页的小说信息

#获取设定页p全部小说相关信息
def getAllPageDetailNovle(p):
    allPageNews = []
    for i in range(1, p+1):
        listPageUrl = 'https://www.qidian.com/all?orderId=&style=1&pageSize=20&siteid=1&pubflag=0&hiddenField=0&page={}'.format(
            i)
        print(listPageUrl)
        allPageNews.extend(getOnePageDetailNovle(listPageUrl))
    return allPageNews

结果存进excel表格

df=pandas.DataFrame(allPageNews)
df.to_excel('cwh.xlsx',encoding='utf-8')

 

 

 

用词云展示

import wordcloud
from PIL import Image,ImageSequence
import numpy as np
import matplotlib.pyplot as plt
from wordcloud import WordCloud,ImageColorGenerator
image= Image.open('./3.jpg')
graph = np.array(image)
font=r'C:\Windows\Fonts\simhei.TTF'
wc = WordCloud(font_path=font,background_color='White',max_words=50,mask=graph)
wc.generate_from_frequencies(zidian)
image_color = ImageColorGenerator(graph)
plt.imshow(wc)
plt.axis("off")
plt.show()

选取的图片

结果

可以看出本月《重生似水青春》获得月票远超其他小说。

三、遇到的问题

1.首先,因为电脑烧了,所以我用的是舍友的笔记本写的,已经是安装好了词云,所以没有体验到安装过程遇到的问题。

2.爬取中遇到的问题:起初目标是爬取前一千的数据,但是爬着爬着的时候就报错了

后面通过上网查询原因,有答案称是起点设置了限制,最多单次只可访问限定部小说数据,多了就会被远程中断。所以最后选择400部

3.本来想再爬取个点击量的数据,F12调出开发者模式看了下发现

 

数据被加密了,直接调用是会展示空值的,所以这个方法不行再看network里的记录,发现里面有,但是并不能直接调用

需要获取3个数据:分别是书的id(bookId)、作者id(authorId)和书的种类id(chanId)。

一番摸索后发现书和作者的id可以在小说信息页面获取,但是种类不行。所以最后放弃获取点击量。

 四、所有代码

import requests
import re
from bs4 import BeautifulSoup
from datetime import datetime
import openpyxl
import pandas


#获取一部小说相关信息
def getDetailNovel(novelUrl):
    res = requests.get(novelUrl)
    res.encoding = 'utf-8'
    soup = BeautifulSoup(res.text, 'html.parser')
    news={}
    news['novel']=soup.select('h1')[0].select('em')[0].text
    news['author'] = soup.select('h1')[0].select('span')[0].select('a')[0].text
    news['ticket']= soup.select('.num')[0].select('i')[0].text
    news['context'] =soup.select('.book-info')[0].select('p')[1].text
    zidian[news['novel']]=int(news['ticket'])
    return news
# 获取设定页p全部小说相关信息
def getOnePageDetailNovle(url):
    resd = requests.get(url)
    resd.encoding = 'utf-8'
    soupd = BeautifulSoup(resd.text, 'html.parser')
    onePageNews=[]

    for i in range (0,20):
        oneUrl='http://'+soupd.select('ul')[10].select('li')[i].select('h4')[0].select('a')[0].attrs['href'].strip('/')
        novleNews = getDetailNovel(oneUrl)
        print(novleNews)
        onePageNews.append(novleNews)
    return onePageNews

#获取设定页p全部小说相关信息
def getAllPageDetailNovle(p):
    allPageNews = []
    for i in range(1, p+1):
        listPageUrl = 'https://www.qidian.com/all?orderId=&style=1&pageSize=20&siteid=1&pubflag=0&hiddenField=0&page={}'.format(
            i)
        print(listPageUrl)
        allPageNews.extend(getOnePageDetailNovle(listPageUrl))
    return allPageNews

zidian={}
allPageNews=[]
allPageNews=getAllPageDetailNovle(20)
df=pandas.DataFrame(allPageNews)

df.to_excel('cwh.xlsx',encoding='utf-8')
import wordcloud
from PIL import Image,ImageSequence
import numpy as np
import matplotlib.pyplot as plt
from wordcloud import WordCloud,ImageColorGenerator
image= Image.open('./3.jpg')
graph = np.array(image)
font=r'C:\Windows\Fonts\simhei.TTF'
wc = WordCloud(font_path=font,background_color='White',max_words=50,mask=graph)
wc.generate_from_frequencies(zidian)
image_color = ImageColorGenerator(graph)
plt.imshow(wc)
plt.axis("off")
plt.show()

 

五、总结

本次遇到了很多的问题,并不像上课时老师喂饼的方式般易懂、很多模糊的地方需要自己摸索,在网上查资料,而且查了也不一定懂,最后可能会选择更换方法实现。

通过本次实验更好的掌握和加深了老师上课讲过的知识,例如列表、字典等的使用,同时扩充了其他知识。

转载于:https://www.cnblogs.com/diansaonian/p/8969458.html

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
python大作业 一、Turtle创意大PK 自拟题目,完成一个利用Python程序的创意绘图,采用turtle库绘图为主,不少于50行代码,可选采用其他库。 (滑稽绘制) 二、程序练习 2.1 问题描述(10分) 人们常常提到"一万小时定律",就是不管你做什么事情,只要坚持一万小时,应该都可以成为该领域的专家。那么,10000小时是多少年多少天呢? 2.2 问题描述(10分)0380031003800341590145037657 编写计算从n到m和的函数‬,函数名为sum(n,m)‬,函数返回值为n到m所有数据的和‬,使用该函数计算输入数据x,y之间所有数据的和。 2.3 问题描述(15分) 编写函数judgeTri(a,b,c),判断以参数a,b,c的值为边长能否构成三角形并判断三角形的形状;若是锐角三角形,返回R;若是直角三角形,返回Z;若是钝角三角形,返回D;若三边长不能构成三角形,返回ERROR。 2.4 问题描述(15分) 用户输入一个字符串,分别统计其中小写字母、大写字母、数字、空格和其他字符的个数,并在一行内输出小写字母、大写字母、数字、空格和其他字符的个数。 2.5 问题描述(20分) 程序的功能: (1) 使用随机库功能,生成一个包含10个不重复且小于200的正整数列表ls1,输出ls1。‬ (2) 使用列表排序方法,对ls1按奇数在前偶数在后,并且奇数之间的相对顺序不变,偶数之间的相对顺序也不变进行排序,再输出ls1。‬ (3) 使用列表排序方法,对ls1按元素字符长度降序进行排序,输出ls1。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值