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中的匿名函数使用简介
Apr 27 Python
python实现文件快照加密保护的方法
Jun 30 Python
python清除字符串里非字母字符的方法
Jul 02 Python
python中文分词,使用结巴分词对python进行分词(实例讲解)
Nov 14 Python
Windows系统下PhantomJS的安装和基本用法
Oct 21 Python
python实现控制电脑鼠标和键盘,登录QQ的方法示例
Jul 06 Python
django解决订单并发问题【推荐】
Jul 31 Python
python爬虫 批量下载zabbix文档代码实例
Aug 21 Python
Python使用tkinter模块实现推箱子游戏
Oct 08 Python
Python定义函数实现累计求和操作
May 03 Python
在keras中model.fit_generator()和model.fit()的区别说明
Jun 17 Python
python中not、and和or的优先级与详细用法介绍
Nov 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
DISCUZ 论坛管理员密码忘记的解决方法
2009/05/14 PHP
PHP设置一边执行一边输出结果的代码
2013/09/30 PHP
php获取网页上所有链接的方法
2015/04/03 PHP
PHPMAILER实现PHP发邮件功能
2018/04/18 PHP
TP5框架安全机制实例分析
2020/04/05 PHP
为jquery.ui.dialog 增加“在当前鼠标位置打开”的功能
2009/11/24 Javascript
六款帮助你实现惊艳视差滚动效果的jQuery插件
2012/09/14 Javascript
javascript作用域和闭包使用详解
2014/04/25 Javascript
javascript简单实现图片预加载
2014/12/03 Javascript
实例讲解js验证表单项是否为空的方法
2016/01/09 Javascript
JavaScript接口的实现三种方式(推荐)
2016/06/14 Javascript
JS+HTML5 FileReader实现文件上传前本地预览功能
2020/03/27 Javascript
用javascript获取任意颜色的更亮或更暗颜色值示例代码
2017/07/21 Javascript
如何在wxml中直接写js代码(wxs)
2019/11/14 Javascript
vant组件中 dialog的确认按钮的回调事件操作
2020/11/04 Javascript
[07:39]第一届亚洲邀请赛回顾视频
2017/02/14 DOTA
python返回昨天日期的方法
2015/05/13 Python
python中zip和unzip数据的方法
2015/05/27 Python
python实现决策树
2017/12/21 Python
Python如何抓取天猫商品详细信息及交易记录
2018/02/23 Python
python3实现点餐系统
2019/01/24 Python
树莓派与PC端在局域网内运用python实现即时通讯
2019/06/22 Python
python爬虫 urllib模块url编码处理详解
2019/08/20 Python
Anaconda使用IDLE的实现示例
2020/09/23 Python
基于Html5 canvas实现裁剪图片和马赛克功能及又拍云上传图片 功能
2019/07/09 HTML / CSS
学生励志演讲稿
2014/01/06 职场文书
暑假家长评语大全
2014/04/17 职场文书
golang elasticsearch Client的使用详解
2021/05/05 Golang
SpringBoot实现quartz定时任务可视化管理功能
2021/08/30 Java/Android
Windows下用Nginx配置https服务器及反向代理的问题
2021/09/25 Servers
Nginx实现负载均衡的项目实践
2022/03/18 Servers
基于Python实现将列表数据生成折线图
2022/03/23 Python
SQL试题 使用窗口函数选出连续3天登录的用户
2022/04/24 Oracle
一文了解Java动态代理的原理及实现
2022/07/07 Java/Android
不想升级Win11?教你彻底锁定老版Windows系统的方法(附下载地址)
2022/09/23 数码科技
js 实现验证码输入框示例详解
2022/09/23 Javascript