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编程之属性和方法实例详解
May 19 Python
Python批量修改文本文件内容的方法
Apr 29 Python
Python采用Django制作简易的知乎日报API
Aug 03 Python
使用Python写一个贪吃蛇游戏实例代码
Aug 21 Python
Python使用文件锁实现进程间同步功能【基于fcntl模块】
Oct 16 Python
CentOS 6.5中安装Python 3.6.2的方法步骤
Dec 03 Python
django限制匿名用户访问及重定向的方法实例
Feb 07 Python
python numpy 一维数组转变为多维数组的实例
Jul 02 Python
python for循环输入一个矩阵的实例
Nov 14 Python
pandas的to_datetime时间转换使用及学习心得
Aug 11 Python
python模拟点击玩游戏的实例讲解
Nov 26 Python
golang特有程序结构入门教程
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版 汉字转码的实现详解
2013/06/09 PHP
关于js和php对url编码的处理方法
2014/03/04 PHP
2个Codeigniter文件批量上传控制器写法例子
2014/07/25 PHP
PHP 文件上传后端处理实用技巧方法
2017/01/06 PHP
Yii框架布局文件的动态切换操作示例
2019/11/11 PHP
jquery.Jwin.js 基于jquery的弹出层插件代码
2012/05/23 Javascript
检测input每次的输入是否合法遇到汉字输入就有问题
2012/05/23 Javascript
JavaScript中setAttribute用法介绍
2013/07/20 Javascript
简单常用的幻灯片播放实现代码
2013/09/25 Javascript
谈谈impress.js初步理解
2015/09/09 Javascript
JS操作COOKIE实现备忘记录的方法
2016/04/01 Javascript
vue使用watch 观察路由变化,重新获取内容
2017/03/08 Javascript
Vue render渲染时间戳转时间,时间转时间戳及渲染进度条效果
2018/07/27 Javascript
React router动态加载组件之适配器模式的应用详解
2018/09/12 Javascript
详解vue文件中使用echarts.js的两种方式
2018/10/18 Javascript
Vue.Draggable拖拽功能的配置使用方法
2020/07/29 Javascript
vscode vue 文件模板的配置方法
2019/07/23 Javascript
Vue项目打包压缩的实现(让页面更快响应)
2020/03/10 Javascript
解决echarts echarts数据动态更新和dataZoom被重置问题
2020/07/20 Javascript
[56:42]VP vs RNG 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
[01:28]国服启动器接入蒸汽平台操作流程视频
2021/03/11 DOTA
videocapture库制作python视频高速传输程序
2013/12/23 Python
python使用wxPython打开并播放wav文件的方法
2015/04/24 Python
python脚本设置系统时间的两种方法
2016/02/21 Python
深入理解python多进程编程
2016/06/12 Python
Python的Tornado框架的异步任务与AsyncHTTPClient
2016/06/27 Python
python实现冒泡排序算法的两种方法
2018/03/10 Python
Python如何爬取实时变化的WebSocket数据的方法
2019/03/09 Python
用Cython加速Python到“起飞”(推荐)
2019/08/01 Python
Pytorch使用MNIST数据集实现基础GAN和DCGAN详解
2020/01/10 Python
给Django Admin添加验证码和多次登录尝试限制的实现
2020/07/26 Python
奢华的意大利皮革手袋:Bene Handbags
2019/10/29 全球购物
中国一家综合的外贸B2C电子商务网站:DealeXtreme(DX)
2020/03/10 全球购物
仰望星空观后感
2015/06/10 职场文书
关于PHP数组迭代器的使用方法实例
2021/11/17 PHP
Python中第三方库Faker的使用详解
2022/04/02 Python