代码:

  1. import os
  2. import re
  3. import json
  4. import time
  5. from hashlib import md5
  6. from multiprocessing import Pool
  7.  
  8. import requests
  9. from requests.exceptions import RequestException
  10. from pymongo import MongoClient
  11.  
  12. # 配置信息
  13. OFFSET_START = 0 # 爬去页面的起始下标
  14. OFFSET_END = 20 # 爬去页面的结束下标
  15. KEYWORD = '街拍' # 搜索的关键字
  16.  
  17. # mongodb相关配置
  18. MONGO_URL = 'localhost'
  19. MONGO_DB = 'toutiao' # 数据库名称
  20. MONGO_TABLE = 'jiepai' # 集合名称
  21.  
  22. # 图片保存的文件夹名称
  23. IMAGE_PATH = 'images'
  24.  
  25. headers = {
  26. "User-Agent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'
  27. }
  28.  
  29. client = MongoClient(host=MONGO_URL)
  30. db = client[MONGO_DB]
  31. jiepai_table = db[MONGO_TABLE]
  32.  
  33. if not os.path.exists(IMAGE_PATH):
  34. os.mkdir(IMAGE_PATH)
  35.  
  36. def get_html(url, params=None):
  37. try:
  38. response = requests.get(url, params=params, headers=headers)
  39. if response.status_code == 200:
  40. return response.text
  41. return None
  42. except RequestException as e:
  43. print("请求%s失败: " % url, e)
  44. return None
  45.  
  46. # 获取索引页内容
  47. def get_index_page(offset, keyword):
  48. basic_url = 'http://www.toutiao.com/search_content/'
  49. params = {
  50. 'offset': offset,
  51. 'format': 'json',
  52. 'keyword': keyword,
  53. 'autoload': 'true',
  54. 'count': 20,
  55. 'cur_tab': 3
  56. }
  57. return get_html(basic_url, params)
  58.  
  59. def parse_index_page(html):
  60. '''
  61. 解析索引页内容
  62. 返回: 索引页中包含的所有详情页url
  63. '''
  64. if not html:
  65. return
  66. data = json.loads(html)
  67. if 'data' in data:
  68. for item in data['data']:
  69. article_url = item['article_url']
  70. if 'toutiao.com/group' in article_url:
  71. yield article_url
  72.  
  73. # 获取详情页
  74. def get_detail_page(url):
  75. return get_html(url)
  76.  
  77. # 解析详情页
  78.  
  79. def parse_detail_page(url, html):
  80. '''
  81. 解析详情页
  82. 返回对应的标题,url和包含的图片url
  83. '''
  84. title_reg = re.compile('<title>(.*?)</title>')
  85. title = title_reg.search(html).group(1)
  86. gallery_reg = re.compile('var gallery = (.*?);')
  87. gallery = gallery_reg.search(html)
  88. if gallery and 'sub_images' in gallery.group(1):
  89. images = json.loads(gallery.group(1))['sub_images']
  90. image_list = [image['url'] for image in images]
  91. return {
  92. 'title': title,
  93. 'url': url,
  94. 'images': image_list
  95. }
  96. return None
  97.  
  98. def save_to_mongodb(content):
  99. jiepai_table.insert(content)
  100. print("存储到mongdob成功", content)
  101.  
  102. def download_images(image_list):
  103. for image_url in image_list:
  104. try:
  105. response = requests.get(image_url)
  106. if response.status_code == 200:
  107. save_image(response.content)
  108. except RequestException as e:
  109. print("下载图片失败: ", e)
  110.  
  111. def save_image(content):
  112. '''
  113. 对图片的二进制内容做hash,构造图片路径,以此保证图片不重复
  114. '''
  115. file_path = '{0}/{1}/{2}.{3}'.format(os.getcwd(),
  116. IMAGE_PATH, md5(content).hexdigest(), 'jpg')
  117. # 去除重复的图片
  118. if not os.path.exists(file_path):
  119. with open(file_path, 'wb') as f:
  120. f.write(content)
  121.  
  122. def jiepai(offset):
  123. html = get_index_page(offset, KEYWORD)
  124. if html is None:
  125. return
  126. page_urls = list(parse_index_page(html))
  127. # print("详情页url列表:" )
  128. # for page_url in page_urls:
  129. # print(page_url)
  130.  
  131. for page in page_urls:
  132. print('get detail page:', page)
  133. html = get_detail_page(page)
  134. if html is None:
  135. continue
  136. content = parse_detail_page(page, html)
  137. if content:
  138. save_to_mongodb(content)
  139. download_images(content['images'])
  140. time.sleep(1)
  141. print('-------------------------------------')
  142.  
  143. if __name__ == '__main__':
  144. offset_list = range(OFFSET_START, OFFSET_END)
  145. pool = Pool()
  146. pool.map(jiepai, offset_list)

备注:

其实通过url请求返回的json数据中已经包含了图片列表

  1. import requests
  2.  
  3. basic_url = 'http://www.toutiao.com/search_content/?offset={}&format=json&keyword=%E8%A1%97%E6%8B%8D&autoload=true&count=20&cur_tab=3'
  4. url = basic_url.format(0)
  5. html = requests.get(url).json()
  6. items = html['data']
  7. for item in items:
  8. title = item['media_name']
  9. image_list = [image_detail['url'] for image_detail in item['image_detail']]
  10. print(title, image_list)

通过分析Ajax请求 抓取今日头条街拍图集的更多相关文章

  1. 爬虫(八):分析Ajax请求抓取今日头条街拍美图

    (1):分析网页 分析ajax的请求网址,和需要的参数.通过不断向下拉动滚动条,发现请求的参数中offset一直在变化,所以每次请求通过offset来控制新的ajax请求. (2)上代码 a.通过aj ...

  2. python3爬虫-分析Ajax,抓取今日头条街拍美图

    # coding=utf-8 from urllib.parse import urlencode import requests from requests.exceptions import Re ...

  3. 分析ajax请求抓取今日头条关键字美图

    # 目标:抓取今日头条关键字美图 # 思路: # 一.分析目标站点 # 二.构造ajax请求,用requests请求到索引页的内容,正则+BeautifulSoup得到索引url # 三.对索引url ...

  4. python学习(26)分析ajax请求抓取今日头条cosplay小姐姐图片

    分析ajax请求格式,模拟发送http请求,从而获取网页代码,进而分析取出需要的数据和图片.这里分析ajax请求,获取cosplay美女图片. 登陆今日头条,点击搜索,输入cosplay 下面查看浏览 ...

  5. Python爬虫学习==>第十一章:分析Ajax请求-抓取今日头条信息

    学习目的: 解决AJAX请求的爬虫,网页解析库的学习,MongoDB的简单应用 正式步骤 Step1:流程分析 抓取单页内容:利用requests请求目标站点,得到单个页面的html代码,返回结果: ...

  6. 分析Ajax来爬取今日头条街拍美图并保存到MongDB

    前提:.需要安装MongDB 注:因今日投票网页发生变更,如下代码不保证能正常使用 #!/usr/bin/env python #-*- coding: utf-8 -*- import json i ...

  7. python爬虫之分析Ajax请求抓取抓取今日头条街拍美图(七)

    python爬虫之分析Ajax请求抓取抓取今日头条街拍美图 一.分析网站 1.进入浏览器,搜索今日头条,在搜索栏搜索街拍,然后选择图集这一栏. 2.按F12打开开发者工具,刷新网页,这时网页回弹到综合 ...

  8. 15-分析Ajax请求并抓取今日头条街拍美图

    流程框架: 抓取索引页内容:利用requests请求目标站点,得到索引网页HTML代码,返回结果. 抓取详情页内容:解析返回结果,得到详情页的链接,并进一步抓取详情页的信息. 下载图片与保存数据库:将 ...

  9. Python Spider 抓取今日头条街拍美图

    """ 抓取今日头条街拍美图 """ import os import time import requests from hashlib ...

随机推荐

  1. xdoj-1010(区间问题)

    题目链接 1 扫描一遍不行扫描两遍呗 2 O(n)时间确定cd[i]  [max( a[k]-_min) _min是k+1~n的最小值.i<=k<=n] #include <cstd ...

  2. P2261 [CQOI2007]余数求和 (数论)

    题目链接:传送门 题目: 题目背景 数学题,无背景 题目描述 给出正整数n和k,计算G(n, k)=k mod + k mod + k mod + … + k mod n的值,其中k mod i表示k ...

  3. Caused by: java.sql.SQLException: ORA-24816: 在实际的 LONG 或 LOB 列之后提供了扩展的非 LONG 绑定数据

    今天客户说报告草稿保存不了,跟踪错误bug,了解到以下reason: 异常出现的环境:oracle11g + Hibernate 错误分析:这是oracle 11g在clob字段中的一个bug,ora ...

  4. python与系统做交互常用的模块和使用方法

    1.使用os模块与系统做简单命令的交互 >>>import os >>>os.popen('pwd') <open file 'pwd', mode 'r' ...

  5. Singer 学习一 使用Singer进行mysql 2 postgres 数据转换

    Singer 因为版本的问题,推荐的运行方式是使用virtualenv,对于taps&& target 的运行都是 推荐使用此方式,不然包兼容的问题太费事了 备注: 使用docker- ...

  6. SUPERSOCKET 客户端

    SUPERSOCKET.CLIENTENGINE 简单使用 2015年5月27日 HYJIACAN 发表回复 阅读 11,105 次 江大没有给ClientEngine的Demo,一直没有找到其它的. ...

  7. Eclipse之父、《设计模式》作者、Junit作者之Erich Gamma

    Erich Gamma拥有多重权威身份.他是Jazz项目的主要领导人:是Eclipse的项目管理委员会成员,被业界称为“Eclipse之父”: 是经典书<设计模式>的作者四人帮之一,199 ...

  8. SelectDataTable

    项目地址 :  https://github.com/kelin-xycs/SelectDataTable SelectDataTable 一个 用 C# 实现的 用 Sql select DataT ...

  9. php获取指定文件夹中文件名称

    /** * php获取指定文件夹中文件名称 * @author jackie <2018.10.10> */ public static function getFileName($fil ...

  10. 阿里云学习笔记之Java Web环境搭建

    1. 下载JDK7 http://www.oracle.com/technetwork/java/javase/downloads/java-archive-downloads-javase7-521 ...