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

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

请求地址

  1. 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
  2.  
  3. 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
  4.  
  5. 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

查询参数

  1. type:movie
  2. tag:热门
  3. sort:recommend
  4. page_limit:
  5. page_start:
  6.  
  7. type:movie
  8. tag:热门
  9. sort:recommend
  10. page_limit:
  11. page_start:
  12.  
  13. type:movie
  14. tag:热门
  15. sort:recommend
  16. page_limit:
  17. page_start:

请求报头

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

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

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

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

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

流程

准备工作

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

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

获取json格式代码

  1. def get_page(page):
  2. #请求参数
  3. params={
  4. 'type': 'movie',
  5. 'tag': '奥特曼',
  6. 'sort': 'recommend',
  7. 'page_limit': '',
  8. 'page_start': page,
  9. }
  10. #基本网页链接
  11. base_url = 'https://movie.douban.com/j/search_subjects?'
  12. #将基本网页链接与请求参数结合在一起
  13. url = base_url + urlencode(params)
  14. try:
  15. #获取网页代码
  16. resp = requests.get(url, headers=headers)
  17. print(url)
  18. #返回json数据格式代码
  19. if 200 == resp.status_code:
  20. print(resp.json())
  21. return resp.json()
  22. except requests.ConnectionError:
  23. return None

筛选数据

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

  1. def get_image(json):
  2. if(json.get('subjects')):
  3. data=json.get('subjects')
  4. for item in data:
  5. title=item.get('title')
  6. imageurl=item.get('cover')
  7. #返回"信息"字典
  8. yield {
  9. 'title':title,
  10. 'images':imageurl,
  11. }

存储图片文件

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

多线程处理

  1. def main(page):
  2. json = get_page(page)
  3. for item in get_image(json):
  4. print(item)
  5. save_page(item)
  6.  
  7. if __name__ == '__main__':
  8. pool = Pool()
  9. pool.map(main, [i for i in range(0, 200, 20)])
  10. pool.close()
  11. pool.join()

总代码

  1. import requests
  2. from urllib.parse import urlencode
  3. import os
  4. from multiprocessing.pool import Pool
  5.  
  6. headers={
  7. 'Host': 'movie.douban.com',
  8. 'Referer': 'https://movie.douban.com/explore',
  9. 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36',
  10. 'X-Requested-With': 'XMLHttpRequest'
  11. }
  12.  
  13. def get_page(page):
  14. #请求参数
  15. params={
  16. 'type': 'movie',
  17. 'tag': '奥特曼',
  18. 'sort': 'recommend',
  19. 'page_limit': '',
  20. 'page_start': page,
  21. }
  22. #基本网页链接
  23. base_url = 'https://movie.douban.com/j/search_subjects?'
  24. #将基本网页链接与请求参数结合在一起
  25. url = base_url + urlencode(params)
  26. try:
  27. #获取网页代码
  28. resp = requests.get(url, headers=headers)
  29. print(url)
  30. #返回json数据格式代码
  31. if 200 == resp.status_code:
  32. print(resp.json())
  33. return resp.json()
  34. except requests.ConnectionError:
  35. return None
  36.  
  37. def get_image(json):
  38. if(json.get('subjects')):
  39. data=json.get('subjects')
  40. for item in data:
  41. title=item.get('title')
  42. imageurl=item.get('cover')
  43. #返回"信息"字典
  44. yield {
  45. 'title':title,
  46. 'images':imageurl,
  47. }
  48.  
  49. def save_page(item):
  50. #文件夹名称
  51. file_name = '奥特曼电影大全'
  52. if not os.path.exists(file_name):
  53. os.makedirs(file_name)
  54.  
  55. #获取图片链接
  56. response=requests.get(item.get('images'))
  57. #储存图片文件
  58. if response.status_code==200:
  59. file_path = file_name + os.path.sep + item.get('title') + '.jpg'
  60. with open(file_path, 'wb') as f:
  61. f.write(response.content)
  62.  
  63. def main(page):
  64. json = get_page(page)
  65. for item in get_image(json):
  66. print(item)
  67. save_page(item)
  68.  
  69. if __name__ == '__main__':
  70. pool = Pool()
  71. pool.map(main, [i for i in range(0, 200, 20)])
  72. pool.close()
  73. pool.join()

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

  1. import requests
  2. from urllib.parse import urlencode
  3. import os
  4. from hashlib import md5
  5. from multiprocessing.pool import Pool
  6.  
  7. headers={
  8. 'Host': 'movie.douban.com',
  9. 'Referer': 'https://movie.douban.com/tag/',
  10. 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36',
  11. }
  12.  
  13. def get_page(page):
  14. params={
  15. 'sort':'U',
  16. 'range':'0,10',
  17. 'tags':'奥特曼',
  18. 'start': page,
  19. }
  20. base_url = 'https://movie.douban.com/j/new_search_subjects?'
  21. url = base_url + urlencode(params)
  22. try:
  23. resp = requests.get(url, headers=headers)
  24. print(url)
  25. if 200 == resp.status_code:
  26. print(resp.json())
  27. return resp.json()
  28. except requests.ConnectionError:
  29. return None
  30.  
  31. def get_image(json):
  32. if(json.get('data')):
  33. data=json.get('data')
  34. for item in data:
  35. title=item.get('title')
  36. imageurl=item.get('cover')
  37. yield {
  38. 'title':title,
  39. 'images':imageurl,
  40. }
  41.  
  42. def save_page(item):
  43. file_name='奥特曼大全'+os.path.sep+item.get('title')
  44. if not os.path.exists(file_name):
  45. os.makedirs(file_name)
  46. try:
  47. response=requests.get(item.get('images'))
  48. if response.status_code==200:
  49. file_path = '{0}/{1}.{2}'.format(file_name, md5(response.content).hexdigest(), 'jpg')
  50. if not os.path.exists(file_path):
  51. with open(file_path, 'wb') as f:
  52. f.write(response.content)
  53. else:
  54. print('Already Downloaded', file_path)
  55. except requests.ConnectionError:
  56. print('Failed to Save Image')
  57.  
  58. def main(page):
  59. json = get_page(page)
  60. for item in get_image(json):
  61. print(item)
  62. save_page(item)
  63.  
  64. if __name__ == '__main__':
  65. pool = Pool()
  66. pool.map(main, [i for i in range(0, 200, 20)])
  67. pool.close()
  68. pool.join()

Ajax爬取豆瓣电影目录(Python)的更多相关文章

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

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

  2. 利用Python爬取豆瓣电影

    目标:使用Python爬取豆瓣电影并保存MongoDB数据库中 我们先来看一下通过浏览器的方式来筛选某些特定的电影: 我们把URL来复制出来分析分析: https://movie.douban.com ...

  3. Python开发爬虫之静态网页抓取篇:爬取“豆瓣电影 Top 250”电影数据

    所谓静态页面是指纯粹的HTML格式的页面,这样的页面在浏览器中展示的内容都在HTML源码中. 目标:爬取豆瓣电影TOP250的所有电影名称,网址为:https://movie.douban.com/t ...

  4. Python爬虫爬取豆瓣电影之数据提取值xpath和lxml模块

    工具:Python 3.6.5.PyCharm开发工具.Windows 10 操作系统.谷歌浏览器 目的:爬取豆瓣电影排行榜中电影的title.链接地址.图片.评价人数.评分等 网址:https:// ...

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

    本文旨在提供爬取豆瓣电影<我不是药神>评论和词云展示的代码样例 1.分析URL 2.爬取前10页评论 3.进行词云展示 1.分析URL 我不是药神 短评 第一页url https://mo ...

  6. Python爬取豆瓣电影top

    Python爬取豆瓣电影top250 下面以四种方法去解析数据,前面三种以插件库来解析,第四种以正则表达式去解析. xpath pyquery beaufifulsoup re 爬取信息:名称  评分 ...

  7. python爬取豆瓣电影信息数据

    题外话+ 大家好啊,最近自己在做一个属于自己的博客网站(准备辞职回家养老了,明年再战)在家里 琐事也很多, 加上自己 一回到家就懒了(主要是家里冷啊! 广东十几度,老家几度,躲在被窝瑟瑟发抖,) 由于 ...

  8. python 爬取豆瓣电影短评并wordcloud生成词云图

    最近学到数据可视化到了词云图,正好学到爬虫,各种爬网站 [实验名称] 爬取豆瓣电影<千与千寻>的评论并生成词云 1. 利用爬虫获得电影评论的文本数据 2. 处理文本数据生成词云图 第一步, ...

  9. python 爬虫&爬取豆瓣电影top250

    爬取豆瓣电影top250from urllib.request import * #导入所有的request,urllib相当于一个文件夹,用到它里面的方法requestfrom lxml impor ...

随机推荐

  1. 【Java学习笔记】线程安全的单例模式及双重检查锁—个人理解

    搬以前写的博客[2014-12-30 16:04] 在web应用中服务器面临的是大量的访问请求,免不了多线程程序,但是有时候,我们希望在多线程应用中的某一个类只能新建一个对象的时候,就会遇到问题. 首 ...

  2. AOP技术介绍--(AOP技术基础)

    2.1 AOP技术起源        AOP技术的诞生并不算晚,早在1990年开始,来自Xerox Palo Alto Research Lab(即PARC)的研究人员就对面向对象思想的局限性进行了分 ...

  3. php中判断数组键值,array_key_exists和isset区别

    $arr = array('key' => NULL); if(isset($arr['key'])){ echo 'isset'; } else { echo 'unset'; } echo ...

  4. bzoj4128 Matrix 矩阵 BSGS

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4128 题解 想了十分钟没有任何思路. 然后一眼瞥见一句话"数据保证在 \(p\) 内 ...

  5. Map和Set的联系

    Java中的集合 Java中的集合包括三大类,它们是Set.List和Map,它们都处于java.util包中,Set.List和Map都是接口,它们有各自的实现类.Set的实现类主要有HashSet ...

  6. @ControllerAdvice全局数据预处理

    在传统项目的Controller的方法中传入参数,对象中的属性相同时,会出现以下错误         Book类和Author类     这是因为两个对象中的name相同,传参时分不清西游记和六小龄童 ...

  7. Centos6安装mysql

    此处安装的是MariaDB,介绍如下: MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可. 开发这个分支的原因之一是:甲骨文公司收购了MySQL后,有将My ...

  8. Jmeter的JDBC请求执行多条SQL语句

    注:有mysqlconnector/j 3.1.1以上版本才支持执行多条sql语句 1.     下载jdbc驱动为了连接Mysql数据库,还需要有个jdbc驱动:mysql-connector-ja ...

  9. 按照MySQL

    转载自:https://mp.weixin.qq.com/s?__biz=MzIwNzk0NjE1MQ==&mid=2247484200&idx=1&sn=6eed12242c ...

  10. BZOJ 2060: [Usaco2010 Nov]Visiting Cows 拜访奶牛 树形DP

    Code: #include <bits/stdc++.h> #define setIO(s) freopen(s".in","r",stdin) ...