一个简单的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系列之从文件读取和保存数据
May 23 Python
在Python中操作文件之truncate()方法的使用教程
May 25 Python
浅析python实现scrapy定时执行爬虫
Mar 04 Python
对Python中数组的几种使用方法总结
Jun 28 Python
浅谈python中str字符串和unicode对象字符串的拼接问题
Dec 04 Python
Python基于matplotlib画箱体图检验异常值操作示例【附xls数据文件下载】
Jan 07 Python
python3 dict ndarray 存成json,并保留原数据精度的实例
Dec 06 Python
Python面向对象封装操作案例详解
Dec 31 Python
pycharm软件实现设置自动保存操作
Jun 08 Python
python 操作excel表格的方法
Dec 05 Python
详解用Python把PDF转为Word方法总结
Apr 27 Python
一小时学会TensorFlow2之基本操作2实例代码
Sep 04 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 tp验证表单与自动填充函数代码
2012/02/22 PHP
免费的ip数据库淘宝IP地址库简介和PHP调用实例
2014/04/08 PHP
Zend Framework框架路由机制代码分析
2016/03/22 PHP
JavaScript 格式字符串的应用
2010/03/29 Javascript
Javascript 静态页面实现随机显示广告的办法
2010/11/17 Javascript
基于jQuery的简单的列表导航菜单
2011/03/02 Javascript
JQuery 1.6发布 性能提升,同时包含大量破坏性变更
2011/05/10 Javascript
Javascript new Date().valueOf()的作用与时间戳由来详解
2013/04/24 Javascript
jQuery实现图片放大预览实现原理及代码
2013/09/12 Javascript
js整数字符串转换为金额类型数据(示例代码)
2013/12/26 Javascript
七个很有意思的PHP函数
2014/05/12 Javascript
浅析JavaScript中的事件机制
2015/06/04 Javascript
js querySelector() 使用方法
2016/12/21 Javascript
微信禁止下拉查看URL的处理方法
2017/09/28 Javascript
深入浅析javascript继承体系
2017/10/23 Javascript
浅谈react受控组件与非受控组件(小结)
2018/02/09 Javascript
关于Angularjs中跨域设置白名单问题
2018/04/17 Javascript
解决LayUI表单获取不到data的问题
2018/08/20 Javascript
[44:40]KG vs LGD 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
Python多进程同步Lock、Semaphore、Event实例
2014/11/21 Python
Python 实现某个功能每隔一段时间被执行一次的功能方法
2018/10/14 Python
pandas dataframe的合并实现(append, merge, concat)
2019/06/24 Python
Django {{ MEDIA_URL }}无法显示图片的解决方式
2020/04/07 Python
Python虚拟环境的创建和使用详解
2020/09/07 Python
HTML5实现可缩放时钟代码
2017/08/28 HTML / CSS
web字体加载方案优化小结
2019/11/29 HTML / CSS
悬挂训练绳:TRX
2017/12/14 全球购物
英国拳击装备购物网站:RDX Sports
2018/01/23 全球购物
英国标准协会商店:BSI Shop
2019/02/25 全球购物
最新的小工具和卓越的产品设计:Oh That Tech!
2019/08/07 全球购物
法律专业应届生自荐信范文
2014/01/06 职场文书
小学生暑假感言
2014/02/06 职场文书
优秀中职教师事迹材料
2014/08/26 职场文书
《赵州桥》教学反思
2016/02/17 职场文书
判断Python中的Nonetype类型
2021/05/25 Python
CSS使用SVG实现动态分布的圆环发散路径动画
2022/12/24 HTML / CSS