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的Tornado框架实现一个简单的WebQQ机器人
Apr 24 Python
Python中super关键字用法实例分析
May 28 Python
python实现八大排序算法(1)
Sep 14 Python
Python 内置函数memoryview(obj)的具体用法
Nov 23 Python
简单实现python收发邮件功能
Jan 05 Python
Python利用Django如何写restful api接口详解
Jun 08 Python
Python中循环后使用list.append()数据被覆盖问题的解决
Jul 01 Python
python-django中的APPEND_SLASH实现方法
Jun 21 Python
python字符串替换第一个字符串的方法
Jun 26 Python
Python3实现汉语转换为汉语拼音
Jul 08 Python
Python基于Opencv来快速实现人脸识别过程详解(完整版)
Jul 11 Python
Python集合基本概念与相关操作实例分析
Oct 30 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和数据库结合的一个简单的web实例 代码分析 (php初学者)
2011/07/28 PHP
关于php支持的协议与封装协议总结(推荐)
2017/11/17 PHP
jquery监控数据是否变化(修正版)
2011/04/12 Javascript
浅析JavaScript中的常用算法与函数
2013/11/21 Javascript
jquery1.9 下检测浏览器类型和版本的方法
2013/12/26 Javascript
createTextRange()的使用示例含文本框选中部分文字内容
2014/02/24 Javascript
扩展jQuery对象时如何扩展成员变量具体怎么实现
2014/04/25 Javascript
jQuery插件Tmpl的简单使用方法
2015/04/27 Javascript
对JavaScript的全文搜索实现相关度评分的功能的方法
2015/06/24 Javascript
使用RequireJS优化JavaScript引用代码的方法
2015/07/01 Javascript
JavaScript使用encodeURI()和decodeURI()获取字符串值的方法
2015/08/04 Javascript
Jquery通过ajax请求NodeJS返回json数据实例
2016/11/08 NodeJs
原生JavaScript实现Ajax异步请求
2017/11/19 Javascript
JS Object.preventExtensions(),Object.seal()与Object.freeze()用法实例分析
2018/08/25 Javascript
jQuery滑动效果实现方法分析
2018/09/05 jQuery
零基础之Node.js搭建API服务器的详解
2019/03/08 Javascript
layui监听select变化,以及设置radio选中的方法
2019/09/24 Javascript
vue使用exif获取图片经纬度的示例代码
2020/12/11 Vue.js
vue监听滚动事件的方法
2020/12/21 Vue.js
Python中获取网页状态码的两个方法
2014/11/03 Python
详解Python map函数及Python map()函数的用法
2017/11/16 Python
python实现教务管理系统
2018/03/12 Python
为何人工智能(AI)首选Python?读完这篇文章你就知道了(推荐)
2019/04/06 Python
Python 排序最长英文单词链(列表中前一个单词末字母是下一个单词的首字母)
2020/12/14 Python
详解Css3新特性应用之过渡与动画
2017/01/10 HTML / CSS
使用Html5 Stream开发实时监控系统
2020/06/02 HTML / CSS
印度领先的眼镜电子商务网站:Lenskart
2019/12/16 全球购物
幼儿园师德演讲稿
2014/05/06 职场文书
教师三严三实心得体会
2014/10/11 职场文书
涉外离婚协议书怎么写
2014/11/20 职场文书
建筑工程材料员岗位职责
2015/04/11 职场文书
学生党支部工作总结2015
2015/05/26 职场文书
2016大学生社会实践单位评语
2015/12/01 职场文书
2016年十一促销广告语
2016/01/28 职场文书
2016年社区服务活动总结
2016/04/06 职场文书
MySQL锁机制
2021/04/05 MySQL