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中迭代器(iterator)用法实例分析
Apr 29 Python
详解Python中open()函数指定文件打开方式的用法
Jun 04 Python
如何利用python查找电脑文件
Apr 27 Python
对Python 获取类的成员变量及临时变量的方法详解
Jan 22 Python
Python3 批量扫描端口的例子
Jul 25 Python
基于Python获取docx/doc文件内容代码解析
Feb 17 Python
使用python执行shell脚本 并动态传参 及subprocess的使用详解
Mar 06 Python
python安装后的目录在哪里
Jun 21 Python
Python字符串的15个基本操作(小结)
Feb 03 Python
Python3使用Selenium获取session和token方法详解
Feb 16 Python
python设置 matplotlib 正确显示中文的四种方式
May 10 Python
关于Numpy之repeat、tile的用法总结
Jun 02 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 生成文字png图片的代码
2011/04/17 PHP
FirePHP 推荐一款PHP调试工具
2011/04/23 PHP
php读取纯真ip数据库使用示例
2014/01/26 PHP
PHP创建XML接口示例
2019/07/04 PHP
简单的php购物车代码
2020/06/05 PHP
浅谈关于JavaScript的语言特性分析
2013/04/11 Javascript
文本有关的样式和jQuery求对象的高宽问题分别说明
2013/08/30 Javascript
Javascript 颜色渐变效果的实现代码
2013/10/01 Javascript
调用DOM对象的focus使文本框获得焦点
2014/02/19 Javascript
js jquery获取当前元素的兄弟级 上一个 下一个元素
2015/09/01 Javascript
JavaScript实现的搜索及高亮显示功能示例
2017/08/14 Javascript
Bootstrap标签页(Tab)插件切换echarts不显示问题的解决
2018/07/13 Javascript
详解如何探测小程序返回到webview页面
2019/05/14 Javascript
Vue使用vue-recoure + http-proxy-middleware + vuex配合promise实现基本的跨域请求封装
2019/10/21 Javascript
Python with的用法
2014/08/22 Python
python实现文件快照加密保护的方法
2015/06/30 Python
Python入门之三角函数全解【收藏】
2017/11/08 Python
Python获取指定文件夹下的文件名的方法
2018/02/06 Python
使用python 3实现发送邮件功能
2018/06/15 Python
django+mysql的使用示例
2018/11/23 Python
python爬虫之验证码篇3-滑动验证码识别技术
2019/04/11 Python
Python3.8安装Pygame教程步骤详解
2020/08/14 Python
python 深度学习中的4种激活函数
2020/09/18 Python
Trip.com澳大利亚:在线旅行社
2019/12/01 全球购物
新三好学生主要事迹
2014/01/23 职场文书
关于逃课的检讨书
2014/01/23 职场文书
职工运动会感言
2014/02/07 职场文书
高中生职业生涯规划书
2014/02/24 职场文书
青年文明号创建承诺
2014/03/31 职场文书
护士求职信范文
2014/05/24 职场文书
技术负责人任命书
2014/06/05 职场文书
会计专业毕业生自荐书
2014/06/25 职场文书
防灾减灾宣传标语
2014/10/07 职场文书
2014年有孩子的离婚协议书范本
2014/10/08 职场文书
顶岗实习计划书
2015/01/16 职场文书
MongoDB使用profile分析慢查询的步骤
2021/04/30 MongoDB