猫眼爬虫top100(xpath,re)对评分进行数据可视化。

在这里插入图片描述

需求

获取猫眼电影top100榜单电影名字、评分等。将提取到的数据保存与csv文件,并对电影评分进行可视化。

注意点
  • 在保存数据至csv文件时,需要注意换行写入数据。
  • 在使用requests库时,通过基础的headers和cookies会遇到反爬虫机制。可准备多个user_agent,实现数据的提取。
  • urllib库的requests模块在进行数据爬取时,在爬取数据时相较于requests库更不易被反爬虫,所以在请求十次url地址时。更多选择使用urllib.requests方法获取数据。
  • 使用urllib.requests方法显然不如requests方法方便简洁或者智能化。urllib.requests需要在先传递url地址请求,然后再使用read方法读取对应的url地址数据。得到的数据默认是字节流,一般需要转换成utf-8。而requests模块则可以实现url地址请求和读取数据的一体化,不再需要使用read方法得到数据。
  • 默认是字节流,一般需要转换成utf-8。而requests模块则可以实现url地址请求和读取数据的一体化,不再需要使用read方法得到数据。
  • 详情见:浅谈urllib和requests
数据提取
  • 模块使用
import request
import urllib.request
import gzip
from io import BytesIO
from lxml import etree
  • 实现过程
    使用面向对象方式实现数据提取

    • 初始化init方法和初始url地址
    self.headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36',
                          'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
                          'Accept-Encoding': 'gzip, deflate, br',
    

    模拟浏览器实现提取,适用于方法二

    self.url = "https://maoyan.com/board/4?offset={}"
    
    • 定义发送url地址的函数,并且获取数据
      • 方式一 request库
      def parse_url(self,url):
          response = requests.get(url,headers=self.headers)
          return response.content.decode()
      
      • 方式二 urllib.request方法
      def parse_url(self,url):
          ret = urllib.request.Request(url,headers=self.headers)
          response = urllib.request.urlopen(ret)
          html = response.read()
          buff = BytesIO(html)
          f = gzip.GzipFile(fileobj=buff)
          html = f.read().decode("utf-8")
          return html
      
    • 对获取的数据实现xpath方法提取数据
      def get_content_list(self,content_str,file):
          html = etree.HTML(content_str)
          # print(content_str)
    
          # 分组
          element_xpath = html.xpath("//*[@class='container']/div/div/div[1]/dl/dd")
          print(element_xpath)
          # print(element_xpath)
          # 确保xpath方法得到的element对象无为空
          for element in element_xpath:
              content_list = []
              title_first = element.xpath("./div/div/div[1]/p[1]/a/@title")
              # print(title_first)
              content_list.append(title_first[0])
              text_list = element.xpath("./div/div/div[1]/p[3]/text()")
              content_list.append(text_list[0])
              # print(content_list)
              num_count = element.xpath("./div/div/div[2]/p/i/text()")
              str_i = ""
              for b in num_count:
                  str_i += b
              content_list.append(str_i)
              print(content_list)
              self.write_csv(content_list,file)
    

    使用etree.HTML方法将提取到的数据复制到html对象,html对象可使用xpath。先分组得到有关dd的elelment对象列表,遍历后得到每一个dd的elemtent对象,对每一个dd数据提取对应的电影等数据。将每一条电影数据保存到一个列表中,写入到csv文件中。

    • 定义数据保存函数
      def write_csv(self,content_list,file):
          file.write(",".join(content_list))
          file.write("\n")
      
      将数据写入到csv文件,得到的content是一个列表,包括三个字符串数据,使用join方法将数据写入到csv文件。
  • 程序逻辑和执行

    • 定义run方法
      def run(self):
          # 构造csv文件
          file = open("电影数据.csv","w",encoding="utf-8")
          csv_list = ["电影","演员","上映时间"]
          file.write(",".join(csv_list))
          file.write("\n")
          offset = 0
          # url地址请求循环
          while offset <100:
              # 构造url地址,使用字符串格式化的方法得到url
              url = self.url.format(offset)
              # 发送请求获取response响应,提取数据,保存数据csv
              content_str = self.parse_url(url)
              self.get_content_list(content_str,file)
              # 下一页url数据提取
              offset += 10
    
          file.close()
    
    • 执行
    if __name__ == '__main__':
        maoyan = Maoyanspider()
        maoyan.run()
    
  • 得到csv数据
    -在这里插入图片描述

使用正则提取数据
import re
p = re.compile('<div class="movie-item-info">.*?title="(.*?)".*?class="star">(.*?)</p>.*?class="releasetime">(.*?)</p>.*?</div>',re.S)
        content_list = p.findall(html)

在提取数据函数中使用re模块提取需要的数据。

进行数据可视化
  • 模块准备
import pandas as pd
from matplotlib import pyplot as plt
  • 作图前20个电影的评分视图
df = pd.read_csv("./电影数据3.csv")
print(df.head())
print(df.info())
_x = df["电影"].values[:20]
_y = df["评分"].values[:20]
plt.figure(figsize=(20,8),dpi=80)
plt.plot(range(len(_x)),_y)
plt.xticks(range(len(_x)),_x,rotation=45,fontproperties="SimHei")
for x,y in enumerate(_y):
    print(x,y)
    plt.text(x,y+0.1,y,ha="center")
plt.show()

绘制评分对比折线图,使用text方法在图上显示对应的具体数据。
在这里插入图片描述

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值