一个简单的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简单实现自动删除目录下空文件夹的方法
Aug 29 Python
Python定时器实例代码
Nov 01 Python
Python读取txt内容写入xls格式excel中的方法
Oct 11 Python
详解python:time模块用法
Mar 25 Python
10招!看骨灰级Pythoner玩转Python的方法
Apr 15 Python
Python笔记之工厂模式
Nov 20 Python
使用python去除图片白色像素的实例
Dec 12 Python
Keras使用tensorboard显示训练过程的实例
Feb 15 Python
Python 窗体(tkinter)下拉列表框(Combobox)实例
Mar 04 Python
Python字典dict常用方法函数实例
Nov 09 Python
python3 kubernetes api的使用示例
Jan 12 Python
python通配符之glob模块的使用详解
Apr 24 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中serialize序列化与json性能测试的示例分析
2013/04/27 PHP
PHP查询并删除数据库多列重复数据的方法(利用数组函数实现)
2016/02/23 PHP
PHP实现执行外部程序的方法详解
2017/08/17 PHP
swoole_process实现进程池的方法示例
2018/10/29 PHP
一个XML格式数据转换为图表的例子
2010/02/09 Javascript
计算世界完全对称日的js代码,粗糙版
2011/11/04 Javascript
jquery移动listbox的值原理及代码
2013/05/03 Javascript
多个datatable共存造成多个表格的checkbox都被选中
2013/07/11 Javascript
Javascript函数式编程语言
2015/10/11 Javascript
探究JavaScript函数式编程的乐趣
2015/12/14 Javascript
Bootstrap缩略图与警告框学习使用
2017/02/08 Javascript
JS与jQuery实现子窗口获取父窗口元素值的方法
2017/04/17 jQuery
使用validate.js实现表单数据提交前的验证方法
2018/09/04 Javascript
Puppeteer环境搭建的详细步骤
2018/09/21 Javascript
windows实现npm和cnpm安装步骤
2019/10/24 Javascript
Threejs实现滴滴官网首页地球动画功能
2020/07/13 Javascript
[56:18]DOTA2上海特级锦标赛主赛事日 - 4 败者组第四轮#2 MVP.Phx VS Fnatic第二局
2016/03/05 DOTA
[36:13]Mineski vs iG 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
python实现域名系统(DNS)正向查询的方法
2016/04/19 Python
Python HTMLTestRunner可视化报告实现过程解析
2020/04/10 Python
python爬虫多次请求超时的几种重试方法(6种)
2020/12/01 Python
解决margin 外边距合并问题
2019/07/03 HTML / CSS
详解HTML5中的拖放事件(Drag 和 drop)
2016/11/14 HTML / CSS
html5实现移动端适配完美写法
2017/11/16 HTML / CSS
华纳兄弟工作室的官方授权商店:WB Shop
2018/11/30 全球购物
简历里的自我评价
2014/01/31 职场文书
居委会四风问题个人对照检查材料
2014/09/25 职场文书
医院领导班子四风对照检查材料
2014/09/27 职场文书
前台文员岗位职责
2015/02/04 职场文书
学校勤俭节约倡议书
2015/04/29 职场文书
房屋维修申请报告
2015/05/18 职场文书
2015法院个人工作总结范文
2015/05/25 职场文书
创业计划书之废品回收
2019/09/26 职场文书
经典哲理警句:志不真则心不热,心不热则功不贤
2019/11/14 职场文书
游戏开发中如何使用CocosCreator进行音效处理
2021/04/14 Javascript
3050和2060哪个好 性能差多少 差距有多大 谁更有性价比
2022/06/17 数码科技