近日学习了python 爬虫方面的内容 ,决定实战——爬今日头条的街拍图片

首先先分析今日头条的请求方式,进入https://www.toutiao.com  F12 搜索街拍

查看当前请求 https://www.toutiao.com/search/?keyword=街拍 打开network 中的 preview 查看相应源码,发现并没有关于图片

信息的内容 ,于是初步判断页面是由js渲染的,打开xhr(ajax请求)果不其然有个请求

查看data中的属性发现title和标题一致说明数据是由ajax加载的 ,进过分析data里面的数据并未有5张图片的url

只有一个image_url 里面只有四张已展示出来的图片,所以需要进入 article_url  详细页面去爬

查看 https ://www.toutiao.com/a6596072828330574344/ 请求头,会发现所有的 图片都在gallery里面

返回到 https://www.toutiao.com/search/?keyword=街拍 查看请求头 会发现 url里面有很多参数 offset format keyword autoload count cur_tabfrom

继续往下加载 会发现多个一个ajax 请求且 offset=20 其他参数为改变 说明offset是控制数量的

分析完毕,以下是代码:

首先获取 josn数据

import requests
from urllib.parse import urlencode
def get_page(offset,keyword):#https://www.toutiao.com/search_content/?offset=20&format=json&keyword=%E8%A1%97%E6%8B%8D&autoload=true&count=20&cur_tab=1&from=search_tabparams = {'offset':offset,'format':'json','keyword':keyword,'autoload':'true','count':'20','cur_tab':'1','from':'search_tab'}url = 'https://www.toutiao.com/search_content/?'+urlencode(params)try:response = requests.get(url)if response.status_code == 200:return response.json()except requests.ConnectionError as e:print(e)return None

在得到json数据后 需要获取 获取数据data里面的 article_url和title

#解析json,获取title,和url列表
def get_items(json):if json.get('data'):for item in json.get('data'):title  =item.get('title')#文章urlarticle_url = item.get('article_url')#获取图片集if article_url != None:urls = get_images(article_url)for url in urls:yield {'title':title,'url':url}

在获取了详细页面的url后 需要页面里的所有图片的url, 在上面解析可以知道我们要获取的图片的url都在gallery,这里需要通过正则来获取gallery里面的,再发出请求时需要伪装自己的主机环境 ,这里我有些不懂(我在网页解析的result.group(1) 本身是一个json格式,但是在json.loads(result.group(1)) 这个语句会报错 json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1) ,我把解析的语句放在交互环境是没有问题的) 所以为了解决这个问题我对数据做了解码操作 codecs.getdecoder('unicode_escape')(result.group(1))  codecs 可以参考 python模块之codecs 编码问题参考python3中的unicode_escape 解码后 转换json

数据如下:

由图片url可知 sub_image ,sub_image 中 由url 和 url_list ,分析可知url_list 里面的url指向的是同一张图片,所以我们获取url即可

代码如下:

import requests
import re
import codecs
import json
def get_images(url):headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36     (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36',}#需要头伪装自己response = requests.get(url,headers=headers)# 使用beautifulSoup 解析#gallery: JSON.parse("{\"count\":7,\"sub_images\":[{\"url\":\"http:\\/\\/p99.pstatp.com\\/origin\\/pgc-image\\/15356770660120337f0438e\",\...image_pattern = re.compile(r'gallery: JSON.parse\("(.*?)"\)',re.S)#print(response.text)result = re.search(image_pattern,response.text)#print(result.group(1))#解码if result !=None:data_str = codecs.getdecoder('unicode_escape')(result.group(1))[0]data_json = json.loads(data_str)if 'sub_images' in data_json.keys():sub_images = data_json.get('sub_images')urls = [item.get('url') for item in sub_images]return urlsreturn []

在得到了图片url后我们需要将图片保存已标题为目录,一个目录为一图集  代码如下:

import os
import requests
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36',
}
#保存图片
def save_image(item):if not os.path.isdir(item.get('title')):os.mkdir(item.get('title'))#加头伪装try:res = requests.get(item.get('url'),headers=headers)if res.status_code == 200:file_path = '{0}/{1}.{2}'.format(item.get('title'), md5(res.content).hexdigest(), 'jpg')with open(file_path,'wb') as f:f.write(res.content)except requests.ConnectionError:print('未读取')

在整合代码:

from multiprocessing.pool import Pool
def main(offset):for item in get_items(get_page(offset,'街拍')):save_image(item)GROUP_START = 1
GROUP_END = 20
if __name__ == '__main__':pool = Pool()groups = ([x * 20 for x in range(GROUP_START, GROUP_END + 1)])pool.map(main, groups)pool.close()pool.join()

end

我的爬虫 之 爬今日头条街拍图片相关推荐

  1. python爬今日头条组图_python 爬虫抓取今日头条街拍图片

    1. 打开google浏览器,输入www.toutiao.com, 搜索街拍.html 2.打开开发者选项,network监看加载的xhr, 数据是ajax异步加载的,能够看到preview里面的da ...

  2. 爬取今日头条街拍图片

    ** *爬取今日头条街拍图片 * ** # coding=utf-8 import os import re import time from multiprocessing.pool import ...

  3. Scrapy 爬取今日头条街拍图片

    scrapy 爬取今日头条图片保存至本地 之前用 requests 爬取过今日头条街拍的图片,当时只是爬取每篇文章的缩略图,今天尝试用 scrapy 来大规模爬取街拍详细图片. 分析页面 今日头条的内 ...

  4. Python爬虫:爬取今日头条“街拍”图片(修改版)

    前言 在参考<Python3网络爬虫开发实战>学习爬虫时,练习项目中使用 requests ajax 爬取今日头条的"街拍"图片,发现书上的源代码有些已经不适合现在了, ...

  5. 简单爬今日头条街拍获取图集

    emmmmmm这次练手真的是一波三折-不是爬了半天发现是静态网页就是网页重要内容被隐藏要么就是网页参数的内容进行了加密-最后终于找到了头条街拍可以爬,前面都很顺利-然而本来想要获取每一张图片的url的 ...

  6. 今日头条街拍图片爬取

    其中遇到的问题和一些新知识: 1. 注意页面请求参数:(会改变) 即Query String Parameters 例: 今日头条里街拍综合的数据为 'offset': 0, 'format': 'j ...

  7. python爬取今日头条_爬取今日头条街拍图片

    参考于崔庆才的Python爬虫教程,但是崔的视频时间过长,今日头条网站反爬虫也有了变化,因此写下此文章来记录自己的爬取过程遇到的问题,也给大家一些借鉴.欢迎大家讨论. 一.获取索引页. 我们会发现do ...

  8. 使用ajax爬取今日头条街拍图片

    文章目录 分析请求 获取一组信息 解析json 获取图片列表 本地存储 整合功能 分析请求 地址:https://www.toutiao.com/search/?keyword=%E8%A1%97%E ...

  9. 爬虫实践---今日头条街拍图片

    https://www.toutiao.com/search/?keyword=%E8%A1%97%E6%8B%8D 由于是动态网站了, 这是刚打开时候的情况,我下拉至最底下的时候, 原来这就是传说中 ...

最新文章

  1. Django rest_framework 认证源码流程
  2. 【Android 逆向】ELF 文件格式 ( 程序头数据 | 节区头数据 | 动态符号表 )
  3. Nginx +uwsgi+django配置
  4. cmake的使用-目标类型详解
  5. vue 组件之间函数传递_组件之间相互传递参数
  6. 基线_电离层、对流层改正模型对基线解算的影响
  7. arm linux 识别新硬盘_嵌入式Linux系列第13篇:USB摄像头拍照
  8. MongoDB索引策略和索引类型
  9. python去重复记录_python如何处理重复值数据?
  10. 关于Web2.0概念解释
  11. 图解Web服务器网关接口WSGI(Web Server Gateway Interface)
  12. 惠普微型计算机怎么装机,台式小机惠普电脑怎么装系统
  13. 金蝶K3 WISE 12.3版本系统部署指南
  14. css3D制作旋转魔方
  15. c语言 uint16_t,c中数据类型uint16_t,uint32_t,uint64_t输入输出使用方法
  16. NTFS和FAT32的区别和转换
  17. CTF easycap Banmabanma
  18. Leetcode 037 解数独 思路详解 python
  19. html 编辑器编码漏洞,某富文本编辑器文件上传漏洞(小论如何控制IsPostBack的值) | CN-SEC 中文网...
  20. 什么是华为云服务器?它有什么优点?

热门文章

  1. 阿里巴巴集团升级中台战略! 任命张建锋(行癫)为首席技术官(CTO)
  2. oTree学习教程(七)Apps rounds
  3. 北邮科技园首个元宇宙产业创新平台落地朝阳区IDP国际大数据交易产业园
  4. objdump指令 elf文件转成lst文件
  5. 恢复SVN的Replacing操作
  6. c#精华网站收集(转摘自梅川酷子的博客)
  7. 无盘服务器文件管理,云图管家文档图纸管理软件
  8. matlab怎么画map图,用MATLAB自带的worldmap及相关函数画地图
  9. mysql where in()
  10. 基于区块链的去中心化身份技术有哪些应用前景?