1.抓取索引页内容

利用requests请求目标站点,得到索引网页HTML代码,返回结果

2.抓取详情页内容

解析返回结果,得到详情的链接,并进一步抓取详情页的信息

3.下载图片与保存数据库

将图片下载到本地,并把页面信息及图片URL保存至MongDB

4.开启循环及多线程

对多页内容遍历,开启多线程提高抓取速度

整理好思绪后就可以进入实操:

1.打开今日头条,输入街拍,呈现两种图片类型,一种是非图集形式的,就是点进去一直下拉就能看到图片的那种;另一种就是组图形式,点进去有个小箭头的……后者就是我们今天要爬取的内容(图片形式如下图所示,注意:街拍页面已经改了,)

2.踩点,打开审查元素,一顿操作后发现终于找到点蛛丝马迹,没错,下面这个JSON对象的data键正是我们要找的东西

3:分析,data里面有个cell_type:67的都没有图片信息(这个可以作为后面过滤URL的条件),有图片信息的在下拉过程中会出现一个title和article_url的东西,我们最终要的就是article_url这个键值对

4.那这个article_url就是我们爬取组图最终URL了吗?并不是的,我们前面已经有讲到过,街拍的页面有两种图片类型,我们爬取的组图形式只是其中一种;此外,除了这两种形式还有其他乱七八糟的图片,视频也有,这些我们都要进行过滤……以下就是进行筛选并得到正确URL的方法:

def parse_page_index(html):try:data = json.loads(html)if data and 'data' in data.keys():for item in data.get('data'):if item.get('cell_type') or item.get('article_url')[:25] != 'http://toutiao.com/group/':continue# print(item.get('article_url'))item_str_list = item.get('article_url').split('group/')item_str = 'a'.join(item_str_list)yield item_strexcept JSONDecodeError:print('解析索引页出错')return None

5.拿到组图URL后接下来就可以找图片具体URL了,点进去,查看审查元素,一顿操作后发我们要找的图片URL就在箭头所指的地方

6.对图片URL进行提取,这里采用的是正则表达式:

def parse_page_detail(html,url):images_pattern = re.compile(r'BASE_DATA.galleryInfo.*?gallery: JSON.parse.*?"(.*?)"\),',re.S)result = re.search(images_pattern,html)if result != None:soup = BeautifulSoup(html, 'lxml')title = soup.select('title')[0].get_text()data = re.sub('\\\\"' ,'"' , result.group(1))data = re.sub(r'\\\\' ,'' , data)data = json.loads(data)if data and 'sub_images' in data.keys():sub_images = data.get('sub_images')images = [item.get('url') for item in sub_images]return {'title':title,'url':url,'images':images}

7.到这组图URL和图片具体URL就都找到了,接下来把完整代码贴上:

#coding=utf-8
import json
from hashlib import md5
from json import JSONDecodeError
import os
import pymongo
from bs4 import BeautifulSoup
from requests.exceptions import RequestException
import requests
from urllib.parse import urlencode
from config import *
from multiprocessing.pool import Pool
import reclient = pymongo.MongoClient(MONGO_URL, connect=False)
db = client[MONGO_DB]def get_page_index(offset,keyword):params = {'aid': '24','offset': offset,'format': 'json','keyword': keyword,'autoload': 'true','count': '20','cur_tab': '1','from': 'search_tab','pd': 'synthesis'}base_url = 'https://www.toutiao.com/api/search/content/?'url = base_url + urlencode(params)try:headers = {'cookie':'tt_webid=6671185381789402631; WEATHER_CITY=%E5%8C%97%E4%BA%AC; tt_webid=6671185381789402631; UM_distinctid=169a54e7c49461-05ea4429fa9817-5f123917-100200-169a54e7c4a295; csrftoken=055822d98a84680cbe8cfa838a1570f1; s_v_web_id=eef0fe1125759089850096d0ac06a160; CNZZDATA1259612802=400969098-1553254326-https%253A%252F%252Fwww.baidu.com%252F%7C1553410967; __tasessionId=xcskp1k3r1553436842875','user-agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.75 Safari/537.36'}resp = requests.get(url,headers = headers)if 200  == resp.status_code:return  resp.textreturn Noneexcept RequestException:print('请求索引页出错')return Nonedef parse_page_index(html):try:data = json.loads(html)if data and 'data' in data.keys():for item in data.get('data'):if item.get('cell_type') or item.get('article_url')[:25] != 'http://toutiao.com/group/':continue# print(item.get('article_url'))item_str_list = item.get('article_url').split('group/')item_str = 'a'.join(item_str_list)yield item_strexcept JSONDecodeError:print('解析索引页出错')return Nonedef get_page_detail(url):try:headers = {'cookie':'tt_webid=6671185381789402631; tt_webid=6671185381789402631; WEATHER_CITY=%E5%8C%97%E4%BA%AC; tt_webid=6671185381789402631; UM_distinctid=169a54e7c49461-05ea4429fa9817-5f123917-100200-169a54e7c4a295; csrftoken=055822d98a84680cbe8cfa838a1570f1; CNZZDATA1259612802=400969098-1553254326-https%253A%252F%252Fwww.baidu.com%252F%7C1553389366; __tasessionId=imoxgst5g1553392002390; s_v_web_id=eef0fe1125759089850096d0ac06a160','user-agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.75 Safari/537.36'}response = requests.get(url,headers = headers)if response.status_code == 200:return response.textreturn Noneexcept RequestException:print('请求详情页出错')return Nonedef parse_page_detail(html,url):images_pattern = re.compile(r'BASE_DATA.galleryInfo.*?gallery: JSON.parse.*?"(.*?)"\),',re.S)result = re.search(images_pattern,html)if result != None:soup = BeautifulSoup(html, 'lxml')title = soup.select('title')[0].get_text()data = re.sub('\\\\"' ,'"' , result.group(1))data = re.sub(r'\\\\' ,'' , data)data = json.loads(data)if data and 'sub_images' in data.keys():sub_images = data.get('sub_images')images = [item.get('url') for item in sub_images]for image in images:download_image(image)return {'title':title,'url':url,'images':images}
def save_to_mongo(result):if db[MONGO_TABLE].insert(result):print('存储到MongoDB成功',result)return Truereturn Falsedef download_image(url):try:response = requests.get(url)if response.status_code == 200:save_image(response.content)return Noneexcept RequestException:print('请求图片出错',url)return Nonedef save_image(content):file_path = '{0}/{1}.{2}'.format(os.getcwd(),md5(content).hexdigest(),'jpg')if not os.path.exists(file_path):with open(file_path,'wb') as f:f.write(content)f.close()def main(offset):html = get_page_index(offset, KEYWORD)# print(html)for url in parse_page_index(html):# print(url)html = get_page_detail(url)if html:result = parse_page_detail(html,url)if result:save_to_mongo(result)if __name__ == '__main__':# main()groups = [x * 20 for x in range(GROUP_START, GROUP_END + 1)]pool = Pool()pool.map(main,groups)

spider.py

1 MONGO_URL = 'localhost'
2 MONGO_DB = 'toutiao'
3 MONGO_TABLE = 'toutiao'
4
5 GROUP_START = 1
6 GROUP_END = 20
7
8 KEYWORD = '街拍'

config.py

8.还记得开始我们讲的第一种图片形式么,其实主要就是图片具体URL找到然后提取下就行了,有兴趣的同学可以自己尝试去爬取下,就在下面这个位置:

注意:

现在网站普遍都有反爬措施,所以一般你代码爬取个两三次网站应该就会把你的IP给禁了,禁多久我就不清楚了,所以在此还是提醒大家科学上网!

转载于:https://www.cnblogs.com/YangARTuan/p/10591503.html

分析Ajax请求并抓取今日头条街拍美图相关推荐

  1. 2.分析Ajax请求并抓取今日头条街拍美图

    import requests from urllib.parse import urlencode # 引入异常类 from requests.exceptions import RequestEx ...

  2. python爬虫今日头条街拍美图开发背景_分析Ajax请求并抓取今日头条街拍美图:爬取详情页的url与实际页面上显示不符...

    from urllib.parse import urlencode import re from requests.exceptions import RequestException from b ...

  3. Python爬虫实战02:分析Ajax请求并抓取今日头条街拍

    1 目标网站分析 首先我们打开今日头条网站,搜索 街拍,点击图集,这里每就是我们要爬取的目录,我们称为索引页.1 点开一个标题,进去,称为详情页.2这里面的图是我们所要爬取的.比如这里可以点击图片,共 ...

  4. php抓取今日头条,分析Ajax来抓取今日头条街拍美图

    一.介绍 还是根据崔大大的视频来码的文章,不得不说,抓取文件并下载下来比抓取网页内容信息复杂多了 二.流程 目标站点分析 用浏览器打开今日头条输入'街拍',打开审查元素,点击'图集' 1.首先我们要找 ...

  5. 分析Ajax抓取今日头条街拍美图

    声明:此篇文章主要是观看静觅教学视频后做的笔记,原教程地址https://cuiqingcai.com/ 实现流程介绍 1.抓取索引页内容:利用requests请求目标站点,得到索引网页HTML代码, ...

  6. ajax动态抓取今日头条街拍美图

    1.分析网站源码. 网站是局部动态变化,offset变化加载内容,变化范围为0,20,40··· 首先要获取索引页代码数据,定义索引页,由于是ajax请求,offset根据索引变化0.20.40··· ...

  7. 爬取今日头条街拍美图

    相关背景: 本篇文章是基于爬虫实践课程–分析Ajax请求并抓取今日头条街拍美图 其实我最开始也只想在CSDN上面找一篇文章看看结果都是分析没有实操,没办法最后只能自己写了,本篇文章里面的问题也是我遇到 ...

  8. python爬虫今日头条_python爬虫—分析Ajax请求对json文件爬取今日头条街拍美图

    python爬虫-分析Ajax请求对json文件爬取今日头条街拍美图 前言 本次抓取目标是今日头条的街拍美图,爬取完成之后,将每组图片下载到本地并保存到不同文件夹下.下面通过抓取今日头条街拍美图讲解一 ...

  9. [Python3网络爬虫开发实战] --分析Ajax爬取今日头条街拍美图

    [Python3网络爬虫开发实战] --分析Ajax爬取今日头条街拍美图 学习笔记--爬取今日头条街拍美图 准备工作 抓取分析 实战演练 学习笔记–爬取今日头条街拍美图 尝试通过分析Ajax请求来抓取 ...

最新文章

  1. LeetCode刷题记录11——290. Word Pattern(easy)
  2. MySQL Profiling 的使用
  3. angular 前端路由不生效解决方案
  4. boost::container模块实现节点句柄的测试程序
  5. CentOS YUM / RPM Error Signature Key ID BAD
  6. 位域 内存 字节序_C语言中的位域、字节序、比特序、大小端(转)
  7. JavaScript 计时器
  8. 在Linux中GNU的名词解释,GNU在GNU / Linux操作系统中的主要贡献是什么...
  9. 博客园的神回复,程序猿的奇葩神回复[连载][二]
  10. 2013-2017蓝桥杯省赛C++A组真题总结(题型及解法)
  11. Frp后台自动启动的几个方法-内网穿透
  12. 计算机桌面成英文怎样变成中文版,电脑系统菜单全变成英文怎么办
  13. 华为ICT大赛网络赛道考试范围
  14. DLP Digital Light Procession 的缩写 数字光处理
  15. python 给qq点赞_Python实现QQ自动点赞
  16. STATA如何查看、改变文件的工作路径
  17. 学习软件测试有哪些优势?
  18. UNICODE,GBK,UTF-8区别
  19. 从写方案到见投资人,一步步教你如何拿投资
  20. yarn add 添加依赖的各种类型(指定版本安装、git中安装、tgz包安装、文件夹安装)

热门文章

  1. 南邮计算机学院哪个研究生导师项目比较多,南邮自杀研究生曾抱怨“导师不让毕业” 导师被停职...
  2. 【ESP 保姆级教程】疯狂传感器篇 —— 案例:ESP8266 + MQ2烟雾传感器 + webserver(局域网内曲线变化图)
  3. python保存base64图片
  4. CLRS第十章思考题
  5. 03、机器学习 (贝叶斯分类算法与应用)
  6. Linux下lt9211调试总结
  7. linux 开启审计服务,Linux审计服务Auditd systemctl重启问题解决
  8. MS10-002补丁按时发布,建议立即安装,防范极光漏洞(KB979352)
  9. 含百分比数字进度条的设计
  10. 【教程+源码】Java开发经典游戏飞翔的小鸟_Java游戏项目Flappy Bird像素鸟游戏