爬取电影天堂的电影详情页信息

  • 思路分析
    • 1、获取每一个页面的URL地址
    • 2、获取电影详情页面的URL
    • 3、爬取电影详情页面
    • 4、从页面中提取信息
    • 5、将提取到的信息保存到文件
  • 完整代码
  • 结果展示
  • 注意事项

思路分析

1、获取每一个页面的URL地址

首页的URL:https://www.dytt8.net/html/gndy/dyzz/index.html
以后每一个页面的URL:https://www.dytt8.net/html/gndy/dyzz/list_23_%d.html(其中的%d应该替换为相应的页码)

url = 'https://www.dytt8.net/html/gndy/dyzz/list_23_%d.html' % i

2、获取电影详情页面的URL

利用XPath提取相应的URL即可

def get_url(page_url):try:response = requests.get(page_url, headers=headers)page_url_list = []except :print(page_url+"请求失败!")return []html = etree.HTML(response.text)a = html.xpath("//a[@class='ulink']")for it in a:href_list = it.xpath("@href")if len(href_list) > 0:href = href_list[0]page_url_list.append(HOST+href)print(page_url_list)return page_url_list

3、爬取电影详情页面

根据拿到的电影详情页面的URL发送请求

4、从页面中提取信息

利用XPath提取需要的信息


def get_detail(page_url):try:r = requests.get(page_url, headers=headers)except :print(page_url+"请求失败")return {}r.encoding = 'gbk'html = etree.HTML(r.text)p_list = html.xpath("//p")if len(p_list) == 0:return {}else:p = p_list[0]img_list = p.xpath("./img/@src")if len(img_list) == 0:img = 'null'else:img = img_list[0]download_url_list = p.xpath("./a/@href")if len(download_url_list) == 0:download_url = "null"else:download_url = download_url_list[0]movie_info = {'image': img}info = p.xpath("./text()")if len(info) == 0:return {}for index, item in enumerate(info):if item.startswith('◎译  名'):translated_names = parse_info('◎译  名', item)movie_info['translated_names'] = translated_nameselif item.startswith('◎片  名'):title = parse_info('◎片  名', item)movie_info['title'] = titleelif item.startswith('◎年  代'):year = parse_info('◎年  代', item)movie_info['year'] = yearelif item.startswith('◎产  地'):place = parse_info('◎产  地', item)movie_info['place'] = placeelif item.startswith('◎类  别'):category = parse_info('◎类  别', item)movie_info['category'] = categoryelif item.startswith('◎语  言'):language = parse_info('◎语  言', item)movie_info['language'] = languageelif item.startswith('◎上映日期'):release_date = parse_info('◎上映日期', item)movie_info['release_date'] = release_dateelif item.startswith('◎IMDb评分'):IMDB_score = parse_info('◎IMDb评分', item)movie_info['IMDB_score'] = IMDB_scoreelif item.startswith('◎豆瓣评分'):score = parse_info('◎豆瓣评分', item)movie_info['score'] = scoreelif item.startswith('◎片  长'):duration = parse_info('◎片  长', item)movie_info['duration'] = durationelif item.startswith('◎导  演 '):director = parse_info('◎导  演 ', item)movie_info['director'] = directorelif item.startswith('◎编  剧'):screenwriter = parse_info('◎编  剧', item)movie_info['screenwriter'] = screenwriterelif item.startswith('◎主  演'):actor = [parse_info('◎主  演', item)]for i in range(index + 1, len(info)):if info[i].startswith('◎'):breakactor.append(info[i].strip())movie_info['actor'] = actorelif item.startswith('◎标  签'):label = parse_info('◎标  签', item)movie_info['label'] = labelelif item.startswith('◎简  介 '):information = ""for i in range(index + 1, len(info)):if info[i].startswith('◎'):breakinformation += info[i].strip()movie_info['information'] = informationmovie_info['download_url'] = download_urlif len(movie_info) < 3:return {}print(movie_info)return movie_info

5、将提取到的信息保存到文件

将列表保存成CSV文件即可

def save_to_file(movie_list, mode, header):df = pd.DataFrame(movie_list)df.to_csv('./result/Movie_Tian.csv', index=False, encoding='utf_8_sig', mode=mode, header=header)

完整代码

# !/usr/bin/env python
# —*— coding: utf-8 —*—
# @Time:    2020/2/1 21:36
# @Author:  Martin
# @File:    Movie_Tian.py
# @Software:PyCharm
import requests
from lxml import etree
import pandas as pd
HOST = 'https://www.dytt8.net'
index_url = 'https://www.dytt8.net/html/gndy/dyzz/index.html'
raw_url = 'https://www.dytt8.net/html/gndy/dyzz/list_23_%d.html'
headers = {'Referer': 'https://www.dytt8.net/','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36'
}def get_url(page_url):try:response = requests.get(page_url, headers=headers)page_url_list = []except :print(page_url+"请求失败!")return []html = etree.HTML(response.text)a = html.xpath("//a[@class='ulink']")for it in a:href_list = it.xpath("@href")if len(href_list) > 0:href = href_list[0]page_url_list.append(HOST+href)print(page_url_list)return page_url_listdef get_detail(page_url):try:r = requests.get(page_url, headers=headers)except :print(page_url+"请求失败")return {}r.encoding = 'gbk'html = etree.HTML(r.text)p_list = html.xpath("//p")if len(p_list) == 0:return {}else:p = p_list[0]img_list = p.xpath("./img/@src")if len(img_list) == 0:img = 'null'else:img = img_list[0]download_url_list = p.xpath("./a/@href")if len(download_url_list) == 0:download_url = "null"else:download_url = download_url_list[0]movie_info = {'image': img}info = p.xpath("./text()")if len(info) == 0:return {}for index, item in enumerate(info):if item.startswith('◎译  名'):translated_names = parse_info('◎译  名', item)movie_info['translated_names'] = translated_nameselif item.startswith('◎片  名'):title = parse_info('◎片  名', item)movie_info['title'] = titleelif item.startswith('◎年  代'):year = parse_info('◎年  代', item)movie_info['year'] = yearelif item.startswith('◎产  地'):place = parse_info('◎产  地', item)movie_info['place'] = placeelif item.startswith('◎类  别'):category = parse_info('◎类  别', item)movie_info['category'] = categoryelif item.startswith('◎语  言'):language = parse_info('◎语  言', item)movie_info['language'] = languageelif item.startswith('◎上映日期'):release_date = parse_info('◎上映日期', item)movie_info['release_date'] = release_dateelif item.startswith('◎IMDb评分'):IMDB_score = parse_info('◎IMDb评分', item)movie_info['IMDB_score'] = IMDB_scoreelif item.startswith('◎豆瓣评分'):score = parse_info('◎豆瓣评分', item)movie_info['score'] = scoreelif item.startswith('◎片  长'):duration = parse_info('◎片  长', item)movie_info['duration'] = durationelif item.startswith('◎导  演 '):director = parse_info('◎导  演 ', item)movie_info['director'] = directorelif item.startswith('◎编  剧'):screenwriter = parse_info('◎编  剧', item)movie_info['screenwriter'] = screenwriterelif item.startswith('◎主  演'):actor = [parse_info('◎主  演', item)]for i in range(index + 1, len(info)):if info[i].startswith('◎'):breakactor.append(info[i].strip())movie_info['actor'] = actorelif item.startswith('◎标  签'):label = parse_info('◎标  签', item)movie_info['label'] = labelelif item.startswith('◎简  介 '):information = ""for i in range(index + 1, len(info)):if info[i].startswith('◎'):breakinformation += info[i].strip()movie_info['information'] = informationmovie_info['download_url'] = download_urlif len(movie_info) < 3:return {}print(movie_info)return movie_infodef parse_info(string, item):return item.replace(string, "").strip()def spider():# 指定结束页码(目前共208页),这里爬取前10页end_index = 10all_url = get_url(index_url)for index, page_url in enumerate(all_url):if index == 0:movie_list = [get_detail(page_url)]save_to_file(movie_list, 'w', True)else:movie_list = [get_detail(page_url)]save_to_file(movie_list, 'a', False)for i in range(2, end_index+1):all_url = get_url(raw_url % i)for page_url in all_url:movie_list = [get_detail(page_url)]save_to_file(movie_list, 'a', False)def save_to_file(movie_list, mode, header):df = pd.DataFrame(movie_list)df.to_csv('./result/Movie_Tian.csv', index=False, encoding='utf_8_sig', mode=mode, header=header)if __name__ == '__main__':spider()

结果展示

注意事项

1、利用requests库发送请求时,为避免网络状况不佳导致程序崩溃,可以利用tr语句y来增强程序的健壮性。
2、利用XPath提取数据时,由于不能保证每个页面都完全一样,因此,应考虑提取不到数据的情况,避免出现列表索引越界的现象。

虐猫人薛定谔i 2020年2月2日 写于家中

爬虫实战——爬取电影天堂的电影详情页信息相关推荐

  1. Python爬虫实战爬取租房网站2w+数据-链家上海区域信息(超详细)

    Python爬虫实战爬取租房网站-链家上海区域信息(过程超详细) 内容可能有点啰嗦 大佬们请见谅 后面会贴代码 带火们有需求的话就用吧 正好这几天做的实验报告就直接拿过来了,我想后面应该会有人用的到吧 ...

  2. 第一次写爬虫程序爬取豆瓣5W条电影数据

    第一次写爬虫程序爬取豆瓣5W条电影数据 最近工作比较不是很忙,想到之前使用httpclient和jsoup爬取过一次豆瓣电影TOP250,但总觉得数据量太小,不过瘾.于是趁着最近不是很忙的机会,重新写 ...

  3. node 爬虫 实战 - 爬取拉勾网职位数据

    node 爬虫 实战 - 爬取拉勾网职位数据,主要想把数据用于大数据学习,到时候大数据分析可以自己分析一下职位的情况,和比较一些我现在的职位在深圳乃至全国的开发人员水平. 涉及到的技术栈:node.j ...

  4. python爬虫实战---爬取大众点评评论

    python爬虫实战-爬取大众点评评论(加密字体) 1.首先打开一个店铺找到评论 很多人学习python,不知道从何学起. 很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手. 很多 ...

  5. python爬虫实战-爬取视频网站下载视频至本地(selenium)

    #python爬虫实战-爬取视频网站下载视频至本地(selenium) import requests from lxml import etree import json from selenium ...

  6. python爬虫实战-爬取微信公众号所有历史文章 - (00) 概述

    http://efonfighting.imwork.net 欢迎关注微信公众号"一番码客"获取免费下载服务与源码,并及时接收最新文章推送. 最近几年随着人工智能和大数据的兴起,p ...

  7. Scrapy 爬虫实战-爬取字幕库

    Scrapy 爬虫实战-爬取字幕库 1.首先,创建Scrapy框架 创建工程 scrapy startproject zimuku创建爬虫程序 cd zimuku scrapy genspider z ...

  8. python爬虫:爬取猎聘网站职位详情

    python爬虫:爬取猎聘网站职位详情 第一次学习python,也是刚开始学习爬虫,完成的第一个实例,记录一下. baseurl.py # @author centao # @time 2020.10 ...

  9. Python3简单爬虫:爬取猫眼评分top100电影

    Python3:用xpath库爬取猫眼评分top100电影 在看<Python3 网络爬虫开发实战中>一书学习时,书中第三章例子用re正则匹配来爬取电影的所需数据,虽然爬取速度快,效率好, ...

  10. python爬虫实战--爬取猫眼专业版-实时票房

    小白级别的爬虫入门 最近闲来无事,发现了猫眼专业版-实时票房,可以看到在猫眼上映电影的票房数据,便验证自己之前学的python爬虫,爬取数据,做成.svg文件. 爬虫开始之前 我们先来看看猫眼专业版- ...

最新文章

  1. Rstudio 实现 爬虫 文本分词 个性化词云设计--我爱中国我爱党
  2. oracle判断一个字符是否是数字
  3. python学习笔记--easy_install和pip
  4. Android之ListViewJson加载网络数据
  5. 一款标注颜色,距离的小软件 markman
  6. 一行Java代码实现获取上传文件的后缀名
  7. 【CyberSecurityLearning 附】渗透测试技术选择题 + 法律法规
  8. android 地址选择器_48种Android开发的开源库汇总
  9. 凯斯西储计算机科学,凯斯西储大学电气工程与计算机科学系基本信息详解
  10. 零基础到底适不适合转行前端?
  11. hihoCoder-1098最小生成树二·Kruscal算法 (最小生成树)
  12. Yii 2.0 权威指南 (5) 应用结构
  13. 爬虫实例3 批量抓取数据之异步请求(ajax)
  14. 前端页面截图,指定区域截图
  15. 直流斩波电路在matlab中的建模与仿真,毕业设计直流斩波电路的MATLAB建模与仿真...
  16. 眼睛却可以睁开,口干胸闷,不论自己…
  17. 开始讨厌现在这种生活
  18. react-contexify 右键菜单动态生成
  19. IOS 如何通过浏览器打开App
  20. 调用模板类出现undefined reference to的情况及解决方案

热门文章

  1. [转] 网卡超时实现机制 watchdog_timeo/ndo_tx_timeout
  2. LVGL|lvgl中文教程手册(lvgl中文文档学习教程)
  3. [Growth]Steve Jobs——Follow your heart and intuition, everything else is secondary.
  4. 移动磁盘数据错误循环冗余检查,要怎样恢复数据
  5. Win10 重装系统后,在此计算机上自动解锁此驱动器,提示:数据错误(循环冗余检查)
  6. SQL语句----CASE WHEN 的用法简介
  7. excel实用快捷键图表_使用快捷键创建Excel图表
  8. Habor 入门指南
  9. 【示波器专题】示波器带宽对测量的影响
  10. 计算机考研833大纲,考研833之计算机组成与系统结构提纲