一个简单的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实现数据库编程方法详解
Jun 09 Python
Python简单实现enum功能的方法
Apr 25 Python
深入理解Python中的内置常量
May 20 Python
python爬虫入门教程--利用requests构建知乎API(三)
May 25 Python
解决Django模板无法使用perms变量问题的方法
Sep 10 Python
python numpy函数中的linspace创建等差数列详解
Oct 13 Python
详解Python使用tensorflow入门指南
Feb 09 Python
Python并行分布式框架Celery详解
Oct 15 Python
python实现两个经纬度点之间的距离和方位角的方法
Jul 05 Python
python创建n行m列数组示例
Dec 02 Python
Pandas将列表(List)转换为数据框(Dataframe)
Apr 24 Python
Python监听键盘和鼠标事件的示例代码
Nov 18 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 Google的translate API代码
2008/12/10 PHP
深入Nginx + PHP 缓存详解
2013/07/11 PHP
PHP session文件独占锁引起阻塞问题解决方法
2015/05/12 PHP
JavaScript进阶教程(第四课第一部分)
2007/04/05 Javascript
JavaScript实现动态添加,删除行的方法实例详解
2015/07/02 Javascript
理解JS事件循环
2016/01/07 Javascript
jQuery获取同级元素的简单代码
2016/07/09 Javascript
使用DeviceOne实现微信小程序功能
2016/12/29 Javascript
说说node中的可读流和可写流的区别
2018/06/01 Javascript
在vue中更换字体,本地存储字体非引用在线字体库的方法
2018/09/28 Javascript
cocos2dx+lua实现橡皮擦功能
2018/12/20 Javascript
在Echarts图中给坐标轴加一个标识线markLine
2020/07/20 Javascript
JS中多层次排序算法的实现代码
2021/01/06 Javascript
Python实现的简单发送邮件脚本分享
2014/11/07 Python
浅谈numpy中linspace的用法 (等差数列创建函数)
2017/06/07 Python
python实现跨excel的工作表sheet之间的复制方法
2018/05/03 Python
基于python log取对数详解
2018/06/08 Python
详解Python 数据库的Connection、Cursor两大对象
2018/06/25 Python
Python中使用双下划线防止类属性被覆盖问题
2019/06/27 Python
python交易记录整合交易类详解
2019/07/03 Python
django中间键重定向实例方法
2019/11/10 Python
多重CSS背景动画实现方法示例
2014/04/04 HTML / CSS
Html5 webRTC简单实现视频调用的示例代码
2020/09/23 HTML / CSS
美国鞋类购物网站:Shiekh Shoes
2016/08/21 全球购物
伦敦所有西区剧院演出官方票务代理:Theatre Tickets Direct
2017/05/26 全球购物
Servlet面试题库
2015/07/18 面试题
人事主管的岗位职责
2013/11/16 职场文书
企划经理的岗位职责
2013/11/17 职场文书
教师评优事迹材料
2014/01/10 职场文书
党员廉洁自律承诺书
2014/05/26 职场文书
2015迎新晚会开场白
2015/07/17 职场文书
严以用权学习心得体会
2016/01/12 职场文书
nginx前后端同域名配置的方法实现
2021/03/31 Servers
python如何获取网络数据
2021/04/11 Python
python基础之文件处理知识总结
2021/05/23 Python
MySQL索引 高效获取数据的数据结构
2022/05/02 MySQL