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+Django在windows下的开发环境配置图解
Nov 11 Python
Python中遍历字典过程中更改元素导致异常的解决方法
May 12 Python
Python 爬虫之超链接 url中含有中文出错及解决办法
Aug 03 Python
Python网络编程详解
Oct 31 Python
python中字符串比较使用is、==和cmp()总结
Mar 18 Python
Python numpy 提取矩阵的某一行或某一列的实例
Apr 03 Python
python使用turtle绘制国际象棋棋盘
May 23 Python
python实现websocket的客户端压力测试
Jun 25 Python
python实现京东订单推送到测试环境,提供便利操作示例
Aug 09 Python
使用OpenCV实现仿射变换—平移功能
Aug 29 Python
Python读取文件内容为字符串的方法(多种方法详解)
Mar 04 Python
Python基于smtplib协议实现发送邮件
Jun 03 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二分法在IP地址查询中的应用
2008/08/12 PHP
PHP 批量更新网页内容实现代码
2010/01/05 PHP
探讨如何在PHP开启gzip页面压缩实例
2013/06/09 PHP
php根据身份证号码计算年龄的实例代码
2014/01/18 PHP
php获取目录下所有文件及目录(多种方法)(推荐)
2019/05/14 PHP
Laravel的Auth验证Token验证使用自定义Redis的例子
2019/09/30 PHP
PHP实现创建一个RPC服务操作示例
2020/02/23 PHP
IE中直接运行显示当前网页中的图片 推荐
2006/08/31 Javascript
菜单效果
2006/10/14 Javascript
网页前台通过js非法字符过滤代码(骂人的话等等)
2010/05/26 Javascript
查看图片(前进后退)功能实现js代码
2013/04/24 Javascript
基于jquery固定于顶部的导航响应浏览器滚动条事件
2014/11/02 Javascript
AngularJS 获取ng-repeat动态生成的ng-model值实例详解
2016/11/29 Javascript
node.js之基础加密算法模块crypto详解
2018/09/11 Javascript
[36:17]DOTA2上海特级锦标赛 - VGL音乐会全集
2016/03/06 DOTA
python生成指定长度的随机数密码
2014/01/23 Python
python smtplib模块发送SSL/TLS安全邮件实例
2015/04/08 Python
python传递参数方式小结
2015/04/17 Python
Python使用PyCrypto实现AES加密功能示例
2017/05/22 Python
Python操作SQLite数据库的方法详解
2017/06/16 Python
Python中用字符串调用函数或方法示例代码
2017/08/04 Python
python使用生成器实现可迭代对象
2018/03/20 Python
浅谈Python的list中的选取范围
2018/11/12 Python
Django自带日志 settings.py文件配置方法
2019/08/30 Python
Python读取csv文件实例解析
2019/12/30 Python
python离线安装外部依赖包的实现
2020/02/13 Python
Python实现定时监测网站运行状态的示例代码
2020/09/30 Python
Anaconda+spyder+pycharm的pytorch配置详解(GPU)
2020/10/18 Python
澳大利亚珍珠首饰购物网站:Vayo Pearls
2019/03/11 全球购物
苏格兰在线威士忌商店:The Whisky Barrel
2019/05/07 全球购物
2014年公务员思想汇报范文:全心全意为人民服务
2014/03/06 职场文书
乡文化站暑期培训方案
2014/08/28 职场文书
2015年店长工作总结范文
2015/04/08 职场文书
python 定义函数 返回值只取其中一个的实现
2021/05/21 Python
python中__slots__节约内存的具体做法
2021/07/04 Python
用Java实现简单计算器功能
2021/07/21 Java/Android