爬虫大作业~以爬取hao123漫画为例

一、准备过程

首先打开hao123漫画筛选区,网址是https://www.hao123.com/manhua/list/?finish=&audience=&area=&cate=&order=1

在这里可以通过审查模式看到第一页的详细信息,而目的则是通过爬取漫画筛选页面的每部漫画的人气与题材来分析最近漫画迷的观漫需求

环境如下:

  python3.6.2    PyCharm

  Windows8.1  第三方库(jieba,wordcloud,bs4,Requests,re,wordcloud)

二、代码

1.用requests库和BeautifulSoup库,爬取hao123漫画网当前页面的每部漫画的漫画名、地域、题材、人气、链接等,将获取漫画详情的代码定义成一个函数 

def getCartoonDetail(cartoonUrl):

# 将获取hao123漫画详情的代码定义成一个函数 def getCartoonDetail(cartoonUrl):
def getCartoonDetail(cartoonUrl):
    resd = requests.get(cartoonUrl)
    resd.encoding = ‘utf-8‘
    soupd = BeautifulSoup(resd.text, ‘html.parser‘)
    cartoons = {}
    # 获取除了标题外的字符串
    a = soupd.select(‘.title-wrap‘)[0].select(‘span‘)[0].text
    # 计算字符串的长度
    num = len(a)
    # 标题
    cartoons[‘title‘] = soupd.select(‘.title-wrap‘)[0].text[:-num]
    ul = soupd.select(‘.info-list‘)[0]
    # 地域
    cartoons[‘territory‘] = ul.select(‘li‘)[1].text.lstrip(‘地域:‘).replace(‘\xa0‘," ")
    #漫画题材
    cartoons[‘theme‘] = ul.select(‘li‘)[-2].text.lstrip(‘题材:‘).replace(‘\xa0‘," ")
    #人气
    cartoons[‘moods‘] = ul.select(‘li‘)[-1].text.lstrip(‘人气:‘)
    writeCartoonDetail(cartoons[‘theme‘] + ‘ ‘ + cartoons[‘moods‘] + ‘\n‘)
    return cartoons

2.取出一个漫画列表页的全部漫画 包装成函数def getListPage(pageUrl):

def getListPage(pageUrl):
    res = requests.get(pageUrl)
    res.encoding = ‘utf-8‘
    soup = BeautifulSoup(res.text, ‘html.parser‘)
    cartoonlist = []for cartoon in soup.select(‘.item-1‘):
        # cartoon.select(‘.title‘)获取列表里的漫画标题
        if len(cartoon.select(‘.title‘)) > 0:
            a = cartoon.select(‘a‘)[0].attrs[‘href‘]#链接
            cartoonlist.append(getCartoonDetail(a))
    return cartoonlist

3.获取总的漫画篇数,算出漫画总页数包装成函数def getPageN():

def getPageN():
    res = requests.get(‘https://www.hao123.com/manhua/list/?finish=&audience=&area=&cate=&order=1‘)
    res.encoding = ‘utf-8‘
    soup = BeautifulSoup(res.text, ‘html.parser‘)
    n = int(soup.select(‘.gray‘)[1].text.lstrip(‘共‘).rsplit(‘页‘)[0])
    return n

4. 获取全部漫画列表页的全部漫画详情。爬取页面前30页,原因是爬取的数据太多,搞到电脑蓝屏,列表好像出现过溢出

cartoontotal = []
pageUrl = ‘https://www.hao123.com/manhua/list/?finish=&audience=&area=&cate=&order=1‘
cartoontotal.extend(getListPage(pageUrl))

n = getPageN()
for i in range(2, 30 + 1):
    pageUrl = ‘https://www.hao123.com/manhua/list/?finish=&audience=&area=&cate=&order=1&pn={}‘.format(i)
    cartoontotal.extend(getListPage(pageUrl))

5.将爬取到所有信息通过pandas根据评分排序,然后只爬取‘title‘和‘moods‘两列的信息,并保存至excel表中

df = pandas.DataFrame(cartoontotal)
# 将爬取到所有信息通过pandas根据人气排序,然后只爬取‘title‘和‘moods‘两列的信息,并保存至excel表中
dfs=df.sort_index(by=‘moods‘, ascending=False)
dfsn=dfs[[‘title‘, ‘moods‘]]
dfsn.to_excel(‘cartoon.xlsx‘, encoding=‘utf-8‘)

6.将爬取到的漫画题材通过构造方法writeNewsDetail(content)写入到文本cartoon.txt中

def writeCartoonDetail(content):
    f=open(‘cartoon.txt‘,‘a‘,encoding=‘utf-8‘)
    f.write(content)
    f.close()

三、生成词云

通过导入wordcloud的包,来生成词云

from PIL import Image,ImageSequence
import numpy as np
import matplotlib.pyplot as plt
from wordcloud import WordCloud,ImageColorGenerator
# image= Image.open(‘./logo.jpg‘)
# graph = np.array(image)
# 获取上面保存的字典
title_dict = changeTitleToDict()
graph = np.array(title_dict)
font = r‘C:\Windows\Fonts\simhei.ttf‘
# backgroud_Image代表自定义显示图片,这里我使用默认的
backgroud_Image = plt.imread("G:/大三2/大数据/filedocuments/logo1.jpg")
wc = WordCloud(background_color=‘white‘,max_words=500,font_path=font, mask=backgroud_Image)
# wc = WordCloud(background_color=‘white‘,max_words=500,font_path=font)
wc.generate_from_frequencies(title_dict)
plt.imshow(wc)
plt.axis("off")
plt.show()

选择的图片:

原图:

由于生成的词云是按照背景色来生成的,故显示效果为

一个矩形,明显不是我想要的效果,所以重新抠图如下:

效果如下:

四、遇到的问题及解决方案

1.在导入wordcloud这个包的时候,会遇到很多问题

首先通过使用pip install wordcloud这个方法在全局进行包的下载,可是最后会报错误error: Microsoft Visual C++ 14.0 is required. Get it with “Microsoft Visual C++ Build Tools”: http://landinghub.visualstudio.com/visual-cpp-build-tools 

这需要我们去下载VS2017中的工具包,但是网上说文件较大,所以放弃。

之后尝试去https://www.lfd.uci.edu/~gohlke/pythonlibs/#wordcloud下载whl文件,然后安装。

下载对应的python版本进行安装,如我的就下载wordcloud-1.4.1-cp36-cp36m-win32.whl,wordcloud-1.4.1-cp36-cp36m-win_amd64

两个文件都放到项目目录中,两种文件都尝试安装

通过cd到这个文件的目录中,通过pip install wordcloud-1.4.1-cp36-cp36m-win_amd64,进行导入

但是两个尝试后只有win32的能导入,64位的不支持,所以最后只能将下好的wordcloud放到项目lib中,在Pycharm中import wordcloud,最后成功

2.在爬取漫画信息的时候,爬取漫画标题的时候,会因为soupd.select(‘.title-wrap‘)[0].text获取除标题外的其他值,如已完结,如下图

解决方案如下:

    # 获取除了标题外的字符串
    a = soupd.select(‘.title-wrap‘)[0].select(‘span‘)[0].text
    # 计算字符串的长度
    num = len(a)
    # 标题
    cartoons[‘title‘] = soupd.select(‘.title-wrap‘)[0].text[:-num]

五、数据分析与结论

通过对词云的查看,可以看出漫画迷对于类型类型为搞笑、爱情、生活、魔幻、治愈、冒险等题材的漫画喜欢,而对都市、竞技、悬疑等题材的漫画选择很少,这说明观看漫画选择的大多数是有关于有趣与刺激的,而对于推理类的漫画选择少,这样在出版漫画时可以通过受众程度来出版。

而在这次作业中,我了解并实现如何爬取一个网站的有用信息,如何对爬取的信息分析并得到结论,虽然我对于大数据技术深度的技术并不了解,而且基础的知识也需要我不断加深巩固。

六、所有代码

# 大数据大作业
# 爬取hao123漫画网中的漫画人气最多的题材
import requests
import re
from bs4 import BeautifulSoup
import pandas
import jieba

# 将爬取到的漫画题材通过构造方法writeNewsDetail(content)写入到文本cartoon.txt中
def writeCartoonDetail(content):
    f=open(‘cartoon.txt‘,‘a‘,encoding=‘utf-8‘)
    f.write(content)
    f.close()

# 将获取hao123漫画详情的代码定义成一个函数 def getCartoonDetail(cartoonUrl):
def getCartoonDetail(cartoonUrl):
    resd = requests.get(cartoonUrl)
    resd.encoding = ‘utf-8‘
    soupd = BeautifulSoup(resd.text, ‘html.parser‘)
    # print(cartoonUrl)
    cartoons = {}
    # 获取除了标题外的字符串
    a = soupd.select(‘.title-wrap‘)[0].select(‘span‘)[0].text
    # print(a)
    # 计算字符串的长度
    num = len(a)
    # print(num)
    # 标题
    cartoons[‘title‘] = soupd.select(‘.title-wrap‘)[0].text[:-num]
    # print(title)
    # b = soupd.select(‘.info-list‘)[0].select(‘li‘)[-1].text
    # print(b)
    ul = soupd.select(‘.info-list‘)[0]
    # print(ul)
    # 地域
    cartoons[‘territory‘] = ul.select(‘li‘)[1].text.lstrip(‘地域:‘).replace(‘\xa0‘," ")
    # print(territory)
    #漫画题材
    cartoons[‘theme‘] = ul.select(‘li‘)[-2].text.lstrip(‘题材:‘).replace(‘\xa0‘," ")
    # print(theme)
    #人气
    cartoons[‘moods‘] = ul.select(‘li‘)[-1].text.lstrip(‘人气:‘)
    # print(moods)
    # b = soupd.select(‘.chapter-page‘)
    # print(b)
    writeCartoonDetail(cartoons[‘theme‘] + ‘ ‘ + cartoons[‘moods‘] + ‘\n‘)
    return cartoons

# 取出一个漫画列表页的全部漫画 包装成函数def getListPage(pageUrl):
def getListPage(pageUrl):
    res = requests.get(pageUrl)
    res.encoding = ‘utf-8‘
    soup = BeautifulSoup(res.text, ‘html.parser‘)

    cartoonlist = []
    # c = soup.select(‘.list-page‘)
    # c = soup.select(‘.item-1‘)
    # print(c)
    # a = c[0].select(‘a‘)[0].attrs[‘href‘]#链接
    # print(a)
    # soup.select(‘.item-1‘)获取漫画列表
    for cartoon in soup.select(‘.item-1‘):
        # cartoon.select(‘.title‘)获取列表里的漫画标题
        if len(cartoon.select(‘.title‘)) > 0:
            # print(cartoon.select(‘.title‘))
            a = cartoon.select(‘a‘)[0].attrs[‘href‘]#链接
            # print(a)
            cartoonlist.append(getCartoonDetail(a))
    # print(cartoonlist)
    return cartoonlist

# 获取总的漫画篇数,算出漫画总页数包装成函数def getPageN():
def getPageN():
    res = requests.get(‘https://www.hao123.com/manhua/list/?finish=&audience=&area=&cate=&order=1‘)
    res.encoding = ‘utf-8‘
    soup = BeautifulSoup(res.text, ‘html.parser‘)
    n = int(soup.select(‘.gray‘)[1].text.lstrip(‘共‘).rsplit(‘页‘)[0])
    return n

# 获取全部漫画列表页的全部漫画详情。
cartoontotal = []
pageUrl = ‘https://www.hao123.com/manhua/list/?finish=&audience=&area=&cate=&order=1‘
cartoontotal.extend(getListPage(pageUrl))
# print(cartoontotal)

n = getPageN()
# print(n)
for i in range(2, 6 + 1):
    pageUrl = ‘https://www.hao123.com/manhua/list/?finish=&audience=&area=&cate=&order=1&pn={}‘.format(i)
    cartoontotal.extend(getListPage(pageUrl))
    # print(cartoontotal)
# print(cartoontotal)

cartoonsList = {}
for c in cartoontotal:
    # print(c)
    cartoonsList[‘theme‘] = c[‘theme‘]
    cartoonsList[‘moods‘] = c[‘moods‘]
print(cartoonsList)

df = pandas.DataFrame(cartoontotal)
# print(df)
# 将爬取到所有信息通过pandas根据人气排序,然后只爬取‘title‘和‘moods‘两列的信息,并保存至excel表中
dfs=df.sort_index(by=‘moods‘, ascending=False)
dfsn=dfs[[‘title‘, ‘moods‘]]
# print(dfsn)
dfsn.to_excel(‘cartoon.xlsx‘, encoding=‘utf-8‘)

# import jieba
# f = open(‘cartoon.txt‘,‘r‘,encoding="UTF-8")
# str1 = f.read()
# f.close()
# str2 = list(jieba.cut(str1))
# countdict = {}
# for i in str2:
#     countdict[i] = str2.count(i)
# dictList = list(countdict.items())
# dictList.sort(key=lambda x: x[1], reverse=True)
# f = open("G:/大三2/大数据/filedocuments/jieba.txt", "a")
# for i in range(30):
#     f.write(‘\n‘ + dictList[i][0] + " " + str(dictList[i][1]))
#     print(f)
# f.close()

 # 读取保存的内容,并转化为字典,同时把结果返回生成词云;
def changeTitleToDict():
        f = open("cartoon.txt", "r", encoding=‘utf-8‘)
        str = f.read()
        stringList = list(jieba.cut(str))
        delWord = {"+", "/", "(", ")", "【", "】", " ", ";", "!", "、"}
        stringSet = set(stringList) - delWord
        title_dict = {}
        for i in stringSet:
          title_dict[i] = stringList.count(i)
        return title_dict

# 生成词云
from PIL import Image,ImageSequence
import numpy as np
import matplotlib.pyplot as plt
from wordcloud import WordCloud,ImageColorGenerator
# image= Image.open(‘./logo.jpg‘)
# graph = np.array(image)
# 获取上面保存的字典
title_dict = changeTitleToDict()
graph = np.array(title_dict)
font = r‘C:\Windows\Fonts\simhei.ttf‘
# backgroud_Image代表自定义显示图片,这里我使用默认的
backgroud_Image = plt.imread("G:/大三2/大数据/filedocuments/logo.jpg")
wc = WordCloud(background_color=‘white‘,max_words=500,font_path=font, mask=backgroud_Image)
# wc = WordCloud(background_color=‘white‘,max_words=500,font_path=font)
wc.generate_from_frequencies(title_dict)
plt.imshow(wc)
plt.axis("off")
plt.show()

原文地址:https://www.cnblogs.com/2647409627qq/p/8933926.html

时间: 2024-11-05 15:18:12

爬虫大作业~以爬取hao123漫画为例的相关文章

爬虫大作业-爬区a9vg电玩部落ps4专区

1.选一个自己感兴趣的主题或网站.(所有同学不能雷同) 2.用python 编写爬虫程序,从网络上爬取相关主题的数据. def writeNewsDetail(content): f = open('a9vg.txt','a',encoding='utf-8') f.write(content) f.close() def getNewsDetail(url): res2 = requests.get(url) res2.encoding = 'utf-8' soup2 = BeautifulS

Python爬虫实战二之爬取百度贴吧帖子

大家好,上次我们实验了爬取了糗事百科的段子,那么这次我们来尝试一下爬取百度贴吧的帖子.与上一篇不同的是,这次我们需要用到文件的相关操作. 前言 亲爱的们,教程比较旧了,百度贴吧页面可能改版,可能代码不好使,八成是正则表达式那儿匹配不到了,请更改一下正则,当然最主要的还是帮助大家理解思路. 2016/12/2 本篇目标 1.对百度贴吧的任意帖子进行抓取 2.指定是否只抓取楼主发帖内容 3.将抓取到的内容分析并保存到文件 1.URL格式的确定 首先,我们先观察一下百度贴吧的任意一个帖子. 比如:ht

Python爬虫新手教程:爬取了6574篇文章,告诉你产品经理在看什么!

作为互联网界的两个对立的物种,产品汪与程序猿似乎就像一对天生的死对头:但是在产品开发链条上紧密合作的双方,只有通力合作,才能更好地推动项目发展.那么产品经理平日里面都在看那些文章呢?我们程序猿该如何投其所好呢?我爬取了人人都是产品经理栏目下的所有文章,看看产品经理都喜欢看什么. 1. 分析背景 1.1. 为什么选择「人人都是产品经理」 人人都是产品经理是以产品经理.运营为核心的学习.交流.分享平台,集媒体.培训.招聘.社群为一体,全方位服务产品人和运营人,成立8年举办在线讲座500+期,线下分享

# [爬虫Demo] pyquery+csv爬取猫眼电影top100

目录 [爬虫Demo] pyquery+csv爬取猫眼电影top100 站点分析 代码君 [爬虫Demo] pyquery+csv爬取猫眼电影top100 站点分析 https://maoyan.com/board/4?offset=0 翻页操作只会改变offset偏移量,每部电影的信息都在dd标签内,使用pyquery库中的css选择器直接解析页面 代码君 css选择器直接选择和使用find()方法的区别:find()用于选择子节点,因此限定了选择的区域,速度可能要快些,直接传入''选择器可能

Python Scrapy的QQ音乐爬虫 音乐下载、爬取歌曲信息、歌词、精彩评论

QQ音乐爬虫(with scrapy)/QQ Music Spider 磁力搜索网站2020/01/07更新 https://www.cnblogs.com/cilisousuo/p/12099547.html UPDATE 2019.12.23 已实现对QQ音乐文件的下载,出于版权考虑,不对此部分代码进行公开.此项目仅作为学习交流使用,支持正版,人人有责 项目介绍 在写一个项目的时候需要用到一些音乐的信息,但是在网上找了许久也没找到满意的音乐语料,于是便用scrapy写了一个QQ音乐的爬虫 由

转 Python爬虫实战二之爬取百度贴吧帖子

静觅 » Python爬虫实战二之爬取百度贴吧帖子 大家好,上次我们实验了爬取了糗事百科的段子,那么这次我们来尝试一下爬取百度贴吧的帖子.与上一篇不同的是,这次我们需要用到文件的相关操作. 本篇目标 1.对百度贴吧的任意帖子进行抓取 2.指定是否只抓取楼主发帖内容 3.将抓取到的内容分析并保存到文件

爬虫07 /scrapy图片爬取、中间件、selenium在scrapy中的应用、CrawlSpider、分布式、增量式

目录 爬虫07 /scrapy图片爬取.中间件.selenium在scrapy中的应用.CrawlSpider.分布式.增量式 1. scrapy图片的爬取/基于管道类实现 2. 中间件的使用 3. selenium在scrapy中的应用 4. CrawlSpider 5. 分布式 5. 增量式 爬虫07 /scrapy图片爬取.中间件.selenium在scrapy中的应用.CrawlSpider.分布式.增量式 1. scrapy图片的爬取/基于管道类实现 爬取流程: 爬虫类中将解析到的图片

【Python3 爬虫】U28_多线程爬取斗图啦的表情包

目录 1.需求描述 2.实战代码 2.1 单线程爬取 2.2 多线程版 1.需求描述 爬取斗图啦网站,地址为:https://www.doutula.com/photo/list/[Python3 爬虫]U28_多线程爬取斗图啦的表情包 原文地址:https://www.cnblogs.com/OliverQin/p/12636681.html

python selenium爬取kuku漫画

在爬取这个网站之前,试过爬取其他网站的漫画,但是发现有很多反爬虫的限制,有的图片后面加了动态参数,每秒都会更新,所以前一秒爬取的图片链接到一下秒就会失效了,还有的是图片地址不变,但是访问次数频繁的话会返回403,终于找到一个没有限制的漫画网站,演示一下selenium爬虫 # -*- coding:utf-8 -*- # crawl kuku漫画 __author__='fengzhankui' from selenium import webdriver from selenium.webdr