通过分析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)
通过分析Ajax请求 抓取今日头条街拍图集的更多相关文章
- 爬虫(八):分析Ajax请求抓取今日头条街拍美图
(1):分析网页 分析ajax的请求网址,和需要的参数.通过不断向下拉动滚动条,发现请求的参数中offset一直在变化,所以每次请求通过offset来控制新的ajax请求. (2)上代码 a.通过aj ...
- python3爬虫-分析Ajax,抓取今日头条街拍美图
# coding=utf-8 from urllib.parse import urlencode import requests from requests.exceptions import Re ...
- 分析ajax请求抓取今日头条关键字美图
# 目标:抓取今日头条关键字美图 # 思路: # 一.分析目标站点 # 二.构造ajax请求,用requests请求到索引页的内容,正则+BeautifulSoup得到索引url # 三.对索引url ...
- python学习(26)分析ajax请求抓取今日头条cosplay小姐姐图片
分析ajax请求格式,模拟发送http请求,从而获取网页代码,进而分析取出需要的数据和图片.这里分析ajax请求,获取cosplay美女图片. 登陆今日头条,点击搜索,输入cosplay 下面查看浏览 ...
- Python爬虫学习==>第十一章:分析Ajax请求-抓取今日头条信息
学习目的: 解决AJAX请求的爬虫,网页解析库的学习,MongoDB的简单应用 正式步骤 Step1:流程分析 抓取单页内容:利用requests请求目标站点,得到单个页面的html代码,返回结果: ...
- 分析Ajax来爬取今日头条街拍美图并保存到MongDB
前提:.需要安装MongDB 注:因今日投票网页发生变更,如下代码不保证能正常使用 #!/usr/bin/env python #-*- coding: utf-8 -*- import json i ...
- python爬虫之分析Ajax请求抓取抓取今日头条街拍美图(七)
python爬虫之分析Ajax请求抓取抓取今日头条街拍美图 一.分析网站 1.进入浏览器,搜索今日头条,在搜索栏搜索街拍,然后选择图集这一栏. 2.按F12打开开发者工具,刷新网页,这时网页回弹到综合 ...
- 15-分析Ajax请求并抓取今日头条街拍美图
流程框架: 抓取索引页内容:利用requests请求目标站点,得到索引网页HTML代码,返回结果. 抓取详情页内容:解析返回结果,得到详情页的链接,并进一步抓取详情页的信息. 下载图片与保存数据库:将 ...
- Python Spider 抓取今日头条街拍美图
""" 抓取今日头条街拍美图 """ import os import time import requests from hashlib ...
随机推荐
- xdoj-1010(区间问题)
题目链接 1 扫描一遍不行扫描两遍呗 2 O(n)时间确定cd[i] [max( a[k]-_min) _min是k+1~n的最小值.i<=k<=n] #include <cstd ...
- P2261 [CQOI2007]余数求和 (数论)
题目链接:传送门 题目: 题目背景 数学题,无背景 题目描述 给出正整数n和k,计算G(n, k)=k mod + k mod + k mod + … + k mod n的值,其中k mod i表示k ...
- Caused by: java.sql.SQLException: ORA-24816: 在实际的 LONG 或 LOB 列之后提供了扩展的非 LONG 绑定数据
今天客户说报告草稿保存不了,跟踪错误bug,了解到以下reason: 异常出现的环境:oracle11g + Hibernate 错误分析:这是oracle 11g在clob字段中的一个bug,ora ...
- python与系统做交互常用的模块和使用方法
1.使用os模块与系统做简单命令的交互 >>>import os >>>os.popen('pwd') <open file 'pwd', mode 'r' ...
- Singer 学习一 使用Singer进行mysql 2 postgres 数据转换
Singer 因为版本的问题,推荐的运行方式是使用virtualenv,对于taps&& target 的运行都是 推荐使用此方式,不然包兼容的问题太费事了 备注: 使用docker- ...
- SUPERSOCKET 客户端
SUPERSOCKET.CLIENTENGINE 简单使用 2015年5月27日 HYJIACAN 发表回复 阅读 11,105 次 江大没有给ClientEngine的Demo,一直没有找到其它的. ...
- Eclipse之父、《设计模式》作者、Junit作者之Erich Gamma
Erich Gamma拥有多重权威身份.他是Jazz项目的主要领导人:是Eclipse的项目管理委员会成员,被业界称为“Eclipse之父”: 是经典书<设计模式>的作者四人帮之一,199 ...
- SelectDataTable
项目地址 : https://github.com/kelin-xycs/SelectDataTable SelectDataTable 一个 用 C# 实现的 用 Sql select DataT ...
- php获取指定文件夹中文件名称
/** * php获取指定文件夹中文件名称 * @author jackie <2018.10.10> */ public static function getFileName($fil ...
- 阿里云学习笔记之Java Web环境搭建
1. 下载JDK7 http://www.oracle.com/technetwork/java/javase/downloads/java-archive-downloads-javase7-521 ...