代码:

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请求 抓取今日头条街拍图集的更多相关文章

  1. 爬虫(八):分析Ajax请求抓取今日头条街拍美图

    (1):分析网页 分析ajax的请求网址,和需要的参数.通过不断向下拉动滚动条,发现请求的参数中offset一直在变化,所以每次请求通过offset来控制新的ajax请求. (2)上代码 a.通过aj ...

  2. python3爬虫-分析Ajax,抓取今日头条街拍美图

    # coding=utf-8 from urllib.parse import urlencode import requests from requests.exceptions import Re ...

  3. 分析ajax请求抓取今日头条关键字美图

    # 目标:抓取今日头条关键字美图 # 思路: # 一.分析目标站点 # 二.构造ajax请求,用requests请求到索引页的内容,正则+BeautifulSoup得到索引url # 三.对索引url ...

  4. python学习(26)分析ajax请求抓取今日头条cosplay小姐姐图片

    分析ajax请求格式,模拟发送http请求,从而获取网页代码,进而分析取出需要的数据和图片.这里分析ajax请求,获取cosplay美女图片. 登陆今日头条,点击搜索,输入cosplay 下面查看浏览 ...

  5. Python爬虫学习==>第十一章:分析Ajax请求-抓取今日头条信息

    学习目的: 解决AJAX请求的爬虫,网页解析库的学习,MongoDB的简单应用 正式步骤 Step1:流程分析 抓取单页内容:利用requests请求目标站点,得到单个页面的html代码,返回结果: ...

  6. 分析Ajax来爬取今日头条街拍美图并保存到MongDB

    前提:.需要安装MongDB 注:因今日投票网页发生变更,如下代码不保证能正常使用 #!/usr/bin/env python #-*- coding: utf-8 -*- import json i ...

  7. python爬虫之分析Ajax请求抓取抓取今日头条街拍美图(七)

    python爬虫之分析Ajax请求抓取抓取今日头条街拍美图 一.分析网站 1.进入浏览器,搜索今日头条,在搜索栏搜索街拍,然后选择图集这一栏. 2.按F12打开开发者工具,刷新网页,这时网页回弹到综合 ...

  8. 15-分析Ajax请求并抓取今日头条街拍美图

    流程框架: 抓取索引页内容:利用requests请求目标站点,得到索引网页HTML代码,返回结果. 抓取详情页内容:解析返回结果,得到详情页的链接,并进一步抓取详情页的信息. 下载图片与保存数据库:将 ...

  9. Python Spider 抓取今日头条街拍美图

    """ 抓取今日头条街拍美图 """ import os import time import requests from hashlib ...

随机推荐

  1. SEO : 建站注意

    1.url格式.尽可能的短一些,实践证明,较短的url格式还是比较利于搜索引擎收录的. 2.网站前台要纯静态.虽然搜索引擎对静态页面和动态页面并没有本质上的差别对待,但是实践告诉我们静态页面对服务器的 ...

  2. python绝对路径相对路径函数

    绝对路径 os.path.abspath("文件名")  参数可为“”即当前路径 相对路径 os.path.dirname("文件名")   参数可为“”即当前 ...

  3. XML映射配置文件

    XML映射配置文件 http://www.mybatis.org/mybatis-3/configuration.html Type Handlers 类型处理器 每当MyBatis在Prepared ...

  4. C# 后台获取前台交互判断

    前台传来明细 ,判断是否修改,在把前台 的数据组成新的类保存 public class tt { public string id { get; set; } public string e_id { ...

  5. php基础-5

     php的面相对象 <?php class Hello { public function say_hello() { echo "hello"; } } $say = ne ...

  6. 【HDOJ1045】【DFS】

    http://acm.hdu.edu.cn/status.php?user=MekakuCityActors&pid=1045&status=5 Fire Net Time Limit ...

  7. python time模块使用笔记(更新)

    import time 添加time模块 关于时间和时间戳: 时间是指日常生活中用的,如某年某月某日 时间戳是一个时间长度,是时间关于一个初始时间(好像是1970.1.1)的秒数 localtime方 ...

  8. Json工具类JsonUtil

    import com.alibaba.fastjson.JSONArray; import com.fasterxml.jackson.core.JsonProcessingException; im ...

  9. putty登陆sourceforge.net(密钥的设置)

    现在直接启动putty.exe是不能登陆sourceforge.net 的.按vps的方式,输入地址.用户名和密码后,程序就自动关闭.在登入前需要安装密匙,具体做法如下: 首先得生成一个SSH Key ...

  10. 思科模拟器——允许远程telnet连接控制路由器/交换机

    环境如下: 路由器配置如下.interface f0/0 配置该端口,ip address 192.168.1.1 255.255.255.0 配置ip,no shut激活,line vty 0 4 ...