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使用marshal模块序列化实例
Sep 25 Python
Python中将字典转换为XML以及相关的命名空间解析
Oct 15 Python
Python利用带权重随机数解决抽奖和游戏爆装备问题
Jun 16 Python
Python+树莓派+YOLO打造一款人工智能照相机
Jan 02 Python
Python多层装饰器用法实例分析
Feb 09 Python
python TCP Socket的粘包和分包的处理详解
Feb 09 Python
Python subprocess库的使用详解
Oct 26 Python
python消除序列的重复值并保持顺序不变的实例
Nov 08 Python
python中嵌套函数的实操步骤
Feb 27 Python
python实现合并两个排序的链表
Mar 03 Python
Python paramiko使用方法代码汇总
Nov 20 Python
教你如何使用Python开发一个钉钉群应答机器人
Jun 21 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清除数组中所有字符串两端空格的方法
2014/10/20 PHP
ThinkPHP框架设计及扩展详解
2014/11/25 PHP
php如何利用pecl安装mongodb扩展详解
2019/01/09 PHP
Jquery Ajax学习实例4 向WebService发出请求,返回实体对象的异步调用
2010/03/16 Javascript
定时器(setTimeout/setInterval)调用带参函数失效解决方法
2013/03/26 Javascript
js使用正则实现ReplaceAll全部替换的方法
2014/07/18 Javascript
js鼠标点击图片切换效果实现代码
2015/11/19 Javascript
js获取浏览器高度 窗口高度 元素尺寸 偏移属性的方法
2016/11/21 Javascript
javascript 单例模式详解及简单实例
2017/02/14 Javascript
Bootstrap入门教程一Hello Bootstrap初识
2017/03/02 Javascript
jquery.guide.js新版上线操作向导镂空提示jQuery插件(推荐)
2017/05/20 jQuery
express+mockjs实现模拟后台数据发送功能
2018/01/07 Javascript
详解使用VUE搭建后台管理系统(vue-cli更新至3.0)
2018/08/22 Javascript
javascript原型链学习记录之继承实现方式分析
2019/05/01 Javascript
解决Vue调用springboot接口403跨域问题
2019/09/02 Javascript
jQuery+css实现的点击图片放大缩小预览功能示例【图片预览 查看大图】
2020/05/29 jQuery
jdk1.8+vue elementui实现多级菜单功能
2020/09/24 Javascript
[43:43]完美世界DOTA2联赛PWL S2 LBZS vs Forest 第三场 11.29
2020/12/02 DOTA
python和shell实现的校验IP地址合法性脚本分享
2014/10/23 Python
python数据清洗系列之字符串处理详解
2017/02/12 Python
分享一个简单的python读写文件脚本
2017/11/25 Python
Python实现生成随机日期字符串的方法示例
2017/12/25 Python
使用Python处理BAM的方法
2018/09/28 Python
python的xpath获取div标签内html内容,实现innerhtml功能的方法
2019/01/02 Python
Python全局变量与global关键字常见错误解决方案
2020/10/05 Python
美国高端牛仔品牌:Silver Jeans
2019/12/12 全球购物
英国电信商店:BT Shop
2019/12/17 全球购物
领导的自我鉴定
2013/12/28 职场文书
信息与工商管理职业规划范文:为梦想而搏击
2014/09/11 职场文书
银行领导班子四风对照检查材料
2014/09/27 职场文书
党委领导班子整改方案
2014/09/30 职场文书
2014年教师个人工作总结
2014/11/10 职场文书
年度考核个人总结
2015/03/06 职场文书
区域销售经理岗位职责
2015/04/02 职场文书
laravel添加角色和模糊搜索功能的实现代码
2021/06/22 PHP
js前端设计模式优化50%表单校验代码示例
2022/06/21 Javascript