Python基于分析Ajax请求实现抓取今日头条街拍图集功能示例


Posted in Python onJuly 19, 2018

本文实例讲述了Python基于分析Ajax请求实现抓取今日头条街拍图集功能。分享给大家供大家参考,具体如下:

Python基于分析Ajax请求实现抓取今日头条街拍图集功能示例

代码:

import os
import re
import json
import time
from hashlib import md5
from multiprocessing import Pool
import requests
from requests.exceptions import RequestException
from pymongo import MongoClient
# 配置信息
OFFSET_START = 0  # 爬去页面的起始下标
OFFSET_END = 20  # 爬去页面的结束下标
KEYWORD = '街拍'  # 搜索的关键字
# mongodb相关配置
MONGO_URL = 'localhost'
MONGO_DB = 'toutiao'  # 数据库名称
MONGO_TABLE = 'jiepai' # 集合名称
# 图片保存的文件夹名称
IMAGE_PATH = 'images'
headers = {
  "User-Agent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'
}
client = MongoClient(host=MONGO_URL)
db = client[MONGO_DB]
jiepai_table = db[MONGO_TABLE]
if not os.path.exists(IMAGE_PATH):
  os.mkdir(IMAGE_PATH)
def get_html(url, params=None):
  try:
    response = requests.get(url, params=params, headers=headers)
    if response.status_code == 200:
      return response.text
    return None
  except RequestException as e:
    print("请求%s失败: " % url, e)
    return None
# 获取索引页内容
def get_index_page(offset, keyword):
  basic_url = 'http://www.toutiao.com/search_content/'
  params = {
    'offset': offset,
    'format': 'json',
    'keyword': keyword,
    'autoload': 'true',
    'count': 20,
    'cur_tab': 3
  }
  return get_html(basic_url, params)
def parse_index_page(html):
  '''
  解析索引页内容
  返回: 索引页中包含的所有详情页url
  '''
  if not html:
    return
  data = json.loads(html)
  if 'data' in data:
    for item in data['data']:
      article_url = item['article_url']
      if 'toutiao.com/group' in article_url:
        yield article_url
# 获取详情页
def get_detail_page(url):
  return get_html(url)
# 解析详情页
def parse_detail_page(url, html):
  '''
    解析详情页
    返回对应的标题,url和包含的图片url
  '''
  title_reg = re.compile('<title>(.*?)</title>')
  title = title_reg.search(html).group(1)
  gallery_reg = re.compile('var gallery = (.*?);')
  gallery = gallery_reg.search(html)
  if gallery and 'sub_images' in gallery.group(1):
    images = json.loads(gallery.group(1))['sub_images']
    image_list = [image['url'] for image in images]
    return {
      'title': title,
      'url': url,
      'images': image_list
    }
  return None
def save_to_mongodb(content):
  jiepai_table.insert(content)
  print("存储到mongdob成功", content)
def download_images(image_list):
  for image_url in image_list:
    try:
      response = requests.get(image_url)
      if response.status_code == 200:
        save_image(response.content)
    except RequestException as e:
      print("下载图片失败: ", e)
def save_image(content):
  '''
    对图片的二进制内容做hash,构造图片路径,以此保证图片不重复
  '''
  file_path = '{0}/{1}/{2}.{3}'.format(os.getcwd(),
                     IMAGE_PATH, md5(content).hexdigest(), 'jpg')
  # 去除重复的图片
  if not os.path.exists(file_path):
    with open(file_path, 'wb') as f:
      f.write(content)
def jiepai(offset):
  html = get_index_page(offset, KEYWORD)
  if html is None:
    return
  page_urls = list(parse_index_page(html))
  # print("详情页url列表:" )
  # for page_url in page_urls:
  #   print(page_url)
  for page in page_urls:
    print('get detail page:', page)
    html = get_detail_page(page)
    if html is None:
      continue
    content = parse_detail_page(page, html)
    if content:
      save_to_mongodb(content)
      download_images(content['images'])
      time.sleep(1)
  print('-------------------------------------')
if __name__ == '__main__':
  offset_list = range(OFFSET_START, OFFSET_END)
  pool = Pool()
  pool.map(jiepai, offset_list)

备注:

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

import requests
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'
url = basic_url.format(0)
html = requests.get(url).json()
items = html['data']
for item in items:
  title = item['media_name']
  image_list = [image_detail['url'] for image_detail in item['image_detail']]
  print(title, image_list)

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
python插入排序算法的实现代码
Nov 21 Python
实例解析Python的Twisted框架中Deferred对象的用法
May 25 Python
详解Tensorflow数据读取有三种方式(next_batch)
Feb 01 Python
利用Python写一个爬妹子的爬虫
Jun 08 Python
Windows系统下PhantomJS的安装和基本用法
Oct 21 Python
使用Python和Prometheus跟踪天气的使用方法
May 06 Python
python pip源配置,pip配置文件存放位置的方法
Jul 12 Python
python之pexpect实现自动交互的例子
Jul 25 Python
详解Python中的分支和循环结构
Feb 11 Python
Django REST framwork的权限验证实例
Apr 02 Python
PyTorch中的C++扩展实现
Apr 02 Python
Python延迟绑定问题原理及解决方案
Aug 04 Python
Python通过调用有道翻译api实现翻译功能示例
Jul 19 #Python
python3基于OpenCV实现证件照背景替换
Jul 18 #Python
python和opencv实现抠图
Jul 18 #Python
Python错误处理操作示例
Jul 18 #Python
Python内存读写操作示例
Jul 18 #Python
NumPy 数学函数及代数运算的实现代码
Jul 18 #Python
Sanic框架应用部署方法详解
Jul 18 #Python
You might like
php中删除字符串中最先出现某个字符的实现代码
2013/02/03 PHP
解析PHP中$_FILES的使用以及注意事项
2013/07/05 PHP
Yii扩展组件编写方法实例分析
2015/06/29 PHP
完美解决phpexcel导出到xls文件出现乱码的问题
2016/10/29 PHP
PHP中使用jQuery+Ajax实现分页查询多功能操作(示例讲解)
2017/09/17 PHP
PHP 计算至少是其他数字两倍的最大数的实现代码
2020/05/26 PHP
php redis setnx分布式锁简单原理解析
2020/10/23 PHP
JavaScript下申明对象的几种方法小结
2008/10/02 Javascript
一段批量给页面上的控件赋值js
2010/06/19 Javascript
js 实现图片预加载(js操作 Image对象属性complete ,事件onload 异步加载图片)
2011/03/25 Javascript
如何用js控制frame的隐藏或显示的解决办法
2013/03/20 Javascript
Javascript别踩白块儿(钢琴块儿)小游戏实现代码
2017/07/20 Javascript
vue.js使用v-if实现显示与隐藏功能示例
2018/07/06 Javascript
vue+axios 前端实现的常用拦截的代码示例
2018/08/23 Javascript
Vue 2.0 侦听器 watch属性代码详解
2019/06/19 Javascript
[03:22]DAC最前线(第二期)—DOTA2亚洲邀请赛主赛场周边及线路探访
2015/01/24 DOTA
python使用beautifulsoup从爱奇艺网抓取视频播放
2014/01/23 Python
python获取本机mac地址和ip地址的方法
2015/04/29 Python
Python基于分析Ajax请求实现抓取今日头条街拍图集功能示例
2018/07/19 Python
python2和python3的输入和输出区别介绍
2018/11/20 Python
Django实现跨域请求过程详解
2019/07/25 Python
详细分析Python垃圾回收机制
2020/07/01 Python
Python如何实现感知器的逻辑电路
2020/12/25 Python
CSS3媒体查询Media Queries基础学习教程
2016/02/29 HTML / CSS
Toppik顶丰增发纤维官网:解决头发稀疏
2017/12/30 全球购物
美国购买汽车零件网站:Buy Auto Parts
2018/04/02 全球购物
英国最大的汽车配件在线商店:Euro Car Parts
2019/09/30 全球购物
应用电子技术专业个人求职信
2013/09/21 职场文书
高级文秘工作总结的自我评价
2013/09/28 职场文书
实习自我鉴定范文
2013/10/30 职场文书
司法局群众路线教育实践活动整改措施思想汇报
2014/10/13 职场文书
毕业赠语大全
2015/06/23 职场文书
JavaScript控制台的更多功能
2021/04/28 Javascript
浅谈JS的原型和原型链
2021/06/04 Javascript
Python 绘制多因子柱状图
2022/05/11 Python
Java获取字符串编码格式实现思路
2022/09/23 Java/Android