一个简单的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 相关文章推荐
Windows8下安装Python的BeautifulSoup
Jan 22 Python
一键搞定python连接mysql驱动有关问题(windows版本)
Apr 23 Python
Python3中使用PyMongo的方法详解
Jul 28 Python
浅谈flask截获所有访问及before/after_request修饰器
Jan 18 Python
浅谈使用Python内置函数getattr实现分发模式
Jan 22 Python
使用matplotlib画散点图的方法
May 25 Python
Python提取支付宝和微信支付二维码的示例代码
Feb 15 Python
使用Python检测文章抄袭及去重算法原理解析
Jun 14 Python
python中列表的切片与修改知识点总结
Jul 23 Python
Python常用模块os.path之文件及路径操作方法
Dec 03 Python
pytorch载入预训练模型后,实现训练指定层
Jan 06 Python
浅谈Python 中的复数问题
May 19 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
德劲1104的电路分析与改良
2021/03/01 无线电
PHP实现网站应用微信登录功能详解
2019/04/11 PHP
laravel按天、按小时,查询数据的实例
2019/10/09 PHP
webapp框架AngularUI的demo改造之路
2014/12/21 Javascript
原生javascript实现DIV拖拽并计算重复面积
2015/01/02 Javascript
基于javascript实现listbox左右移动
2016/01/29 Javascript
jQuery实现选项联动轮播效果【附实例】
2016/04/19 Javascript
JavaScript将DOM事件处理程序封装为event.js 出现的低级错误问题
2016/08/03 Javascript
基于jQuery的checkbox全选问题分析
2016/11/18 Javascript
nodejs使用express创建一个简单web应用
2017/03/31 NodeJs
详解ES6之async+await 同步/异步方案
2017/09/19 Javascript
JS获取数组中出现次数最多及第二多元素的方法
2017/10/27 Javascript
利用JQUERY实现多个AJAX请求等待的实例
2017/12/14 jQuery
vue实现样式之间的切换及vue动态样式的实现方法
2017/12/19 Javascript
JS加密插件CryptoJS实现AES加密操作示例
2018/08/16 Javascript
antd table按表格里的日期去排序操作
2020/11/17 Javascript
[04:55]完美世界副总裁蔡玮:DOTA2的自由、公平与信任
2013/12/18 DOTA
[03:42]2014DOTA2西雅图国际邀请赛 Navi战队巡礼
2014/07/07 DOTA
[40:56]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 Liquid vs TNC
2018/04/01 DOTA
常见的在Python中实现单例模式的三种方法
2015/04/08 Python
Python实现中文数字转换为阿拉伯数字的方法示例
2017/05/26 Python
python 读取摄像头数据并保存的实例
2018/08/03 Python
Python中判断子串存在的性能比较及分析总结
2019/06/23 Python
对django的User模型和四种扩展/重写方法小结
2019/08/17 Python
python中设置超时跳过,超时退出的方式
2019/12/13 Python
Python使用uuid库生成唯一标识ID
2020/02/12 Python
python 项目目录结构设置
2020/02/14 Python
完美解决keras保存好的model不能成功加载问题
2020/06/11 Python
Win10下配置tensorflow-gpu的详细教程(无VS2015/2017)
2020/07/14 Python
python RSA加密的示例
2020/12/09 Python
美国折衷生活方式品牌:Robert Graham
2018/07/13 全球购物
中国领先的汽车保养服务平台:途虎养车
2019/10/18 全球购物
幼儿园教师岗位职责
2014/03/17 职场文书
质量承诺书范文
2014/03/27 职场文书
经济贸易系求职信
2014/08/04 职场文书
Redis特殊数据类型bitmap位图
2022/06/01 Redis