一个简单的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编写一个国际象棋AI程序
Nov 28 Python
Python常用小技巧总结
Jun 01 Python
使用Python3 编写简单信用卡管理程序
Dec 21 Python
python机器学习之随机森林(七)
Mar 26 Python
快速解决安装python没有scripts文件夹的问题
Apr 03 Python
Python基于更相减损术实现求解最大公约数的方法
Apr 04 Python
python中pylint使用方法(pylint代码检查)
Apr 06 Python
如何基于python3和Vue实现AES数据加密
Mar 27 Python
django模板获取list中指定索引的值方式
May 14 Python
详解python UDP 编程
Aug 24 Python
Selenium 配置启动项参数的方法
Dec 04 Python
python基础入门之字典和集合
Jun 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
Yii使用find findAll查找出指定字段的实现方法
2014/09/05 PHP
php分页函数完整实例代码
2014/09/22 PHP
Yii中使用PHPExcel导出Excel的方法
2014/12/26 PHP
PHP中is_dir()函数使用指南
2015/05/08 PHP
PHP简单实现正则匹配省市区的方法
2018/04/13 PHP
重定向实现代码
2006/11/20 Javascript
跨域表单提交状态的变相判断代码
2009/11/12 Javascript
dess中一个简单的多路委托的实现
2010/07/20 Javascript
jquery弹出框的用法示例(2)
2013/08/26 Javascript
你有必要知道的25个JavaScript面试题
2015/12/29 Javascript
你一定会收藏的Nodejs代码片段
2016/02/04 NodeJs
微信小程序 for 循环详解
2016/10/09 Javascript
Bootstrap CSS组件之面包屑导航(breadcrumb)
2016/12/17 Javascript
Vue实现todolist删除功能
2018/06/26 Javascript
创建echart多个联动的示例代码
2018/11/23 Javascript
Vue实现回到顶部和底部动画效果
2019/07/31 Javascript
JS实现音量控制拖动
2020/01/15 Javascript
Python探索之pLSA实现代码
2017/10/25 Python
Python中对象的引用与复制代码示例
2017/12/04 Python
基于python批量处理dat文件及科学计算方法详解
2018/05/08 Python
python numpy格式化打印的实例
2018/05/14 Python
Python实现快速计算词频功能示例
2018/06/25 Python
python3.6利用pyinstall打包py为exe的操作实例
2018/10/31 Python
python ipset管理 增删白名单的方法
2019/01/14 Python
Python txt文件加入字典并查询的方法
2019/01/15 Python
python调用支付宝支付接口流程
2019/08/15 Python
django重新生成数据库中的某张表方法
2019/08/28 Python
解决python 找不到module的问题
2020/02/12 Python
会计电算化应届生求职信
2013/11/03 职场文书
网上快餐厅创业计划书
2014/02/01 职场文书
学习经验演讲稿
2014/05/10 职场文书
高三复习计划
2015/01/19 职场文书
2015年办公室工作总结范文
2015/03/31 职场文书
600字作文之感受大自然
2019/11/27 职场文书
详解Redis瘦身指南
2021/05/26 Redis
python可视化大屏库big_screen示例详解
2021/11/23 Python