Ajax爬取豆瓣电影目录(Python)
下面的分析相当于一个框架,搞懂之后,对于类似的文字爬取,我们也可以实现。就算不能使用Ajax方法,我们也能够使用相同思想去爬取我们想要的数据。
豆瓣电影排行榜分析
首先我们打开网页的审查元素,选中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:
- page_start:
- type:movie
- tag:热门
- sort:recommend
- page_limit:
- page_start:
- type:movie
- tag:热门
- sort:recommend
- page_limit:
- page_start:
请求报头
- 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_start
- baseurl:https://movie.douban.com/j/search_subjects?
- type:固定为movie
- tag:关键字,需要将utf-8转换为urlencode
- sort:固定为recommend
- page_limit:表示一页显示的电影数量,固定20
- page_start:表示电影页数,从0开始,20为公差的递增函数
由此我们获取到了我们需要的数据,可以将爬虫分为三步
- 获取网页json格式代码
- 从代码中获取电影名和电影海报图片链接
- 将获得的图片命名为电影名
流程
准备工作
在函数外部定义伪装的请求报头
- 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': '',
- '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 Pool
- 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'
- }
- def get_page(page):
- #请求参数
- params={
- 'type': 'movie',
- 'tag': '奥特曼',
- 'sort': 'recommend',
- 'page_limit': '',
- '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
- 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()
本来是准备使用https://movie.douban.com/tag/#/ 不过在后面,刷新网页时,总是出现服务器问题。不过下面的代码还是可以用。
- import requests
- from urllib.parse import urlencode
- import os
- from hashlib import md5
- from multiprocessing.pool import Pool
- headers={
- '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 None
- def 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()
Ajax爬取豆瓣电影目录(Python)的更多相关文章
- 爬虫系列1:Requests+Xpath 爬取豆瓣电影TOP
爬虫1:Requests+Xpath 爬取豆瓣电影TOP [抓取]:参考前文 爬虫系列1:https://www.cnblogs.com/yizhiamumu/p/9451093.html [分页]: ...
- 利用Python爬取豆瓣电影
目标:使用Python爬取豆瓣电影并保存MongoDB数据库中 我们先来看一下通过浏览器的方式来筛选某些特定的电影: 我们把URL来复制出来分析分析: https://movie.douban.com ...
- Python开发爬虫之静态网页抓取篇:爬取“豆瓣电影 Top 250”电影数据
所谓静态页面是指纯粹的HTML格式的页面,这样的页面在浏览器中展示的内容都在HTML源码中. 目标:爬取豆瓣电影TOP250的所有电影名称,网址为:https://movie.douban.com/t ...
- Python爬虫爬取豆瓣电影之数据提取值xpath和lxml模块
工具:Python 3.6.5.PyCharm开发工具.Windows 10 操作系统.谷歌浏览器 目的:爬取豆瓣电影排行榜中电影的title.链接地址.图片.评价人数.评分等 网址:https:// ...
- python 爬取豆瓣电影评论,并进行词云展示及出现的问题解决办法
本文旨在提供爬取豆瓣电影<我不是药神>评论和词云展示的代码样例 1.分析URL 2.爬取前10页评论 3.进行词云展示 1.分析URL 我不是药神 短评 第一页url https://mo ...
- Python爬取豆瓣电影top
Python爬取豆瓣电影top250 下面以四种方法去解析数据,前面三种以插件库来解析,第四种以正则表达式去解析. xpath pyquery beaufifulsoup re 爬取信息:名称 评分 ...
- python爬取豆瓣电影信息数据
题外话+ 大家好啊,最近自己在做一个属于自己的博客网站(准备辞职回家养老了,明年再战)在家里 琐事也很多, 加上自己 一回到家就懒了(主要是家里冷啊! 广东十几度,老家几度,躲在被窝瑟瑟发抖,) 由于 ...
- python 爬取豆瓣电影短评并wordcloud生成词云图
最近学到数据可视化到了词云图,正好学到爬虫,各种爬网站 [实验名称] 爬取豆瓣电影<千与千寻>的评论并生成词云 1. 利用爬虫获得电影评论的文本数据 2. 处理文本数据生成词云图 第一步, ...
- python 爬虫&爬取豆瓣电影top250
爬取豆瓣电影top250from urllib.request import * #导入所有的request,urllib相当于一个文件夹,用到它里面的方法requestfrom lxml impor ...
随机推荐
- 【Java学习笔记】线程安全的单例模式及双重检查锁—个人理解
搬以前写的博客[2014-12-30 16:04] 在web应用中服务器面临的是大量的访问请求,免不了多线程程序,但是有时候,我们希望在多线程应用中的某一个类只能新建一个对象的时候,就会遇到问题. 首 ...
- AOP技术介绍--(AOP技术基础)
2.1 AOP技术起源 AOP技术的诞生并不算晚,早在1990年开始,来自Xerox Palo Alto Research Lab(即PARC)的研究人员就对面向对象思想的局限性进行了分 ...
- php中判断数组键值,array_key_exists和isset区别
$arr = array('key' => NULL); if(isset($arr['key'])){ echo 'isset'; } else { echo 'unset'; } echo ...
- bzoj4128 Matrix 矩阵 BSGS
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4128 题解 想了十分钟没有任何思路. 然后一眼瞥见一句话"数据保证在 \(p\) 内 ...
- Map和Set的联系
Java中的集合 Java中的集合包括三大类,它们是Set.List和Map,它们都处于java.util包中,Set.List和Map都是接口,它们有各自的实现类.Set的实现类主要有HashSet ...
- @ControllerAdvice全局数据预处理
在传统项目的Controller的方法中传入参数,对象中的属性相同时,会出现以下错误 Book类和Author类 这是因为两个对象中的name相同,传参时分不清西游记和六小龄童 ...
- Centos6安装mysql
此处安装的是MariaDB,介绍如下: MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可. 开发这个分支的原因之一是:甲骨文公司收购了MySQL后,有将My ...
- Jmeter的JDBC请求执行多条SQL语句
注:有mysqlconnector/j 3.1.1以上版本才支持执行多条sql语句 1. 下载jdbc驱动为了连接Mysql数据库,还需要有个jdbc驱动:mysql-connector-ja ...
- 按照MySQL
转载自:https://mp.weixin.qq.com/s?__biz=MzIwNzk0NjE1MQ==&mid=2247484200&idx=1&sn=6eed12242c ...
- BZOJ 2060: [Usaco2010 Nov]Visiting Cows 拜访奶牛 树形DP
Code: #include <bits/stdc++.h> #define setIO(s) freopen(s".in","r",stdin) ...