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的tkinter布局之简单的聊天窗口实现方法
Sep 03 Python
Python使用getpass库读取密码的示例
Oct 10 Python
Python冲顶大会 快来答题!
Jan 17 Python
python遍历一个目录,输出所有的文件名的实例
Apr 23 Python
python统计多维数组的行数和列数实例
Jun 23 Python
一步步教你用python的scrapy编写一个爬虫
Apr 17 Python
linux中如何使用python3获取ip地址
Jul 15 Python
Pycharm+Python工程,引用子模块的实现
Mar 09 Python
python 实现&quot;神经衰弱&quot;翻牌游戏
Nov 09 Python
删除pycharm鼠标右键快捷键打开项目的操作
Jan 16 Python
Python 实现劳拉游戏的实例代码(四连环、重力四子棋)
Mar 03 Python
Python FuzzyWuzzy实现模糊匹配
Apr 28 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
解决GD中文乱码问题
2007/02/14 PHP
PHP开发不能违背的安全规则 过滤用户输入
2011/05/01 PHP
PHP编译安装中遇到的两个错误和解决方法
2014/08/20 PHP
php计算到指定日期还有多少天的方法
2015/04/14 PHP
PHP使用Pear发送邮件(Windows环境)
2016/01/05 PHP
php实现批量上传数据到数据库(.csv格式)的案例
2017/06/18 PHP
PHP等比例压缩图片的实例代码
2018/07/26 PHP
在php的yii2框架中整合hbase库的方法
2018/09/20 PHP
ThinkPHP 5.x远程命令执行漏洞复现
2019/09/23 PHP
防止动态加载JavaScript引起的内存泄漏问题
2009/10/08 Javascript
javascript中强制执行toString()具体实现
2013/04/27 Javascript
为指定的元素添加遮罩层的示例代码
2014/01/15 Javascript
SeaJS 与 RequireJS 的差异对比
2014/12/08 Javascript
浅谈JSON.parse()和JSON.stringify()
2015/07/14 Javascript
理解JS事件循环
2016/01/07 Javascript
JavaScript制作简单的日历效果
2016/03/10 Javascript
JavaScript绑定事件监听函数的通用方法
2016/05/14 Javascript
浅析Bootstrap验证控件的使用
2016/06/23 Javascript
Vue学习笔记进阶篇之过渡状态详解
2017/07/14 Javascript
分享5个顶级的JavaScript Ajax组件库
2018/09/16 Javascript
Vue实现多标签选择器
2019/11/28 Javascript
JQuery获得内容和属性方法解析
2020/05/30 jQuery
解决vue使用vant下拉框van-dropdown-item 绑定title值不变问题
2020/08/05 Javascript
python脚本监控docker容器
2016/04/27 Python
使用python获取(宜宾市地震信息)地震信息
2019/06/20 Python
Pytorch中的自动求梯度机制和Variable类实例
2020/02/29 Python
python读取文件指定行内容实例讲解
2020/03/02 Python
Anaconda的安装及其环境变量的配置详解
2020/04/22 Python
关于Python3的import问题(pycharm可以运行命令行import错误)
2020/11/18 Python
基于canvas使用贝塞尔曲线平滑拟合折线段的方法
2018/01/10 HTML / CSS
KIKO MILANO西班牙官网:意大利领先的化妆品和护肤品品牌
2019/05/03 全球购物
2013年高中生自我评价
2013/10/23 职场文书
12月红领巾广播稿
2014/02/13 职场文书
《路旁的橡树》教学反思
2014/04/07 职场文书
应届大专生求职信
2014/06/26 职场文书
2016社区平安家庭事迹材料
2016/02/26 职场文书