python爬虫实战 获取豆瓣排名前250的电影信息--基于正则表达式

gj5379 2021-09-01 原文


python爬虫实战 获取豆瓣排名前250的电影信息–基于正则表达式

一、项目目标

  爬取豆瓣TOP250电影的评分、评价人数、短评等信息,并在其保存在txt文件中,html解析方式基于正则表达式

二、确定页面内容  

  爬虫地址:https://movie.douban.com/top250

  确定爬取内容:视频链接,视频名称,导演/主演名称,视频评分,视频简介,评价人数等信息

  打开网页,按F12键,可获取以下界面信息

 

  

   观察可知,每一部视频的详细信息都存放在li标签中

  每部视频的视频名称在 class属性值为title 的span标签里,视频名称有可能有多个(中英文); 

  每部视频的评分在对应li标签里的(唯一)一个 class属性值为rating_num 的span标签里;

  每部视频的评价人数在 对应li标签 里的一个 class属性值为star 的div标签中 的最后一个数字;

  每部视频的链接在对应li标签里的一个a标签里

  每部视频的简介在对应li标签里的一个class属性值为ing的标签里

python 代码如下:

  

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2017/12/1 15:55
# @Author  : gj
# @Site    : 
# @File    : test_class.py
# @Software: PyCharm

import urllib2,re,threading

\'\'\'
伪造头信息
\'\'\'
def Get_header():
    headers = {
        \'USER_AGENT\': \'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_3) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.54 Safari/536.5\'
    }
    return headers

\'\'\'
获取页面内容
\'\'\'

def Spider(url,header):
    req = urllib2.Request(url=url,headers=header)
    html = urllib2.urlopen(req)
    info = html.read()
    return info



def Analyse(infos):
    pattern = re.compile(\'<ol class="grid_view">(.*?)</ol>\',re.S)
    info = pattern.findall(infos)
    pattern = re.compile("<li>(.*?)</li>",re.S)
    movie_infos = pattern.findall(info[0])
    movie=[]
    for movie_info in movie_infos:
        movie_temp=[]
        url = ""
        title=""
        director=""
        score=""
        peoples=""
        inq=""
        #获取链接地址
        pattern_url = re.compile(\'<a href="(.*?)" class="">\')
        movie_urls = pattern.findall(movie_info)
        for movie_url in movie_urls:
            url = url+movie_url
        movie_temp.append(url)

        # 获取视频名称
        pattern_title = re.compile(\'<span class="title">(.*?)</span>\')
        movie_titles = pattern_title.findall(movie_info)
        for movie_title in movie_titles:
            title = title+movie_title
        movie_temp.append(title)

        # 获取视频演员表
        pattern_director = re.compile(\'<p class="">(.*?)<br>\',re.S)
        movie_directors = pattern_director.findall(movie_info)
        for movie_director in movie_directors:
            director = director+movie_director
        movie_temp.append(director)

        #获取视频评分
        pattern_score = re.compile(\'<div class="star">.*?<span class="rating_num" property="v:average">(.*?)</span>.*?<span>(.*?)</span>.*?</div>\',re.S)
        movie_scores = pattern_score.findall(movie_info)
        for movie_score in movie_scores:
            score = movie_score[0]
            peoples = movie_score[1]
            break
        movie_temp.append(score)
        movie_temp.append(peoples)

        # 获取视频简介
        pattern_inq = re.compile(\'<p class="quote">.*?<span class="inq">(.*?)</span>.*?</p>\',re.S)
        movie_inqs = pattern_inq.findall(movie_info)
        if len(movie_inqs)>0:
            inq = movie_inqs[0]
        else:
            inq =\'该视频无简介\'
        movie_temp.append(inq)
        movie.append(movie_temp)
    return movie

\'\'\'
将返回内容写入文件
\'\'\'
def write_file(infos):
    #防止多个线程写文件造成数据错乱
    mutex.acquire()
    with open("./movie.txt","ab") as f:
        for info in infos:
            write_info = ""
            for i in range(0,len(info)):
                info[i] = info[i].replace("\n","")
                write_info = write_info+info[i]+"   "
            write_info= write_info+"\n"
            f.write(write_info)
    mutex.release()


def start(i):
    url = "https://movie.douban.com/top250?start=%d&filter="%(i*25)
    headers = Get_header()
    infos= Spider(url,headers)
    movie_infos = Analyse(infos)
    write_file(movie_infos)


def main():
    #创建多线程
    Thread = []
    for i in range(0,10):
        t=threading.Thread(target=start,args=(i,))
        Thread.append(t)
    for i in range(0,10):
        Thread[i].start()
    for i in range(0,10):
        Thread[i].join()
if __name__ == "__main__":
    #加锁
    mutex = threading.Lock()
    main()

最终结果会在当前目录下生成一个movie.txt txt中记录了每部视频的相关信息,大概格式如下(没有过多的调整文件格式,这里面可以写入mysql,或者写入execl中,更加方便查看)

 

  以上就是基于正则表达式来获取豆瓣排名钱250的电影信息的爬虫原理及简单脚本。

 

发表于
2017-12-06 10:57 
神经质的狗 
阅读(432
评论(0
编辑 
收藏 
举报

 

版权声明:本文为gj5379原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/gj5379/p/7985412.html

python爬虫实战 获取豆瓣排名前250的电影信息--基于正则表达式的更多相关文章

  1. Python爬虫实战(中):数据可视化-教你做出漂亮的图表

    本文来源于公众号【程序猿声】,作者向柯玮 前言 各位看客老爷们,我又来啦。上一期我们利用Python+百度地图 […]...

  2. python爬虫实战——豆瓣电影TOP250

    一. 准备工作 网页分析 首先对豆瓣电影的网页URL进行分析: 豆瓣电影TOP250的首页是https://m […]...

随机推荐

  1. PowerDesigner导出数据表结构到Excel 一个表一个Sheet 带链接目录

       Option Explicit Dim rowsNum rowsNum = 0 \'---------- […]...

  2. hadoop学习笔记(七):hadoop2.x的高可用HA(high avaliable)和联邦F(Federation)

    Hadoop介绍——HA与联邦 0.1682019.06.04 13:30:55字数 820阅读 138 Ha […]...

  3. Spring Boot 中使用自定义注解,AOP 切面打印出入参日志及Dubbo链路追踪透传traceId

    一、使用背景 开发排查系统问题用得最多的手段就是查看系统日志,在分布式环境中一般使用 ELK 来统一收集日志, […]...

  4. OCR 基本知识

    OCR,optical character recognition 的简称,也就是光学识别系统,属于图形识别的 […]...

  5. java swing组件一览(图)

    不想废话直接上干货(visio版需要源文件请留言)...

  6. 深入理解Loadrunner中的Browser Emulation

    一:基本介绍 在Loadrunner的使用中,对于Run-time Settings下的browser emu […]...

  7. JVM 垃圾回收算法和垃圾回收器

    JVM 垃圾回收算法和垃圾回收器。 一、垃圾回收的区域 栈:栈中的生命周期是跟随线程,所以一般不需要关注。 堆 […]...

  8. http,socks4,socks5代理的区别

    HTTP代理 能够代理客户机的HTTP访问,主要是代理浏览器访问网页,它的端口一般为80、8080、3128等 […]...

展开目录

目录导航