Ajax爬取豆瓣电影目录(Python)

下面的分析相当于一个框架,搞懂之后,对于类似的文字爬取,我们也可以实现。就算不能使用Ajax方法,我们也能够使用相同思想去爬取我们想要的数据。

 

豆瓣电影排行榜分析

网址:https://movie.douban.com/explore#!type=movie&tag=%E7%83%AD%E9%97%A8&sort=recommend&page_limit=20&page_start=0

首先我们打开网页的审查元素,选中Network==》XHR==》电影相关信息网页文件

筛选并比较以下数据(三个文件数据)

请求地址

Request URL:https://movie.douban.com/j/search_subjects?type=movie&tag=%E7%83%AD%E9%97%A8&sort=recommend&page_limit=20&page_start=0

Request URL:https://movie.douban.com/j/search_subjects?type=movie&tag=%E7%83%AD%E9%97%A8&sort=recommend&page_limit=20&page_start=20

Request URL:https://movie.douban.com/j/search_subjects?type=movie&tag=%E7%83%AD%E9%97%A8&sort=recommend&page_limit=20&page_start=40

 

查询参数

type:movie
tag:热门
sort:recommend
page_limit:20
page_start:0type:movie
tag:热门
sort:recommend
page_limit:20
page_start:20type:movie
tag:热门
sort:recommend
page_limit:20
page_start:40

 

请求报头

Host:movie.douban.com
Referer:https://movie.douban.com/explore
User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36
X-Requested-With:XMLHttpRequest

 

通过比较请求地址和查询参数,得出

请求地址 = baseurl+type+tag+sort+page_limit+page_startbaseurl:https://movie.douban.com/j/search_subjects?
type:固定为movie
tag:关键字,需要将utf-8转换为urlencode
sort:固定为recommend
page_limit:表示一页显示的电影数量,固定20
page_start:表示电影页数,从0开始,20为公差的递增函数

 

由此我们获取到了我们需要的数据,可以将爬虫分为三步

  1. 获取网页json格式代码
  2. 从代码中获取电影名和电影海报图片链接
  3. 将获得的图片命名为电影名

 

一 准备工作

在函数外部定义伪装的请求报头

headers={'Host': 'movie.douban.com','Referer': 'https://movie.douban.com/explore','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36','X-Requested-With': 'XMLHttpRequest'
}

 

二 获取json格式代码

def get_page(page):#请求参数params={'type': 'movie','tag': '奥特曼','sort': 'recommend','page_limit': '20','page_start': page,}#基本网页链接base_url = 'https://movie.douban.com/j/search_subjects?'#将基本网页链接与请求参数结合在一起url = base_url + urlencode(params)try:#获取网页代码resp = requests.get(url, headers=headers)print(url)#返回json数据格式代码if 200 == resp.status_code:print(resp.json())return resp.json()except requests.ConnectionError:return None

 

三 筛选数据

通过观察电影列表代码文件的preview,进行数据筛选

def get_image(json):if(json.get('subjects')):data=json.get('subjects')for item in data:title=item.get('title')imageurl=item.get('cover')#返回"信息"字典yield {'title':title,'images':imageurl,}

 

四 存储图片文件

def save_page(item):#文件夹名称file_name = '奥特曼电影大全'if not os.path.exists(file_name):os.makedirs(file_name)#获取图片链接response=requests.get(item.get('images'))#储存图片文件if response.status_code==200:file_path = file_name + os.path.sep + item.get('title') + '.jpg'with open(file_path, 'wb') as f:f.write(response.content)

 

五 多线程处理

def main(page):json = get_page(page)for item in get_image(json):print(item)save_page(item)if __name__ == '__main__':pool = Pool()pool.map(main, [i for i in range(0, 200, 20)])pool.close()pool.join()

 

 

总代码

 

import requests
from urllib.parse import urlencode
import os
from multiprocessing.pool import Poolheaders={'Host': 'movie.douban.com','Referer': 'https://movie.douban.com/explore','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36','X-Requested-With': 'XMLHttpRequest'
}def get_page(page):#请求参数params={'type': 'movie','tag': '奥特曼','sort': 'recommend','page_limit': '20','page_start': page,}#基本网页链接base_url = 'https://movie.douban.com/j/search_subjects?'#将基本网页链接与请求参数结合在一起url = base_url + urlencode(params)try:#获取网页代码resp = requests.get(url, headers=headers)print(url)#返回json数据格式代码if 200 == resp.status_code:print(resp.json())return resp.json()except requests.ConnectionError:return Nonedef get_image(json):if(json.get('subjects')):data=json.get('subjects')for item in data:title=item.get('title')imageurl=item.get('cover')#返回"信息"字典yield {'title':title,'images':imageurl,}def save_page(item):#文件夹名称file_name = '奥特曼电影大全'if not os.path.exists(file_name):os.makedirs(file_name)#获取图片链接response=requests.get(item.get('images'))#储存图片文件if response.status_code==200:file_path = file_name + os.path.sep + item.get('title') + '.jpg'with open(file_path, 'wb') as f:f.write(response.content)def main(page):json = get_page(page)for item in get_image(json):print(item)save_page(item)if __name__ == '__main__':pool = Pool()pool.map(main, [i for i in range(0, 200, 20)])pool.close()pool.join()

 

 本来是准备使用https://movie.douban.com/tag/#/ 不过在后面,刷新网页时,总是出现服务器问题。不过下面的代码还是可以用。

import requests
from urllib.parse import urlencode
import os
from hashlib import md5
from multiprocessing.pool import Poolheaders={'Host': 'movie.douban.com','Referer': 'https://movie.douban.com/tag/','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36',
}def get_page(page):params={'sort':'U','range':'0,10','tags':'奥特曼','start': page,}base_url = 'https://movie.douban.com/j/new_search_subjects?'url = base_url + urlencode(params)try:resp = requests.get(url, headers=headers)print(url)if 200 == resp.status_code:print(resp.json())return resp.json()except requests.ConnectionError:return Nonedef get_image(json):if(json.get('data')):data=json.get('data')for item in data:title=item.get('title')imageurl=item.get('cover')yield {'title':title,'images':imageurl,}def save_page(item):file_name='奥特曼大全'+os.path.sep+item.get('title')if not os.path.exists(file_name):os.makedirs(file_name)try:response=requests.get(item.get('images'))if response.status_code==200:file_path = '{0}/{1}.{2}'.format(file_name, md5(response.content).hexdigest(), 'jpg')if not os.path.exists(file_path):with open(file_path, 'wb') as f:f.write(response.content)else:print('Already Downloaded', file_path)except requests.ConnectionError:print('Failed to Save Image')def main(page):json = get_page(page)for item in get_image(json):print(item)save_page(item)if __name__ == '__main__':pool = Pool()pool.map(main, [i for i in range(0, 200, 20)])pool.close()pool.join()

 

转载于:https://www.cnblogs.com/Mayfly-nymph/p/10780620.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/393859.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

正面管教PHP沙龙,正面管教沙龙体会

接触到正面管教这个理念是我们南宁行动派伙伴圈 的圈主西西给大家带来的分享,谢谢西西[爱你]图片发自简书App同时也很感谢亲切温柔,知性优雅的Liliane老师,让我明白表扬和鼓励的区别,非暴力教育……教书育人这个道路上我需要学习的…

20175223 MySQL

目录 完成结果要求 1 :导入world.sql要求 2 :CityWanna.javaCityWanna.java要求 3 :CountryWanna.javaCountryWanna.java要求 4 :LifeWanna.javaLifeWanna.java过程中问题及解决1. XAMPP无法启用 MySQL 程序。目录 完成结果 要求 …

2020运动相机推荐_2020年超有价值入门级微单相机推荐,超高性价比几款入门级微单相机(选购指南)...

学习摄影专业已经3年多啦,自己喜欢拍摄照片,自己还帮助过一些想学习摄影的朋友快速入门,最近发现周围学习摄影的朋友也越来越多了,有一些朋友咨询关于入门微单相机的问题,想让推荐几款不错的入门的微单相机。这篇文章带…

ioslabel阴影,UILabel的内阴影

is it possible to create such a UILabel with inner and outer shadow?i only know shadowColor and shadowOffsetzoomed:thanks!解决方案The answer by dmaclach is only suitable for shapes that can easily be inverted. My solution is a custom view that works with …

Android Coding利器之掌握小技巧,助你Coding更上一层楼~

本文讲的是Android Coding利器之掌握小技巧,助你Coding更上一层楼~,话说前几天在网上浏览到一大牛写的关于Android布局优化的文章,看后感触很深,回过头看看自己写过的代码,发现还是有不少需要改进,今天找不…

linux系统报警怎么办,常见Linux系统故障和解决方法

常见Linux系统故障和解决方法发布时间:2020-06-06 14:48:19来源:亿速云阅读:212作者:Leah栏目:云计算这篇文章给大家分享的是常见的Linux系统故障和解决方法。在使用系统的过程中总会有各种各样的故障,所以…

Vuex 模块化与项目实例 (2.0)

Vuex 强调使用单一状态树,即在一个项目里只有一个 store,这个 store 集中管理了项目中所有的数据以及对数据的操作行为。但是这样带来的问题是 store 可能会非常臃肿庞大不易维护,所以就需要对状态树进行模块化的拆分。 首先贴出一个逻辑比较…

一脸懵逼学习基于CentOs的Hadoop集群安装与配置(三台机器跑集群)

1:Hadoop分布式计算平台是由Apache软件基金会开发的一个开源分布式计算平台。以Hadoop分布式文件系统(HDFS)和MapReduce(Google MapReduce的开源实现)为核心的Hadoop为用户提供了系统底层细节透明的分布式基础架构。 注…

linux内核epub,Android底层开发技术实战详解——内核、移植和驱动(第2版)[EPUB][MOBI][AZW3][42.33MB]...

内容简介本书从底层原理开始讲起,结合真实的案例向读者详细介绍了Android内核、移植和驱动开发的整个流程。全书分为21章,依次讲解驱动移植的必要性, Goldfish、OMAP内核和驱动解析,显示系统、输入系统、振动器系统、音频系统、视…

用9种办法解决 JS 闭包经典面试题之 for 循环取 i

2017-01-06Tomson JavaScript转自 https://segmentfault.com/a/1190000003818163 闭包 1.正确的说,应该是指一个闭包域,每当声明了一个函数,它就产生了一个闭包域(可以解释为每个函数都有自己的函数栈),每个闭包域(Function 对象)都有一个 function scope(不是属性),function s…

bzoj 2296: 【POJ Challenge】随机种子

Time Limit: 1 Sec Memory Limit: 128 MBSec Special JudgeDescription1tthinking除了随机算法,其他什么都不会。但是他还是可以ac很多题目,他用的是什么呢?他会选择一个好的随机种子,然后输出答案。往往他选择的一个好的种子可…

英特尔第十代处理器为什么不支持win7_5GHz动力澎湃 高主频多核处理器成就巅峰玩家...

频率之争永远是处理器领域无法回避的话题。高主频在游戏中所带来的高速运行,稳定帧数等特性永远是玩家们所追求的目标。随着英特尔第十代桌面及移动版酷睿处理器的发布,无论是台式整机或是笔记本平台,都已全面进入了5GHz时代。选择英特尔处理…

linux python源码目录结构,TensorFlow0.8源码阅读 -- 代码目录结构讲解

TensorFlow0.8发布以来受到了大量机器学习领域爱好者的关注,目前其项目在github上的follow人数在同类项目中排名第一。作为google的第一个开源项目,TensorFlow的源码结构较为清晰,相关的代码注释覆盖较全。本文首先从代码结构入手&#xff0c…

在VirtualBox里复制VDI文件[转]

原文地址:http://blog.sina.com.cn/s/blog_591a2c940100aree.html 在VirtualBox的快速修复界面里,可以随时生成当前状态的备份。当生成了备份之后,会在Snapshots目录下创建一个新的VDI文件,之后对当前状态所做的一切操作都将针对最新的VDI文件…

自动登录360,百度

方便登录,写的小工具 1 import win.ui;2 import web.ui;3 /*DSG{{*/4 var winform ..win.form(text"AAuto Form";right599;bottom399)5 winform.add(6 button{cls"button";text"百度";left41;top25;right163;bottom59;z1};7 button2…

arm linux 开机电路_【技术角度看问题之一】ARM到底是个啥?

【小宅按】近期公司推出来基于ARM芯片的服务器,本文就一些基本概念,比如ARM, ARM64, ARMv8, ARM7,ARMv7, 64位等让人费解的概念进行了粗浅地分析,涉及的关键字已用粗体标出。文中观点仅仅是一家之言,拙劣之…

WPF多线程UI更新

前言 在WPF中,在使用多线程在后台进行计算限制的异步操作的时候,如果在后台线程中对UI进行了修改,则会出现一个错误:(调用线程无法访问此对象,因为另一个线程拥有该对象。)这是很常见的一个错误…

Flutter 36: 图解自定义 View 之 Canvas (三)

小菜继续学习 Canvas 的相关方法: drawVertices 绘制顶点 小菜上次没有整理 drawVertices 的绘制方法,这次补上;Vertice 即顶点,通过绘制多个顶点,在进行连线,多用于 3D 模型中; drawVertices 包…

程序员必知之浮点数运算原理详解

导读:浮点数运算是一个非常有技术含量的话题,不太容易掌握。许多程序员都不清楚使用操作符比较float/double类型的话到底出现什么问题。 许多人使用float/double进行货币计算时经常会犯错。这篇文章是这一系列中的精华,所有的软件开发人员都应…

工程代码_Egret开发笔记(二)基础工程代码阅读

代码目录结构在Egret Wing中打开上一节中我们创建的项目工程,查看代码目录结构,Forward在如下图中标记了各个目录的及关键文件的用途。代码阅读理解接下来我们从web入口一步一步阅读初始代码。首先打开index.html文件,我们看到index文件内容如…