一个简单的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 快速排序代码
Nov 23 Python
Python中time模块与datetime模块在使用中的不同之处
Nov 24 Python
python魔法方法-属性访问控制详解
Jul 25 Python
利用Python实现原创工具的Logo与Help
Dec 03 Python
对python 命令的-u参数详解
Dec 03 Python
对python中数据集划分函数StratifiedShuffleSplit的使用详解
Dec 11 Python
python实现Dijkstra静态寻路算法
Jan 17 Python
jupyter notebook 中输出pyecharts图实例
Apr 23 Python
Python 的AES加密与解密实现
Jul 09 Python
基于Python实现扑克牌面试题
Dec 11 Python
Python通过2种方法输出带颜色字体
Mar 02 Python
python字典通过值反查键的实现(简洁写法)
Sep 30 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
CentOS6.5 编译安装lnmp环境
2014/12/21 PHP
PHP使用缓存即时输出内容(output buffering)的方法
2015/08/03 PHP
laravel 实现关闭CSRF(全部关闭、部分关闭)
2019/10/21 PHP
一个小型js框架myJSFrame附API使用帮助
2008/06/28 Javascript
jQuery 美元符冲突的解决方法
2010/03/28 Javascript
原生javascript实现图片轮播效果代码
2010/09/03 Javascript
js 完美图片新闻轮转效果,腾讯大粤网首页图片轮转改造而来
2011/11/21 Javascript
使用CSS3的scale实现网页整体缩放
2014/03/18 Javascript
轻松创建nodejs服务器(1):一个简单nodejs服务器例子
2014/12/18 NodeJs
javascript元素动态创建实现方法
2015/05/13 Javascript
jQuery实现dialog设置focus焦点的方法
2015/06/10 Javascript
JS实现不规则TAB选项卡效果代码
2015/09/16 Javascript
Bootstrap基本插件学习笔记之折叠(22)
2016/12/08 Javascript
node.js请求HTTPS报错:UNABLE_TO_VERIFY_LEAF_SIGNATURE\的解决方法
2016/12/18 Javascript
JS获得一个对象的所有属性和方法实例
2017/02/21 Javascript
vue-resource + json-server模拟数据的方法
2017/11/02 Javascript
基于vue开发的在线付费课程应用过程
2018/01/25 Javascript
JavaScript事件委托原理与用法实例分析
2018/06/07 Javascript
vue+springmvc导出excel数据的实现代码
2018/06/27 Javascript
手把手教你用Node.js爬虫爬取网站数据的方法
2018/07/05 Javascript
JS面向对象编程实现的Tab选项卡案例详解
2020/03/03 Javascript
javascript实现贪吃蛇游戏(娱乐版)
2020/08/17 Javascript
Python实现将目录中TXT合并成一个大TXT文件的方法
2015/07/15 Python
总结网络IO模型与select模型的Python实例讲解
2016/06/27 Python
python调用系统ffmpeg实现视频截图、http发送
2018/03/06 Python
pandas.DataFrame选取/排除特定行的方法
2018/07/03 Python
Python Pandas 箱线图的实现
2019/07/23 Python
tensorflow -gpu安装方法(不用自己装cuda,cdnn)
2020/01/20 Python
使用Tensorflow实现可视化中间层和卷积层
2020/01/24 Python
使用CSS3代码绘制可爱的Hello Kitty猫
2016/08/03 HTML / CSS
俄罗斯最大的在线珠宝大卖场:Nebo
2019/12/08 全球购物
售后主管岗位职责
2013/12/08 职场文书
文明学生事迹材料
2014/01/29 职场文书
个人借款担保书
2014/04/02 职场文书
社区党建工作汇报材料
2014/10/27 职场文书
Java 多态分析
2022/04/26 Java/Android