一个简单的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之for循环语句
Oct 02 Python
python 平衡二叉树实现代码示例
Jul 07 Python
在Python中关于使用os模块遍历目录的实现方法
Jan 03 Python
详解python调用cmd命令三种方法
Jul 08 Python
Python学习笔记之lambda表达式用法详解
Aug 08 Python
Django自定义模板过滤器和标签的实现方法
Aug 21 Python
使用python+whoosh实现全文检索
Dec 09 Python
python 使用opencv 把视频分割成图片示例
Dec 12 Python
如何在Windows中安装多个python解释器
Jun 16 Python
python 实现控制鼠标键盘
Nov 27 Python
Python基础之赋值,浅拷贝,深拷贝的区别
Apr 30 Python
Python深度学习之Pytorch初步使用
May 20 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下利用curl判断远程文件是否存在的实现代码
2011/10/08 PHP
PHP URL参数获取方式的四种例子
2014/02/28 PHP
详解WordPress开发中wp_title()函数的用法
2016/01/07 PHP
php封装的图片(缩略图)处理类完整实例
2016/10/19 PHP
PHP预定义超全局数组变量小结
2018/08/20 PHP
Laravel框架中集成MongoDB和使用详解
2019/10/17 PHP
TNC vs RR BO3 第一场 2.14
2021/03/10 DOTA
javascript 进阶篇3 Ajax 、JSON、 Prototype介绍
2012/03/14 Javascript
让低版本浏览器支持input的placeholder属性(js方法)
2013/04/03 Javascript
js点击button按钮跳转到另一个新页面
2014/10/10 Javascript
基于jQuery实现的文字按钮表单特效整理
2014/12/07 Javascript
js组件SlotMachine实现图片切换效果制作抽奖系统
2016/04/17 Javascript
结合代码图文讲解JavaScript中的作用域与作用域链
2016/07/05 Javascript
AngularJs IE Compatibility 兼容老版本IE
2016/09/01 Javascript
jQuery的ajax中使用FormData实现页面无刷新上传功能
2017/01/16 Javascript
echarts多条折线图动态分层的实现方法
2019/05/24 Javascript
JS开发 富文本编辑器TinyMCE详解
2019/07/19 Javascript
vue中的过滤器及其时间格式化问题
2020/04/09 Javascript
学习 Vue.js 遇到的那些坑
2021/02/02 Vue.js
对于Python编程中一些重用与缩减的建议
2015/04/14 Python
高效使用Python字典的清单
2018/04/04 Python
python中的json总结
2018/10/11 Python
Python2和Python3.6环境解决共存问题
2018/11/09 Python
Python将字符串常量转化为变量方法总结
2019/03/17 Python
Python实现的多进程拷贝文件并显示百分比功能示例
2019/04/09 Python
Python爬虫:将headers请求头字符串转为字典的方法
2019/08/21 Python
利用Tensorflow构建和训练自己的CNN来做简单的验证码识别方式
2020/01/20 Python
python 爬取疫情数据的源码
2020/02/09 Python
解决keras使用cov1D函数的输入问题
2020/06/29 Python
I.T中国官网:精选时尚设计师单品网购平台
2018/03/26 全球购物
大学生应聘自荐信
2013/10/11 职场文书
设计专业毕业生求职信
2014/06/25 职场文书
公司授权委托书格式样本
2014/10/01 职场文书
小学英语教学反思范文
2016/02/15 职场文书
Python实战之OpenCV实现猫脸检测
2021/06/26 Python
CSS中float高度塌陷问题的四种解决方案
2022/04/18 HTML / CSS