一个简单的python爬虫程序 爬取豆瓣热度Top100以内的电影信息


Posted in Python onApril 17, 2018

概述

这是一个简单的python爬虫程序,仅用作技术学习与交流,主要是通过一个简单的实际案例来对网络爬虫有个基础的认识。

什么是网络爬虫

简单的讲,网络爬虫就是模拟人访问web站点的行为来获取有价值的数据。专业的解释:百度百科

分析爬虫需求

确定目标

爬取豆瓣热度在Top100以内的电影的一些信息,包括电影的名称、豆瓣评分、导演、编剧、主演、类型、制片国家/地区、语言、上映日期、片长、IMDb链接等信息。

分析目标

1.借助工具分析目标网页

首先,我们打开豆瓣电影·热门电影,会发现页面总共20部电影,但当查看页面源代码当时候,在源代码中根本找不到这些电影当信息。这是为什么呢?原来豆瓣在这里是通过ajax技术获取电影信息,再动态的将数据加载到页面中的。这就需要借助Chrome的开发者工具,先找到获取电影信息的API。

一个简单的python爬虫程序 爬取豆瓣热度Top100以内的电影信息

然后对电影详情页进行分析

一个简单的python爬虫程序 爬取豆瓣热度Top100以内的电影信息

思路分析

一个简单的python爬虫程序 爬取豆瓣热度Top100以内的电影信息

具体实现

开发环境

python3.6

pycharm

主要依赖库

urllib -- 基础性的网络相关操作

lxml -- 通过xpath语法解析HTML页面

json -- 对通过API获取的JSON数据进行操作

re -- 正则操作

代码实现

from urllib import request
from lxml import etree
import json
import re
import ssl


# 全局取消证书验证
ssl._create_default_https_context = ssl._create_unverified_context


def get_headers():
  """
  返回请求头信息
  :return:
  """
  headers = {
    'User-Agent': "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) "
           "AppleWebKit/537.36 (KHTML, like Gecko) "
           "Chrome/65.0.3325.181 Safari/537.36"
  }
  return headers


def get_url_content(url):
  """
  获取指定url的请求内容
  :param url:
  :return:
  """
  content = ''
  headers = get_headers()
  res = request.Request(url, headers=headers)
  try:
    resp = request.urlopen(res, timeout=10)
    content = resp.read().decode('utf-8')
  except Exception as e:
    print('exception: %s' % e)
  return content


def parse_content(content):
  """
  解析网页
  :param content:
  :return:
  """
  movie = {}
  html = etree.HTML(content)
  try:
    info = html.xpath("//div[@id='info']")[0]
    movie['director'] = info.xpath("./span[1]/span[2]/a/text()")[0]
    movie['screenwriter'] = info.xpath("./span[2]/span[2]/a/text()")[0]
    movie['actors'] = '/'.join(info.xpath("./span[3]/span[2]/a/text()"))
    movie['type'] = '/'.join(info.xpath("./span[@property='v:genre']/"
                      "text()"))
    movie['initialReleaseDate'] = '/'.\
      join(info.xpath(".//span[@property='v:initialReleaseDate']/text()"))
    movie['runtime'] = \
      info.xpath(".//span[@property='v:runtime']/text()")[0]

    def str_strip(s):
      return s.strip()

    def re_parse(key, regex):
      ret = re.search(regex, content)
      movie[key] = str_strip(ret[1]) if ret else ''

    re_parse('region', r'<span class="pl">制片国家/地区:</span>(.*?)<br/>')
    re_parse('language', r'<span class="pl">语言:</span>(.*?)<br/>')
    re_parse('imdb', r'<span class="pl">IMDb链接:</span> <a href="(.*?)" rel="external nofollow" '
             r'target="_blank" >')
  except Exception as e:
    print('解析异常: %s' % e)
  return movie


def spider():
  """
  爬取豆瓣前100部热门电影
  :return:
  """
  recommend_moives = []
  movie_api = 'https://movie.douban.com/j/search_subjects?' \
        'type=movie&tag=%E7%83%AD%E9%97%A8&sort=recommend' \
        '&page_limit=100&page_start=0'
  content = get_url_content(movie_api)
  json_dict = json.loads(content)
  subjects = json_dict['subjects']
  for subject in subjects:
    content = get_url_content(subject['url'])
    movie = parse_content(content)
    movie['title'] = subject['title']
    movie['rate'] = subject['rate']
    recommend_moives.append(movie)
    print(len(recommend_moives))
  print(recommend_moives)


if __name__ == '__main__':
  spider()

效果

一个简单的python爬虫程序 爬取豆瓣热度Top100以内的电影信息总结

本文较详细的阐述了一个爬虫从需求->分析->实现的过程,并给出了具体的代码实现。通过对本文的学习,我们可以了解到网络爬虫的一些基本的知识,以及python的一些基本库的使用方法。接下来我会使用一些高级些的网络操作相关的库以及对抓取到的数据做个存储的方式,来更深层次的理解python网络爬虫。

特别声明

1. 本文涉及到的豆瓣网是国内知名网站,若有侵权之处,请告知。
2. 本文属作者原创,转载请标明出处;未经允许,不得用于商业用途。
3. 本文只是用作网络爬虫技术学习交流,读者涉及到的任何侵权问题,与本文作者无关。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
从零学Python之引用和类属性的初步理解
May 15 Python
Python 列表排序方法reverse、sort、sorted详解
Jan 22 Python
Java多线程编程中ThreadLocal类的用法及深入
Jun 21 Python
Python中标准模块importlib详解
Apr 16 Python
python3 flask实现文件上传功能
Mar 20 Python
python中多个装饰器的执行顺序详解
Oct 08 Python
python从入门到精通 windows安装python图文教程
May 18 Python
django使用haystack调用Elasticsearch实现索引搜索
Jul 24 Python
pytorch实现用Resnet提取特征并保存为txt文件的方法
Aug 20 Python
Tensorflow 模型转换 .pb convert to .lite实例
Feb 12 Python
Python3 读取Word文件方式
Feb 13 Python
Django权限设置及验证方式
May 13 Python
Numpy掩码式数组详解
Apr 17 #Python
对numpy中布尔型数组的处理方法详解
Apr 17 #Python
Python简单实现阿拉伯数字和罗马数字的互相转换功能示例
Apr 17 #Python
python3库numpy数组属性的查看方法
Apr 17 #Python
对python中的for循环和range内置函数详解
Apr 17 #Python
Numpy数组转置的两种实现方法
Apr 17 #Python
详解Django之auth模块(用户认证)
Apr 17 #Python
You might like
PHP数组内存耗用太多问题的解决方法
2010/04/05 PHP
慎用preg_replace危险的/e修饰符(一句话后门常用)
2013/06/19 PHP
PHP中静态变量的使用方法实例分析
2016/12/01 PHP
php获取客户端IP及URL的方法示例
2017/02/03 PHP
CI(CodeIgniter)框架中URL特殊字符处理与SQL注入隐患分析
2019/02/28 PHP
php中关于换行的实例写法
2019/09/26 PHP
Yii框架视图、视图布局、视图数据块操作示例
2019/10/14 PHP
PHPUnit + Laravel单元测试常用技能
2019/11/06 PHP
理解Javascript_11_constructor实现原理
2010/10/18 Javascript
jQuery的deferred对象使用详解
2011/08/20 Javascript
jquery 关于event.target使用的几点说明介绍
2013/04/26 Javascript
Javascript基础知识(三)BOM,DOM总结
2014/09/29 Javascript
超赞的动手创建JavaScript框架的详细教程
2015/06/30 Javascript
使用OpenLayers3 添加地图鼠标右键菜单
2015/12/29 Javascript
JS、jQuery中select的用法详解
2016/04/21 Javascript
分享10个优化代码的CSS和JavaScript工具
2016/05/11 Javascript
ES6小技巧之代替lodash
2019/06/07 Javascript
在vue中使用Echarts利用watch做动态数据渲染操作
2020/07/20 Javascript
通过Python 获取Android设备信息的轻量级框架
2017/12/18 Python
pytorch cuda上tensor的定义 以及减少cpu的操作详解
2020/06/23 Python
Python如何对XML 解析
2020/06/28 Python
一款css实现的鼠标经过按钮的特效
2014/09/11 HTML / CSS
Html5新特性用canvas标签画多条直线附效果截图
2014/06/30 HTML / CSS
详解html5页面 rem 布局适配方法
2018/01/12 HTML / CSS
天巡全球:Skyscanner Global
2017/06/20 全球购物
介绍一下Transact-SQL中SPACE函数的用法
2015/09/01 面试题
儿科护士自我鉴定
2013/10/14 职场文书
政法大学毕业生自荐信范文
2014/01/01 职场文书
经典洗发水广告词
2014/03/13 职场文书
双语教学实施方案
2014/03/23 职场文书
共青团员自我评价范文
2014/09/14 职场文书
2015年社区科普工作总结
2015/05/13 职场文书
毕业证明书
2015/06/19 职场文书
2015秋季开学典礼致辞
2015/07/16 职场文书
Java中CyclicBarrier和CountDownLatch的用法与区别
2021/08/23 Java/Android
Redis唯一ID生成器的实现
2022/07/07 Redis