zoukankan      html  css  js  c++  java
  • 进击的爬虫-001-正则表达式实现猫眼电影top100排名爬取

      大家好, 我是眼睛儿,从今天起,我会每周和大家分享一些学习爬虫相关的知识,.欢迎各位大佬的敦促和指导,也欢迎对爬虫感兴趣的小伙伴来交流,共同进步,废话不多说,上代码:

     用python语言从繁多而复杂的数据中提取出有用的数据是相当繁琐的, 正则表达式为我们提供了一种简便的方法.想要做好爬虫, 第一步便是熟练使用正则表达式和re模块

    正则表达式:

    1. 概述: 是一种对字符串操作的逻辑, 就是用一种事先定义好的一些特殊字符,及特定字符的组合,组成一个规则字符串,这个规则字符串表示 对字符串的一种过滤逻辑
    2. 字符组: 在同一个位置上可能出现的各种字符组成了一个字符组,在正则表达式中用[] 来表示
      1. [0-9]  所有数字
      2. [a-z]  [A-Z]   [0-9a-fA-F]
    3. 字符:
      . ---- 匹配除换行符意外的任意字符
      w ----匹配任意数字,字母,下划线
      s ----匹配任意的空白符
      d ----匹配数字
      
       ----匹配一个换行符
      	----匹配一个制表符
      ----匹配一个单词的结尾
      ^ ----匹配字符串的开始
      &----匹配字符串的结尾
      W ----匹配任意非数字,字母,下划线
      D----匹配非数字
      S----匹配非空白符
      a|b ----匹配字符a或字符b
      ()匹配括号内的表达式,也表示一个组
      [...] ----匹配字符组中的字符
      [^...] ---匹配除了字符中字符以外的任意字符
    4. 量词
      * 重复零次或多次
      + 出现一次或多次
      ? 重复0次或多次
      {n} 出现n次
      {n,m}出现n到m次
      {n,}出现n次或跟多次
    5. 惰性匹配
      1. 正则默认都是尽量多的匹配, 加上?就是尽量少的匹配
        *? 重复任意次,但尽可能少重复
        +? 重复1次或更多次,但尽可能少重复
        ?? 重复0次或1次,但尽可能少重复
        {n,m}? 重复n到m次,但尽可能少重复
        {n,}? 重复n次以上,但尽可能少重复
        
        . 是任意字符
        * 是取 0 至 无限长度
        ? 是非贪婪模式。
        何在一起就是 取尽量少的任意字符,一般不会这么单独写,他大多用在:
        .*?x
        
        就是取前面任意长度的字符,直到一个x出现
    6. 转义符

    利用re模块实现猫眼电影top100排名爬取

    import requests
    import re
    
    def get_html(url,data):
        ret = requests.get(url, params=data)
        return ret.text
    # re_before = re.compile('<dd>s*.*s*.*?title="(.*?)"')
    
    
    # movies = re.finditer(movie_re, ret)  #找出当前页面十个电影,得到一个可迭代对象
    
    # movie_obj = next(movies).group()  #通过next方法拿到第一个电影
    # print(movie_obj)
    #
    # movie_name = re.findall('s="name".*?title="(.*?)"', movie_obj)  #拿到第一个电影的电影名
    # print(movie_name[0])
    #
    # movie_star = re.findall('s="star">s*(.*?)s*<', movie_obj)   #拿到电影主演
    # print(movie_star[0])
    #
    # movie_releasetime = re.search('s="releasetime">上映时间:(?P<time>.*?)<', movie_obj) #拿到电影时间
    # print(movie_releasetime.group('time'))
    
    def get_info(html_res):
        movie_re = re.compile('<dd>[dD]*?</dd>')
        movies = re.finditer(movie_re, html_res)
    
        for movie_obj in movies:
            movie_obj = movie_obj.group()
            movie_name = re.findall('s="name".*?title="(.*?)"', movie_obj)[0]
            movie_star = re.findall('s="star">s*(.*?)s*<', movie_obj)[0]
            movie_releasetime = re.search('s="releasetime">上映时间:(?P<time>.*?)<', movie_obj).group('time')
            movieinfo = f'电影名:{movie_name},  {movie_star},    上映时间:{movie_releasetime}'
            print(movieinfo)
    
    
    url = 'https://maoyan.com/board/4'
    
    data = {
        'offset':0
    }
    
    for i in range(10):
        data['offset'] = i * 10
        html_res = get_html(url, data)
        get_info(html_res)
  • 相关阅读:
    操作数据库系统(OLTP)和联机分析处理系统(OLAP)的区别
    BI笔记-SSAS部署的几种方式及部署后的SSAS刷新
    概念-数据仓库与元数据
    零基础学Python 3之环境准备
    OFBiz进阶之HelloWorld(五)创建新实体
    OFBIZ bug_create-component ERROR
    OFBIZ bug_ControlServlet.java:233:ERROR
    OFBiz进阶之HelloWorld(三)CRUD操作
    OFBiz进阶之HelloWorld(二)创建热部署模块
    OFBIZ bug_ControlServlet.java:239:ERROR
  • 原文地址:https://www.cnblogs.com/zhangjian0092/p/11215815.html
Copyright © 2011-2022 走看看