python 爬取猫眼电影排行

这篇学习了是崔庆才老师的《python3网络爬虫开发实践》中的案例自己学习了下。大家可以买啊,通俗易懂。

 秉承着无图无真相的精神。嘿嘿

 一、代码

import re #正则表达式
import pandas as pd #excel保存 
import requests as request #网络请求request
from fake_useragent import UserAgent #请求头参数构建


class CatEyeSpiper(object):
    #初始化参数
    def __init__(self):
        self.ua = UserAgent()  # 获取userAgent类
        self._data = list()
        self.head = {"User-Agent": self.ua.random}

    #解析html文件
    def parmer_html(self, offset):
        url = "https://maoyan.com/board/4?offset={}".format(offset)
        respon = request.get(url=url, headers=self.head)
        print(respon.content.decode('utf-8'))
        #主要是学习这句正则表达式 很简单
        pattern = re.compile(
            '<dd>.*?board-index.*?>(.*?)</i>.*?data-src="(.*?)".*?<p.*?name.*?title="(.*?)".*?star.*?>(.*?)</p>.*?releasetime.*?>(.*?)</p>.*?integer.*?>(.*?)</i>.*?fraction.*?>(.*?)</i>.*?</dd>',
            re.S)
        items = re.findall(pattern, respon.content.decode('utf-8'))
        
        #循环遍历数据保存list
        for item in items:
            one_data = {
                "image": item[1],
                "title": item[2].strip(),
                "actor": item[3].strip() if (len(item[3])) > 3 else '',
                "time": item[4].strip() if (len(item[4])) > 5 else '',
                "score": item[5].strip() + item[6].strip()
            }
            self._data.append(one_data)
        print(self._data)
    #保存excel在根目录
    def save_excel(self):
        data = pd.DataFrame(self._data)
        data.to_csv("猫眼电影数据数据.csv", encoding='utf_8_sig')  # 写入文件

    def run(self):
        #猫眼数据规则
        for i in range(10):
            self.parmer_html(offset=i * 10)
 
        if len(self._data)>0:
           self.save_excel()


if __name__ == ('__main__'):
    carEye = CatEyeSpiper()
    carEye.run()

二、正则分析  

主要是下面图片一段html利用正则表达式数据提取。超简单

 

<dd>
    <i class="board-index board-index-1">1</i>
    <a href="/films/1200486" title="我不是药神" class="image-link" data-act="boarditem-click" data-val="{movieId:1200486}">
      <img src="//s3plus.meituan.net/v1/mss_e2821d7f0cfe4ac1bf9202ecf9590e67/cdn-prod/file:5788b470/image/loading_2.e3d934bf.png" alt="" class="poster-default">
      <img alt="我不是药神" class="board-img" src="https://p0.meituan.net/movie/414176cfa3fea8bed9b579e9f42766b9686649.jpg@160w_220h_1e_1c">
    </a>
    <div class="board-item-main">
      <div class="board-item-content">
          <div class="movie-item-info">
        <p class="name"><a href="/films/1200486" title="我不是药神" data-act="boarditem-click" data-val="{movieId:1200486}">我不是药神</a></p>
        <p class="star">
                主演:徐峥,周一围,王传君
        </p>
<p class="releasetime">上映时间:2018-07-05</p>    </div>
    <div class="movie-item-number score-num">
<p class="score"><i class="integer">9.</i><i class="fraction">6</i></p>        
    </div>
      </div>
        </div>
 </dd>

 

<dd>.*?board-index.*?>(.*?)</i>.*?data-src="(.*?)".*?<p.*?name.*?title="(.*?)".*?star.*?>(.*?)</p>.*?releasetime.*?>(.*?)</p>.*?integer.*?>(.*?)</i>.*?fraction.*?>(.*?)</i>.*?</dd>'
  1. <dd>.*?board-index.*?>(.*?)</I>   匹配<dd>开头 .*?表示任何数字字符字母 (.*?)要提取出来的数据。 == <dd>****board-index****>(***)</i>结尾 提取编号
  2. .*?data-src="(.*?)".*?   == ******data-src=(***)*****   提取图片网络地址
  3. <p.*?name.*?title="(.*?)".*? == <p*****name****title=(***)***** 提取片名

三、总结

易犯错误:

  • 初始化参数list没有加括号,添加对象导致类型错误。类型不匹配。
  • 请求地址未转换格式 utf-8,导致读取为byte类型不匹配解析。
  • 正则表达式pattern后没有加 re.S 换行读取,导致数据读取不到。
  • 下载pandas库太慢,使用清华镜像源下载解决。pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pandas

学习知识:

  •   正则表达式贪婪匹配于非贪婪匹配(.*?)
  •   Robos协议判断页面是否可抓取

四、快乐就是敲代码听歌  

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值