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使用matplotlib绘制柱状图教程
Feb 08 Python
python僵尸进程产生的原因
Jul 21 Python
python使用itchat实现手机控制电脑
Feb 22 Python
Python Numpy 数组的初始化和基本操作
Mar 13 Python
Python实现分段线性插值
Dec 17 Python
Django保护敏感信息的方法示例
May 09 Python
Django集成CAS单点登录的方法示例
Jun 10 Python
python获取磁盘号下盘符步骤详解
Jun 19 Python
tensorflow pb to tflite 精度下降详解
May 25 Python
Python如何生成xml文件
Jun 04 Python
关于Python3爬虫利器Appium的安装步骤
Jul 29 Python
Django路由层URLconf作用及原理解析
Sep 24 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
js+php实现静态页面实时调用用户登陆状态的方法
2015/01/04 PHP
PHP实现返回JSON和XML的类分享
2015/01/28 PHP
给WordPress中的留言加上楼层号的PHP代码实例
2015/12/14 PHP
10个对初学者非常有用的PHP技巧
2016/04/06 PHP
Javascript图像处理—为矩阵添加常用方法
2012/12/27 Javascript
jQuery动态地获取系统时间实现代码
2013/05/24 Javascript
jQuery实现仿微软首页感应鼠标变化滑动窗口效果
2015/10/08 Javascript
为何JS操作的href都是javascript:void(0);呢
2015/11/12 Javascript
AngularJs bootstrap搭载前台框架——准备工作
2016/09/01 Javascript
vue2.0父子组件及非父子组件之间的通信方法
2017/01/21 Javascript
JS运动特效之链式运动分析
2018/01/24 Javascript
vue 弹框产生的滚动穿透问题的解决
2018/09/21 Javascript
彻底弄懂 JavaScript 执行机制
2018/10/23 Javascript
详解vue-cli3多页应用改造
2019/06/04 Javascript
JS中比Switch...Case更优雅的多条件判断写法
2019/09/05 Javascript
Vue+ElementUI table实现表格分页
2019/12/14 Javascript
js数据类型转换与流程控制操作实例分析
2019/12/18 Javascript
Vue页面跳转传递参数及接收方式
2020/09/09 Javascript
python实现简单的socket server实例
2015/04/29 Python
Python3网络爬虫之使用User Agent和代理IP隐藏身份
2017/11/23 Python
Python中最大最小赋值小技巧(分享)
2017/12/23 Python
Python编程在flask中模拟进行Restful的CRUD操作
2018/12/28 Python
Python图像处理之gif动态图的解析与合成操作详解
2018/12/30 Python
python定间隔取点(np.linspace)的实现
2019/11/27 Python
PYQT5 vscode联合操作qtdesigner的方法
2020/03/24 Python
Django form表单与请求的生命周期步骤详解
2020/06/07 Python
介绍一下HTTP、HTTPS和SSL
2012/12/16 面试题
公务员总结性个人自我评价
2013/12/05 职场文书
新学期开学寄语
2014/01/18 职场文书
建筑个人求职信范文
2014/01/25 职场文书
《这儿真好》教学反思
2014/02/22 职场文书
加强作风建设演讲稿
2014/10/24 职场文书
网络销售员岗位职责
2015/04/11 职场文书
MYSQL主从数据库同步备份配置的方法
2021/05/26 MySQL
教你怎么用python selenium实现自动化测试
2021/05/27 Python
JavaScript异步操作中串行和并行
2021/11/20 Javascript