【python+爬虫】爬去猫眼电影前100名具体信息

版权声明:可以转载奥 https://blog.csdn.net/Jiajikang_jjk/article/details/82777246

爬去猫眼电影前100名具体信息

准备工作

1:requests,json,time,re库
2:python3.x
3:pycharm
4:在线正则表达式测试网址
http://tool.oschina.net/regex/
说明:
博主使用的是python3.6,windows10操作系统

正文

1.目的

爬去猫眼电影前100的具体信息

2. 思路分析
此次使用requests和正则表达式
1:爬起的目标
   http://maoyan.com/board/4
2:安装request库
3:对于每页的分析:每页具有十个电影:n-->n+1-->n+10
4: 爬去首页

    a: 定义一个函数--获取响应头
    b: 定义一个主函数---获取请求链接
    c: 获取主页面源代码
5:正则表达式---提取电影信息

   a:通过查看网页月源代码获取每一个电影信息都在<dd></dd>中
   b: 在class 为board-index的i节点内: <i class="board-index board-index-2">2</i>
   所以得到的正则表达式:<dd>.*?board-index.*?>(.*?)</i>
   c:提取电影的图片
      <a href="/films/1203" title="霸王别姬" class="image-link" data-act="boarditem-click" data-val="{movieId:1203}">
      <img src="//ms0.meituan.net/mywww/image/loading_2.e3d934bf.png" alt="" class="poster-default" />
      <img data-src="http://p1.meituan.net/movie/20803f59291c47e1e116c11963ce019e68711.jpg@160w_220h_1e_1c" alt="霸王别姬" class="board-img" />
      </a>
      分析:a节点--->图片2-->data-src属性
      更新正则表达式:<dd>.*?board-index.*?>(.*?)</i>.*?data-src="(.*?)"

  d:提取电影的名称
    <p class="name"><a href="/films/1203" title="霸王别姬" data-act="boarditem-click" data-val="{movieId:1203}">霸王别姬</a></p>
    在p节点内,class=name-->name作为标志位-->a节点的正文内容
    更新正则表达式:<dd>.*?board-index.*?>(.*?)</i>.*?data-src="(.*?)".*?name.*?a.*?>(.*?)</a>

  e:提取主演,发布时间,评分等内容时,同样的原理
         主演:
         <p class="star">主演:张国荣,张丰毅,巩俐 </p>
         上映时间:
         <p class="releasetime">上映时间:1993-01-01</p>    </div>
         评分:
         <div class="movie-item-number score-num">
         <p class="score"><i class="integer">9.</i><i class="fraction">6</i></p>
            </div>
      更新正则表达式:
      <dd>.*?board-index.*?>(\d+)</i>.*?data-src="(.*?)".*?name"><a'
                         + '.*?>(.*?)</a>.*?star">(.*?)</p>.*?releasetime">(.*?)</p>'
                         + '.*?integer">(.*?)</i>.*?fraction">(.*?)</i>.*?</dd>
  f: 调用findall()方法提取所以的内容
      定义一个函数:解析获取的页面
      生成的结果以字典的形式输出


6:写入文件
   1:对于第5步已经获取到了以字典形成
   2:进行写一个写入文件的函数

7:获取前n排名
   在第6步中已经实现了首页的爬去,现在要获取前n(100)名,需要进行遍历
   在主函数中进行一个for i range(n):
                      main(offset=i*10)

8: 为防止反爬虫,增加一个演示等待
3.具体代码
"""
 author:jjk
 datetime:2018/9/19
 coding:utf-8
 project name:Pycharm_workstation
 Program function: 爬去猫眼电影排行榜
 
"""
import requests
import re # 正则表达式
from requests.exceptions import RequestException # 抛出异常
import json
import time

# 获取响应头(获取首页)
def get_one_page(url):
    try:
        # 响应头
        headers = {
            'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.162 Safari/537.36'
        }
        # get()请求获取
        response = requests.get(url, headers=headers)
        # 进行一个判断是否请求成功
        if response.status_code == 200:
            return response.text
        return None
    except RequestException:
        return None


# 第二步:解析页面
def parse_one_page(html):
    # 使用compile()方法选取需要的内容,re.S是包含换行在内的所有字符
    pattern = re.compile('<dd>.*?board-index.*?>(\d+)</i>.*?data-src="(.*?)".*?name"><a'
                         + '.*?>(.*?)</a>.*?star">(.*?)</p>.*?releasetime">(.*?)</p>'
                         + '.*?integer">(.*?)</i>.*?fraction">(.*?)</i>.*?</dd>', re.S)
    # findall()使用正则表达式进行对获取的源代码进行筛选需要的部分
    items = re.findall(pattern,html)
    # 获取筛选的信息,输出结果是一个列表的形式
    # print(items)
    # 遍历列表以字典的形式输出
    for item in items:
        yield{
            'index': item[0],
            'image': item[1],
            'title': item[2],
            'actor': item[3].strip()[3:],
            'time': item[4].strip()[5:],
            'score': item[5] + item[6]
        }

# 第三步:进行写入文件-保存
def write_to_file(content):
    # 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
    with open('content.txt', 'a', encoding='utf-8') as f:
        # 以json库中的dumps()实现字典的序列化,ensure_ascii=False确保为中文形式而不是Unicode编码
        f.write(json.dumps(content,ensure_ascii=False) + '\n')

# 主函数
def main(offset):
    # 需要爬去的链接
    url = 'http://maoyan.com/board/4?offset=' +str(offset)
    # 调用get_one_page()方法进行请求响应
    html = get_one_page(url)
    # 获取html页面源代码
    # print(html)
    # 调用parse_onepage()方法进行解析页面
    # parse_one_page(html)
    # 遍历parse_one_page(html)方法以字典形式输出
    for item in parse_one_page(html):
        print(item)
        write_to_file(item)

# 执行主函数
if __name__ == '__main__':
    for i in range(10):
        main(offset=i*10)
        # 延时等待
        time.sleep(1)
4.结果

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Jiajikang_jjk/article/details/82777246