通过分析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 ...
随机推荐
- HTML+CSS之background
第一个专题--background属性 今天写一下background属性,具体如下: 1.background-color:默认值:transparent,这是我们在做网页时,经常使用的属性,较为简 ...
- 阿里druid数据库连接池配置
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...
- asp.net Checkbox 绑定自定义属性
var chkSelect = e.Row.FindControl("chkSelect") as CheckBox; chkSelect.InputAttributes.Add( ...
- struts2(二)值栈 threadlocal ogal ui
值栈(重要)和ognl表达式 1. 只要是一个mvc框架,必须解决数据的存和取的问题 2. Struts2利用值栈来存数据,所以值栈是一个存储数据的内存结构 3. 把数据存在值栈中,在页面上利用 ...
- <--------------------------Java多态如何使用------------------------------>
11多态调用的三种格式 * A:多态的定义格式: * 就是父类的引用变量指向子类对象 父类类型 变量名 = new 子类类型(); 变量名.方法名(); * B: 普通类多态定义的格式 父类 变量名 ...
- day6 python学习
---恢复内容开始--- 今日讲课内容: 1. 新内容: 字典 1.字典有无序性,没有顺序,2字典的键:key必须是可哈希的.可哈希表示key必须是不可变类型,如:数字.字符串.元组.不可变的,字 ...
- luarocks 自定义包发布试用
luarocks 是一个方便的lua 包管理工具,可以帮助我们实现代码的复用以及分享 注册账户 我使用了gihtub 的账户,直接点击&&授权即可 创建一个简单的luarocks 包项 ...
- 编译opencv python
1, 下载并且安装python2.7 + numpy 2,运行cmakegui打开opencv.应该要显示如下信息: Python 2: Interpreter: C:/Python27/python ...
- optimization.splitChunks 中,chunks 的3个值:all、async、initial 的含义
chunks 参数值 含义 all 把动态和非动态模块同时进行优化打包:所有模块都扔到 vendors.bundle.js 里面. initial 把非动态模块打包进 vendor,动态模块优化打包 ...
- 访问者模式-Visitor Pattern
1.主要优点 访问者模式的主要优点如下: (1) 增加新的访问操作很方便.使用访问者模式,增加新的访问操作就意味着增加一个新的具体访问者类,实现简单,无须修改源代码,符合“开闭原则”. (2) 将有关 ...