爬虫大作业
Posted 有志气的骚年
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了爬虫大作业相关的知识,希望对你有一定的参考价值。
一、选一个自己感兴趣的主题(所有人不能雷同)。
因为以前很喜欢看小说,看到一些小说情节时会想象这样写好不好,怎样写能更好。因为好的剧情和文章质量能够吸引更多的读者,并且从商业角度出发有质量的文章能留住‘老书虫‘,而大部分的小说打赏其实是来自老读者的。
这次的爬虫网站是起点中文网,此网站可以说是中国最热门的小说网站了
网站盈利很大一部分来自读者的消费,读者消费可以从月票体现,因为地点必须是充值才会有月票。所以获得月票多的作家,收入就多。
这里收集了起点网前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()
五、总结
本次遇到了很多的问题,并不像上课时老师喂饼的方式般易懂、很多模糊的地方需要自己摸索,在网上查资料,而且查了也不一定懂,最后可能会选择更换方法实现。
通过本次实验更好的掌握和加深了老师上课讲过的知识,例如列表、字典等的使用,同时扩充了其他知识。
以上是关于爬虫大作业的主要内容,如果未能解决你的问题,请参考以下文章
HTML5期末大作业:餐饮美食网站设计——咖啡(10页) HTML+CSS+JavaScript 学生DW网页设计作业成品 web课程设计网页规划与设计 咖啡网页设计 美食餐饮网页设计...(代码片段
Python大作业——爬虫+可视化+数据分析+数据库(可视化篇)