一个简单的python爬虫程序 爬取豆瓣热度Top100以内的电影信息

作者:joseph_ji 时间:2023-01-09 19:50:16 

概述

这是一个简单的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. 本文只是用作网络爬虫技术学习交流,读者涉及到的任何侵权问题,与本文作者无关。

来源:https://www.cnblogs.com/josephji/archive/2018/04/17/8859249.html

标签:python,爬虫,爬取
0
投稿

猜你喜欢

  • Asp 单页查询数据库

    2010-05-11 20:11:00
  • 浅谈Django 页面缓存的cache_key是如何生成的

    2022-03-20 09:53:02
  • python学习笔记:字典的使用示例详解

    2022-06-14 16:31:31
  • Nodejs 连接 mysql时报Error: Cannot enqueue Query after fatal error错误的处理办法

    2024-01-15 11:47:34
  • 超详细卸载mysql教程(按照步骤可完全卸载)

    2024-01-25 08:21:00
  • Python中的装饰器使用

    2023-05-25 13:14:09
  • django获取from表单multiple-select的value和id的方法

    2021-11-03 13:13:31
  • Springboot获取前端反馈信息并存入数据库的实现代码

    2024-01-15 09:06:15
  • python实现ftp文件传输功能

    2023-04-21 13:20:16
  • 深入理解 ES6中的 Reflect用法

    2024-04-16 09:30:44
  • python按行读取文件,去掉每行的换行符\\n的实例

    2022-06-01 03:49:43
  • pandas进行时间数据的转换和计算时间差并提取年月日

    2021-03-14 02:22:22
  • Python中selenium库的用法详解

    2021-06-26 00:29:41
  • python实现简单俄罗斯方块游戏

    2023-04-13 03:28:05
  • python利用datetime模块计算时间差

    2021-10-07 01:02:04
  • vue如何通过params和query传值(刷新不丢失)

    2024-05-09 15:17:23
  • Python进程间通信Queue消息队列用法分析

    2021-11-28 03:04:18
  • php过滤器使用详解

    2023-06-13 01:52:23
  • Python绘制动态的521玫瑰花

    2021-05-05 09:31:03
  • Python drop()删除行列的操作方法

    2022-10-27 17:12:41
  • asp之家 网络编程 m.aspxhome.com