进击的爬虫-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)
原文地址:https://www.cnblogs.com/zhangjian0092/p/11215815.html