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修改MP3文件的方法
Jun 15 Python
Python双精度浮点数运算并分行显示操作示例
Jul 21 Python
Python协程的用法和例子详解
Sep 09 Python
python的Tqdm模块的使用
Jan 10 Python
python3 requests中使用ip代理池随机生成ip的实例
May 07 Python
python字符串和常用数据结构知识总结
May 21 Python
pycharm new project变成灰色的解决方法
Jun 27 Python
python3实现elasticsearch批量更新数据
Dec 03 Python
Python matplotlib画图时图例说明(legend)放到图像外侧详解
May 16 Python
浅谈keras中的目标函数和优化函数MSE用法
Jun 10 Python
详解python的内存分配机制
May 10 Python
Python 实现绘制子图及子图刻度的变换等问题
May 31 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生成唯一的促销/优惠/折扣码(附源码)
2012/12/28 PHP
PHP生成唯一ID之SnowFlake算法
2016/12/17 PHP
基于ThinkPHP5.0实现图片上传插件
2017/09/25 PHP
Javascript 判断 object 的特定类转载
2007/02/01 Javascript
侧栏跟随滚动的简单实现代码
2013/03/18 Javascript
js实现屏蔽默认快捷键调用自定义事件示例
2013/06/18 Javascript
jQuery实现等比例缩放大图片让大图片自适应页面布局
2013/10/16 Javascript
javascript分页代码实例分享(js分页)
2013/12/13 Javascript
node.js中的http.request方法使用说明
2014/12/14 Javascript
浅谈Javascript数组的使用
2015/07/29 Javascript
js实现的早期滑动门菜单效果代码
2015/08/27 Javascript
js+css简单实现网页换肤效果
2015/12/29 Javascript
javascript轻量级库createjs使用Easel实现拖拽效果
2016/02/19 Javascript
自定义PC微信扫码登录样式写法
2017/12/12 Javascript
JS引用传递与值传递的区别与用法分析
2018/06/01 Javascript
Vue-drag-resize 拖拽缩放插件的使用(简单示例)
2019/12/04 Javascript
零基础写python爬虫之抓取糗事百科代码分享
2014/11/06 Python
纯python实现机器学习之kNN算法示例
2018/03/01 Python
数组保存为txt, npy, csv 文件, 数组遍历enumerate的方法
2018/07/09 Python
python将.ppm格式图片转换成.jpg格式文件的方法
2018/10/27 Python
Pytorch 中retain_graph的用法详解
2020/01/07 Python
python GUI库图形界面开发之PyQt5信号与槽的高级使用技巧(自定义信号与槽)详解与实例
2020/03/06 Python
Python tkinter制作单机五子棋游戏
2020/09/14 Python
如何在 Matplotlib 中更改绘图背景的实现
2020/11/26 Python
MAC Cosmetics官方网站:魅可专业艺术彩妆
2019/04/10 全球购物
高中生的学习总结自我鉴定
2013/10/26 职场文书
日语专业个人的求职信
2013/12/03 职场文书
我们的节日端午节活动方案
2014/03/02 职场文书
刊首寄语大全
2014/04/11 职场文书
购房个人委托书范本
2014/10/11 职场文书
幼儿园2014年度工作总结
2014/11/10 职场文书
2014年前台接待工作总结
2014/12/05 职场文书
优秀教师先进事迹材料
2014/12/15 职场文书
高三毕业评语
2014/12/31 职场文书
2016中学教师读书心得体会
2016/01/13 职场文书
python中出现invalid syntax报错的几种原因分析
2022/02/12 Python