下面的分析相当于一个框架,搞懂之后,对于类似的文字爬取,我们也可以实现。就算不能使用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

Ajax爬取豆瓣电影目录(Python)相关推荐

  1. Python爬虫入门 | 7 分类爬取豆瓣电影,解决动态加载问题

      比如我们今天的案例,豆瓣电影分类页面.根本没有什么翻页,需要点击"加载更多"新的电影信息,前面的黑科技瞬间被秒--   又比如知乎关注的人列表页面:   我复制了其中两个人昵称 ...

  2. python爬取豆瓣电影评论_python 爬取豆瓣电影评论,并进行词云展示及出现的问题解决办法...

    def getHtml(url): """获取url页面""" headers = {'User-Agent':'Mozilla/5.0 ( ...

  3. 爬虫系列1:Requests+Xpath 爬取豆瓣电影TOP

    爬虫1:Requests+Xpath 爬取豆瓣电影TOP [抓取]:参考前文 爬虫系列1:https://www.cnblogs.com/yizhiamumu/p/9451093.html [分页]: ...

  4. python爬取豆瓣电影top250_Python爬虫 - scrapy - 爬取豆瓣电影TOP250

    0.前言 新接触爬虫,经过一段时间的实践,写了几个简单爬虫,爬取豆瓣电影的爬虫例子网上有很多,但都很简单,大部分只介绍了请求页面和解析部分,对于新手而言,我希望能够有一个比较全面的实例.所以找了很多实 ...

  5. python大规模获取豆瓣影评_python爬取豆瓣电影排行榜(requests)

    ''' 爬取豆瓣电影排行榜 设计思路: 1.先获取电影类型的名字以及特有的编号 2.将编号向ajax发送get请求获取想要的数据 3.将数据存放进excel表格中 ''' 环境部署: 软件安装: 模块 ...

  6. python用bs4爬取豆瓣电影排行榜 Top 250的电影信息和电影图片,分别保存到csv文件和文件夹中

    python用bs4爬取豆瓣电影排行榜 Top 250的电影信息和图片,分别保存到csv文件和文件夹中. 爬取的数据包括每个电影的电影名 , 导演 ,演员 ,评分,推荐语,年份,国家,类型. py如果 ...

  7. python爬虫慕课网利用xpath_python爬虫实践——零基础快速入门(二)爬取豆瓣电影...

    爬虫又称为网页蜘蛛,是一种程序或脚本. 但重点在于,它能够按照一定的规则,自动获取网页信息. 爬虫的基本原理--通用框架 1.挑选种子URL: 2.讲这些URL放入带抓取的URL列队: 3.取出带抓取 ...

  8. python如何爬取豆瓣_Python实战之如何爬取豆瓣电影?本文教你

    爬虫又称为网页蜘蛛,是一种程序或脚本. 但重点在于,它能够按照一定的规则,自动获取网页信息. 爬虫的基本原理--通用框架 1.挑选种子URL: 2.讲这些URL放入带抓取的URL列队: 3.取出带抓取 ...

  9. python爬取豆瓣电影top250_用Python爬虫实现爬取豆瓣电影Top250

    用Python爬虫实现爬取豆瓣电影Top250 #爬取 豆瓣电影Top250 #250个电影 ,分为10个页显示,1页有25个电影 import urllib.request from bs4 imp ...

最新文章

  1. python画柱状图代码-python绘制双柱形图代码实例
  2. 行为型模式:模板方法
  3. 读书笔记---编译程序中的三板斧
  4. 对网络数据包进行嗅探
  5. ssl1257-产生数【图论,最短路】
  6. python生成矩阵_如何在Python中生成矩阵?
  7. iOS 从相机或相册获取图片并裁剪
  8. BZOJ 1072 排列
  9. 关于 Node 集群
  10. 基础入门_Python-模块和包.Gevent异步服务类实现多姿势WEB实时展示?
  11. eclipse 查看jar包源代码两种方式
  12. 卡巴斯基终生免费使用方法
  13. sklearn中的数据预处理和特征工程
  14. 2022年起重机司机(限桥式起重机)考试题库模拟考试平台操作
  15. 【矩阵论】6. 正规方程与矩阵方程求解
  16. MeterSphere开源持续测试平台携手柠檬班,为提升软件测试行业整体效率添砖加瓦
  17. tapestry mysql_tapestry与mybatis模块的结合
  18. 深度学习知识点总结:深度学习常用公式总结
  19. 官方消息:即将开始退钱
  20. 10行命令60秒快速定位性能瓶颈

热门文章

  1. FB面经Prepare: Dot Product
  2. 2016/4/19 ①单个文件上传 ②上传图片后 预览图片
  3. Windows Phone开发(30):图形 转:http://blog.csdn.net/tcjiaan/article/details/7453028
  4. C#中showDialog()与show()的区别(转)
  5. linux运维、架构之路-jumpserver
  6. docker保存对容器的修改
  7. C# socket nat 映射 网络 代理 转发
  8. CSS3 outline-offset 属性 项目中input会遇到
  9. redis介绍以及安装
  10. Android系统源码学习——源码目录结构介绍