今天学习分析ajax 请求,现把学得记录,

把我们在今日头条搜索街拍美图的时候,今日头条会发起ajax请求去请求图片,所以我们在网页源码中不能找到图片的url,但是今日头条网页中有一个json 文件,这相文件中就包括单个图集的具体url,通过访问这个url ,又可以获取一个json 文件,这个json 文件中有个键是url_list  这个键的值是一个List ,这个list中就存入了具体单个图片的下载url ,通过request.get()方法去访问这个url ,然后把得到content以二进制的方式写入到本地,并把其他数据存入到mongodb中,

代码如下,

  1. import requests
  2. import json
  3. from urllib.parse import urlencode
  4. from requests.exceptions import RequestException
  5. import re
  6. from bs4 import BeautifulSoup
  7. from config import *
  8. import pymongo
  9. from hashlib import md5
  10. import os
  11. from multiprocessing import Pool
  12.  
  13. def get_page_index(offset, keyword):
  14. """传入要数据,获得详情页面"""
  15. data = {
  16. "autoload": "true",
  17. "count": 20,
  18. "cur_tab": 3,
  19. "format": "json",
  20. "from": "gallery",
  21. "keyword": keyword,
  22. "offset": offset,
  23. }
  24. url = "https://www.toutiao.com/search_content/?" + urlencode(data)
  25. try:
  26. response = requests.get(url)
  27. if response.status_code == 200:
  28. return response.text
  29. return None
  30. except RequestException:
  31. print("请求index页面失败")
  32. return None
  33.  
  34. def parse_page_index(html):
  35. """头条街拍图片存在一个json中,json中的data就是单个图集的信息"""
  36. data = json.loads(html)
  37. if data and "data" in data.keys():
  38. for item in data.get("data"):
  39. yield item.get("article_url")
  40.  
  41. def get_page_detail(url):
  42. """获得单个图集url的信息"""
  43. try:
  44. response = requests.get(url)
  45. if response.status_code == 200:
  46. return response.text
  47. return None
  48. except RequestException:
  49. print("请求详情页面失败")
  50. return None
  51.  
  52. def parse_page_detail(html, url):
  53. """解析单位个图集url的网页信息,因为信息存放于一个json文件中,这个json文件嵌套在html中,所以使用re解析"""
  54. # 先用BeautifulSoup获得title.
  55. soup = BeautifulSoup(html, "lxml")
  56. title = soup.select("title")[0].get_text()
  57. print(title)
  58. images_pattern = re.compile('parse\("(.*?)"\),', re.S)
  59. result = re.search(images_pattern, html)
  60.  
  61. if result:
  62. data = result.group(1)
  63. data = json.loads(data)
  64. if data and "url_list" in data.keys():
  65. url_list = data.get("url_list")
  66. images = [item.get("url") for item in url_list]
  67. for image in images:
  68. # 调用函数下载图片到本地
  69. download_imag(image)
  70. # 返回数据,返回的数据存入mongodb
  71. return {
  72. "title": title,
  73. "images": images,
  74. "url": url,
  75. }
  76.  
  77. def save_to_mongo(result):
  78. client = pymongo.MongoClient(MONGO_URL, connect=False)
  79. db = client[MONGO_DB]
  80. if db[MONGO_TABLE].insert(result):
  81. print("insert into mongo success", result)
  82. return True
  83. else:
  84. return False
  85.  
  86. def download_imag(url):
  87. """# 下载图片到本地"""
  88. print("正在下载 :", url)
  89. try:
  90. response = requests.get(url)
  91. if response.status_code == 200:
  92. # response.content 返回二进制内容
  93. # response.text返回字符串
  94. save_image(response.content)
  95. except RequestException:
  96. print("请求图片失败", url)
  97.  
  98. def save_image(content):
  99. """解析图片url的信息,把获得的信息写入本地文件中"""
  100. file_path = '{0}/{1}.{2}'.format(os.getcwd(), md5(content).hexdigest(), "jpg")
  101. if not os.path.exists(file_path):
  102. with open(file_path, "wb") as f:
  103. f.write(content)
  104.  
  105. def main(offset):
  106. """主函数"""
  107. html = get_page_index(offset, KEYWORD)
  108. # 防止get_page_index没有取回数据
  109. if html is not None:
  110. for url in parse_page_index(html):
  111. html = get_page_detail(url)
  112. if html:
  113. result = parse_page_detail(html, url)
  114. save_to_mongo(result)
  115. print(result)
  116. else:
  117. print("get_page_index 函数没有取到数据")
  118.  
  119. if __name__ == "__main__":
  120. """使用多进程加快速度"""
  121. groups = [x * 20 for x in range(GROUP_START, GROUP_END)]
  122. pool = Pool()
  123. pool.map(main, groups)

这个程度代码相对简单,逻辑清楚,程序之间参数传递及程序的跳转也不难,只是分析今日头条的ajax请求,及获得各个json文件相对复杂一点.

我把程度的配置信息写在config.py 这个文件中,这样方法之后程序的重用,

config.py 代码如下:

  1. MONGO_URL="localhost"
  2. MONGO_DB="toutiao"
  3. MONGO_TABLE="toutiao"
  4.  
  5. GROUP_START = 1 # 定义起始循环点
  6. GROUP_END = 20 # 定义终止循环点
  7. KEYWORD="街拍"

通过这个程序,学会了分析,这种通过发起ajax请求而获取数据的网页的源码分析.这个程序不足的地方是,这个程序是用requsts库做的解析,程序会是用函数而不是类去实现,后续要把这个程序改用scrapy 库去实现.

分析AJAX抓取今日头条的街拍美图并把信息存入mongodb中的更多相关文章

  1. 分析 ajax 请求并抓取 “今日头条的街拍图”

    今日头条抓取页面: 分析街拍页面的 ajax 请求: 通过在 XHR 中查看内容,获取 url 链接,params 参数信息,将两者进行拼接后取得完整 url 地址.data 中的 article_u ...

  2. 分析Ajax抓取今日头条街拍美图

    spider.py # -*- coding:utf-8 -*- from urllib import urlencode import requests from requests.exceptio ...

  3. 关于爬虫的日常复习(9)—— 实战:分析Ajax抓取今日头条接拍美图

  4. python爬虫—— 抓取今日头条的街拍的妹子图

    AJAX 是一种用于创建快速动态网页的技术. 通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新.这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新. 近期在学习获取j ...

  5. 【Python3网络爬虫开发实战】 分析Ajax爬取今日头条街拍美图

    前言本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理.作者:haoxuan10 本节中,我们以今日头条为例来尝试通过分析Ajax请求 ...

  6. 爬虫—分析Ajax爬取今日头条图片

    以今日头条为例分析Ajax请求抓取网页数据.本次抓取今日头条的街拍关键字对应的图片,并保存到本地 一,分析 打开今日头条主页,在搜索框中输入街拍二字,打开开发者工具,发现浏览器显示的数据不在其源码里面 ...

  7. 分析Ajax爬取今日头条街拍美图-崔庆才思路

    站点分析 源码及遇到的问题 代码结构 方法定义 需要的常量 关于在代码中遇到的问题 01. 数据库连接 02.今日头条的反爬虫机制 03. json解码遇到的问题 04. 关于response.tex ...

  8. python多线程爬取-今日头条的街拍数据(附源码加思路注释)

    这里用的是json+re+requests+beautifulsoup+多线程 1 import json import re from multiprocessing.pool import Poo ...

  9. python抓取伯乐在线的全部文章,对标题分词后存入mongodb中

    依赖包: 1.pymongo 2.jieba # -*- coding: utf-8 -*- """ @author: jiangfuqiang "" ...

随机推荐

  1. 【Java学习笔记之十六】浅谈Java中的继承与多态

    1.  什么是继承,继承的特点? 子类继承父类的特征和行为,使得子类具有父类的各种属性和方法.或子类从父类继承方法,使得子类具有父类相同的行为. 特点:在继承关系中,父类更通用.子类更具体.父类具有更 ...

  2. [51nod1610]路径计数

    路径上所有边权的最大公约数定义为一条路径的值. 给定一个有向无环图. T次修改操作,每次修改一条边的边权,每次修改后输出有向无环图上路径的值为1的路径数量(对1,000,000,007取模). Inp ...

  3. HDU--1164

    Eddy's research I Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

  4. angular $cookies、$cookieStore

    js 文件 加载 <script src="angular-cookies/angular-cookies.js"></script>注入:angular. ...

  5. 自己实现一个each迭代器

    什么是迭代器? 其实就是对一个对象内部进行遍历的方法,比如jquery的each方法,或者原生js的foreach方法. 迭代器的特点 针对迭代器,这里有几个特点: ☑ 访问一个聚合对象的内容而无需暴 ...

  6. 从零开始学习前端JAVASCRIPT — 1、JavaScript基础

    1:定义:javascript是一种弱类型.动态类型.解释型的脚本语言. 弱类型:类型检查不严格,偏向于容忍隐式类型转换. 强类型:类型检查严格,偏向于不容忍隐式类型转换. 动态类型:运行的时候执行类 ...

  7. PHP move_uploaded_file() 函数

    PHP Filesystem 函数 定义和用法 move_uploaded_file() 函数将上传的文件移动到新位置. 若成功,则返回 true,否则返回 false. 语法 move_upload ...

  8. Html5+js测试题(开发版)

    ------------------------------------------------ 1. 谈谈你对js闭包的理解: 使用闭包主要是为了设计私有的方法和变量.闭包的优点是可以避免全局变量的 ...

  9. IOS开发之UIView总结1

    太长了,请看 http://blog.csdn.net/xdrt81y/article/details/9128695 performSelector: performSelector:withObj ...

  10. NPM使用命令总结

    NPM使用命令总结 npm是一个node包管理和分发工具,已经成为了非官方的发布node模块(包)的标准.有了npm,可以很快的找到特定服务要使用的包,进行下载.安装以及管理已经安装的包. 1.npm ...