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类定义的讲解
Nov 01 Python
python类装饰器用法实例
Jun 04 Python
centos6.7安装python2.7.11的具体方法
Jan 16 Python
Python与人工神经网络:使用神经网络识别手写图像介绍
Dec 19 Python
python3+PyQt5实现柱状图
Apr 24 Python
Python判断以什么结尾以什么开头的实例
Oct 27 Python
Windows 8.1 64bit下搭建 Scrapy 0.22 环境
Nov 18 Python
Python绘制并保存指定大小图像的方法
Jan 10 Python
Python TCP通信客户端服务端代码实例
Nov 21 Python
基于Python执行dos命令并获取输出的结果
Dec 30 Python
pyecharts在数据可视化中的应用详解
Jun 08 Python
python多线程和多进程关系详解
Dec 14 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小技巧之过滤ascii控制字符
2014/05/14 PHP
PHP生成图片验证码、点击切换实例
2014/06/25 PHP
浅谈php中的循环while、do...while、for、foreach四种循环
2016/11/05 PHP
/etc/php-fpm.d/www.conf 配置注意事项
2017/02/04 PHP
PHP用户管理中常用接口调用实例及解析(含源码)
2017/03/09 PHP
Javascript中string转date示例代码
2013/11/01 Javascript
JS中的数组的sort方法使用示例
2014/01/22 Javascript
js添加select下默认的option的value和text的方法
2014/10/19 Javascript
jQuery对JSON数据进行排序输出的方法
2015/06/24 Javascript
jquery实现动画菜单的左右滚动、渐变及图形背景滚动等效果
2015/08/25 Javascript
js遍历map javaScript遍历map的简单实现
2016/08/26 Javascript
jQuery表单对象属性过滤选择器实例详解
2016/09/13 Javascript
JS正则替换掉小括号及内容的方法
2016/11/29 Javascript
js css自定义分页效果
2017/02/24 Javascript
Web纯前端“旭日图”实现元素周期表
2017/03/10 Javascript
JS+HTML5实现上传图片预览效果完整实例【测试可用】
2017/04/20 Javascript
JS面向对象的程序设计相关知识小结
2018/05/26 Javascript
Python的Bottle框架中返回静态文件和JSON对象的方法
2015/04/30 Python
Python中表示字符串的三种方法
2017/09/06 Python
Python cookbook(数据结构与算法)保存最后N个元素的方法
2018/02/13 Python
Python中%是什么意思?python中百分号如何使用?
2018/03/20 Python
Linux(Redhat)安装python3.6虚拟环境(推荐)
2018/05/05 Python
Django ManyToManyField 跨越中间表查询的方法
2018/12/18 Python
Python制作简易版小工具之计算天数的实现思路
2020/02/13 Python
python 在threading中如何处理主进程和子线程的关系
2020/04/25 Python
python 解决Fatal error in launcher:错误问题
2020/05/21 Python
女性时尚在线:IVRose
2019/02/23 全球购物
size?法国官网:英国伦敦的球鞋精品店
2020/03/15 全球购物
美国婴儿和儿童服装购物网站:PatPat
2020/10/01 全球购物
手工社团活动方案
2014/02/17 职场文书
人事专员职责
2014/02/22 职场文书
道路建设实施方案
2014/03/18 职场文书
企业计划生育责任书
2015/05/09 职场文书
有关朝花夕拾的读书笔记
2015/06/29 职场文书
谢师宴学生致辞
2015/07/27 职场文书
matplotlib如何设置坐标轴刻度的个数及标签的方法总结
2021/06/11 Python