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,一经查实,立即删除!

相关文章

到底死不死我就请了七天假_“你到底死不死?我只请了7天假”

这两天看到一条令人心酸的新闻,在国内某地铁站内,一位57岁的大妈突发心脏病,被紧急救醒后,第一句话竟是请求工作人员不要打电话通知她远在德国的儿子。看完这条新闻,掌柜特别心酸,孤身一人在国内&#xff0…

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

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

FB面经Prepare: Dot Product

Conduct Dot Product of two large Vectors 1. two pointers 2. hashmap 3. 如果没有额外空间,如果一个很大,一个很小,适合scan小的,并且在大的里面做binary search 1 package fb;2 3 public class DotProduct {4 5 publi…

leetcode1291. 顺次数(回溯)

我们定义「顺次数」为:每一位上的数字都比前一位上的数字大 1 的整数。 请你返回由 [low, high] 范围内所有顺次数组成的 有序 列表(从小到大排序)。 示例 1: 输出:low 100, high 300 输出:[123,234] …

20175223 MySQL

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

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

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

javascript入门_JavaScript代理快速入门

javascript入门What is a JavaScript proxy? you might ask. It is one of the features that shipped with ES6. Sadly, it seems not to be widely used.什么是JavaScript代理? 你可能会问。 这是ES6附带的功能之一。 可悲的是,它似乎并未得到广泛使用…

linux缺少文件操作数,linux 文件的atime,ctime,mtime查看与修改

查看ls -a默认显示的是修改时间ls -c / --timestatus / --timectime显示的是状态修改时间(即权限修改时间)ls -u / --timeuse / --timeaccess / --timeatime表示的是文件访问时间修改touch: 缺少了文件操作数请尝试执行“touch --help”来获取更多信息。[weilocalhost ~]$ touc…

leetcode47. 全排列 II(回溯)

给定一个可包含重复数字的序列&#xff0c;返回所有不重复的全排列。 示例: 输入: [1,1,2] 输出: [ [1,1,2], [1,2,1], [2,1,1] ] 代码 class Solution {List<List<Integer>> cListnew ArrayList<>();public List<List<Integer>> permuteUni…

linux 磁盘查看方式

fdisk (查看物理磁盘大小) df (查看文件系统&#xff0c;也就是正在使用磁盘大小) lsblk (查看逻辑磁盘大小)转载于:https://www.cnblogs.com/MUQINGFENG123/p/10820345.html

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 …

Webpack初学者介绍

Webpack is a tool that lets you compile JavaScript modules. It’s also known as a module bundler.Webpack是使您可以编译JavaScript模块的工具。 也称为模块捆绑器 。 Given a large number of files, it generates a single file (or a few files) that run your app.给…

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

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

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

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

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

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

click js自动点击 vue_vue.js2.0点击获取自己的属性和jquery方法

如下所示&#xff1a;:data-index"index":dt"index"v-on:click"onclick($event,index)":data-d "JSON.stringify( item)"href"http://www.baidu.com" rel"external nofollow" rel"external nofollow"da…

Python:知识目录

Python目录 第一篇&#xff1a;数据类型部分文件操作 基础数据类型---str 基础数据类型---List 基础数据类型---dict 基础数据类型---set 基础数据类型---bytes 数据类型的总结 文件操作------读&#xff0c;写 文件操作------使用方法 第二章&#xff1a;函数模块 初识函数…

初学者css常见问题_5分钟内学习CSS-初学者教程

初学者css常见问题关于网络设计语言的快速教程。 (A quick tutorial on the design language of the web.) CSS (Cascading Style Sheets) is what makes web pages look good and presentable. It’s an essential part of modern web development and a must-have skill for …

leetcode39. 组合总和(回溯)

给定一个无重复元素的数组 candidates 和一个目标数 target &#xff0c;找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的数字可以无限制重复被选取。 说明&#xff1a; 所有数字&#xff08;包括 target&#xff09;都是正整数。 解集不能包含重复的…

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

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