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验证企业工商注册码
Oct 25 Python
浅谈python可视化包Bokeh
Feb 07 Python
使用python获取csv文本的某行或某列数据的实例
Apr 03 Python
pandas将DataFrame的列变成行索引的方法
Apr 10 Python
在python中使用xlrd获取合并单元格的方法
Dec 26 Python
python实现名片管理系统项目
Apr 26 Python
Python进阶:生成器 懒人版本的迭代器详解
Jun 29 Python
python实现滑雪游戏
Feb 22 Python
python matplotlib库的基本使用
Sep 23 Python
python中time.ctime()实例用法
Feb 03 Python
从Pytorch模型pth文件中读取参数成numpy矩阵的操作
Mar 04 Python
python爬取新闻门户网站的示例
Apr 25 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获取网站域名和地址的代码
2008/08/17 PHP
几个实用的PHP内置函数使用指南
2014/11/27 PHP
详解js异步文件加载器
2016/01/24 PHP
Extjs Ajax 乱码问题解决方案
2009/04/15 Javascript
如何书写高质量jQuery代码(使用jquery性能问题)
2014/06/30 Javascript
Javascript常用字符串判断函数代码分享
2014/12/08 Javascript
node.js中使用socket.io制作命名空间
2014/12/15 Javascript
js获取会话框prompt的返回值的方法
2015/01/10 Javascript
js实现遮罩层弹出框的方法
2015/01/15 Javascript
jquery制作LED 时钟特效
2015/02/01 Javascript
javascript实现在下拉列表中显示多级树形菜单的方法
2015/08/12 Javascript
vue.js表格组件开发的实例详解
2016/10/12 Javascript
javascript入门之window对象【新手必看】
2016/11/22 Javascript
基于JS实现弹出一个隐藏的div窗口body页面变成灰色并且不可被编辑
2016/12/14 Javascript
Bootstrap table两种分页示例
2016/12/23 Javascript
微信小程序自定义导航隐藏和显示功能
2017/06/13 Javascript
基于复选框demo(分享)
2017/09/27 Javascript
Vue自定义指令封装节流函数的方法示例
2018/07/09 Javascript
javascript使用正则实现去掉字符串前面的所有0
2018/07/23 Javascript
JavaScript设计模式之装饰者模式实例详解
2019/01/17 Javascript
详解element-ui级联菜单(城市三级联动菜单)和回显问题
2019/10/02 Javascript
JS实现判断移动端PC端功能
2020/02/21 Javascript
JS中的const命令你真懂它吗
2020/03/08 Javascript
python根据时间获取周数代码实例
2019/09/30 Python
keras 指定程序在某块卡上训练实例
2020/06/22 Python
Python pathlib模块使用方法及实例解析
2020/10/05 Python
英国家电直销:Appliances Direct
2016/09/22 全球购物
英国儿童设计师服装和玩具购物网站:Zac & Lulu
2020/10/19 全球购物
法人代表授权委托书
2014/04/08 职场文书
贷款委托书
2014/08/01 职场文书
高一军训的心得体会
2014/09/01 职场文书
普通党员个人剖析材料
2014/10/08 职场文书
先进基层党组织事迹材料
2014/12/25 职场文书
校长个人总结
2015/03/03 职场文书
教你如何使用Python Tkinter库制作记事本
2021/06/10 Python
vue实现列表垂直无缝滚动
2022/04/08 Vue.js