一个简单的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之玩转字符串(2)更新篇
Sep 28 Python
Python+django实现简单的文件上传
Aug 17 Python
python+opencv轮廓检测代码解析
Jan 05 Python
DataFrame中的object转换成float的方法
Apr 10 Python
python logging模块书写日志以及日志分割详解
Jul 22 Python
Python3之字节串bytes与字节数组bytearray的使用详解
Aug 27 Python
Django Admin中增加导出Excel功能过程解析
Sep 04 Python
Python小程序之在图片上加入数字的代码
Nov 26 Python
Python中操作各种多媒体,视频、音频到图片的代码详解
Jun 04 Python
TensorFlow Autodiff自动微分详解
Jul 06 Python
flask项目集成swagger的方法
Dec 09 Python
python实现图像高斯金字塔的示例代码
Dec 11 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调用mysql存储过程
2007/02/14 PHP
php array_intersect比array_diff快(附详细的使用说明)
2011/07/03 PHP
phpize的深入理解
2013/06/03 PHP
PHP实现设计模式中的抽象工厂模式详解
2014/10/11 PHP
php实现的树形结构数据存取类实例
2014/11/29 PHP
php微信公众号开发之秒杀
2018/10/20 PHP
thinkPHP框架RBAC实现原理分析
2019/02/01 PHP
关于递归运算的顺序测试代码
2011/11/30 Javascript
JS实现IE状态栏文字缩放效果代码
2015/10/24 Javascript
Jquery $when done then的用法详解
2016/05/20 Javascript
js实现百度地图定位于地址逆解析,显示自己当前的地理位置
2016/12/08 Javascript
js实现方块上下左右移动效果
2017/08/17 Javascript
IE11下使用canvas.toDataURL报SecurityError错误的解决方法
2017/11/19 Javascript
浅谈Vue-cli 命令行工具分析
2017/11/22 Javascript
vue单页开发父子组件传值思路详解
2018/05/18 Javascript
五分钟搞懂Vuex实用知识(小结)
2019/08/12 Javascript
jQuery 筛选器简单操作示例
2019/10/02 jQuery
[03:02]生活中的Dendi之野外度假篇
2016/08/09 DOTA
python的mysqldb安装步骤详解
2017/08/14 Python
python使用代理ip访问网站的实例
2018/05/07 Python
python递归函数绘制分形树的方法
2018/06/22 Python
python中子类与父类的关系基础知识点
2021/02/02 Python
使用CSS3制作响应式导航菜单的方法
2015/07/12 HTML / CSS
CSS3实现背景透明文字不透明的示例代码
2018/06/25 HTML / CSS
台湾网友喜爱的综合型网路购物商城:Yahoo! 奇摩购物中心
2018/03/10 全球购物
欧舒丹俄罗斯官方网站:L’OCCITANE俄罗斯
2019/11/22 全球购物
西雅图电动自行车公司:Rad Power Bikes
2020/02/02 全球购物
应届生财务会计求职信
2013/11/05 职场文书
《搭石》教学反思
2014/04/07 职场文书
建筑投标担保书
2014/05/20 职场文书
项目申报专员岗位职责
2014/07/09 职场文书
校庆团日活动总结
2014/08/28 职场文书
2014乡镇党委副书记对照检查材料思想汇报
2014/10/09 职场文书
债务纠纷代理词
2015/05/25 职场文书
技能培训通讯稿
2015/07/18 职场文书
《大禹治水》教学反思
2016/02/22 职场文书