一个简单的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 相关文章推荐
400多行Python代码实现了一个FTP服务器
May 10 Python
在Python中操作列表之List.append()方法的使用
May 20 Python
Eclipse中Python开发环境搭建简单教程
Mar 23 Python
利用python批量检查网站的可用性
Sep 09 Python
Python 多进程并发操作中进程池Pool的实例
Nov 01 Python
python获取多线程及子线程的返回值
Nov 15 Python
python的exec、eval使用分析
Dec 11 Python
详解Python网络框架Django和Scrapy安装指南
Apr 01 Python
Python + Requests + Unittest接口自动化测试实例分析
Dec 12 Python
IronPython连接MySQL的方法步骤
Dec 27 Python
浅谈python之自动化运维(Paramiko)
Jan 31 Python
利用python进行数据加载
Jun 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
如何做到多笔资料的同步
2006/10/09 PHP
PHP 源代码压缩小工具
2009/12/22 PHP
PHP+Mysql+jQuery实现发布微博程序 jQuery篇
2011/10/08 PHP
php 流程控制switch的简单实例
2016/06/07 PHP
php实现文件上传及头像预览功能
2017/01/15 PHP
PHP获取对象属性的三种方法实例分析
2019/01/03 PHP
input 输入框获得/失去焦点时隐藏/显示文字(jquery版)
2013/04/02 Javascript
JavaScript调用后台的三种方法实例
2013/10/17 Javascript
js实现五星评价功能
2017/03/08 Javascript
bootstrap基本配置_动力节点Java学院整理
2017/07/14 Javascript
基于jQuery的$.getScript方法去加载javaScript文档解析
2017/11/08 jQuery
详解Nodejs mongoose
2018/06/10 NodeJs
解决vue-cli项目开发运行时内存暴涨卡死电脑问题
2019/10/29 Javascript
[01:21]DOTA2新纪元-7.0新版本即将开启!
2016/12/11 DOTA
Python编写百度贴吧的简单爬虫
2015/04/02 Python
Python自动登录126邮箱的方法
2015/07/10 Python
Python遍历目录中的所有文件的方法
2016/07/08 Python
python实现解数独程序代码
2017/04/12 Python
matplotlib在python上绘制3D散点图实例详解
2017/12/09 Python
Pandas读取MySQL数据到DataFrame的方法
2018/07/25 Python
Python秒算24点实现及原理详解
2019/07/29 Python
解决python replace函数替换无效问题
2020/01/18 Python
Pycharm debug调试时带参数过程解析
2020/02/03 Python
python数据库编程 Mysql实现通讯录
2020/03/27 Python
python不同系统中打开方法
2020/06/23 Python
HTML5本地存储之Database Storage应用介绍
2013/01/06 HTML / CSS
英国乐购杂货:Tesco Groceries
2018/11/29 全球购物
英国最大的户外商店:Go Outdoors
2019/04/17 全球购物
Noon埃及:埃及在线购物
2019/11/26 全球购物
教师产假请假条范文
2014/04/10 职场文书
品德评语大全
2014/05/05 职场文书
2014优秀党员事迹材料
2014/08/14 职场文书
优秀教师个人总结
2015/02/11 职场文书
公司副总经理岗位职责
2015/04/08 职场文书
Java Dubbo框架知识点梳理
2021/06/26 Java/Android
详解PyTorch模型保存与加载
2022/04/28 Python