Ajax原理

代码有不明白的 欢迎来微信公众号“他她自由行”找我,回复任何话都可以 我都会回你哒~

  在用requests抓取页面时,得到的结果可能和浏览器中看到的不一样:在浏览器中可以正常显示的页面数据,但用requests得到的结果并没有。这是因为requests获取的都是原始 HTML文档,而浏览器中页面

则是经过Ajax处理数据后生成的。这些数据可能在HTML文档中,也可能是经过JavaScript和特定算法后生成的。

  刚开始HTML文档中不包含某些数据,当原始页面加载完后,会向服务器发送Ajax请求获取数据,这些数据被JavaScript处理形成一些新页面。

Ajax: 即异步的JavaScript和XML,是利用JavaScript在保证页面不刷新、链接不改变的情况下与服务器交换数据的并更新

部分网页的技术。

示例:用Ajax爬取今日头条图片

最近想买工装裤穿,可又不知道怎么搭配,所以就用爬虫爬下头条上工装裤的穿搭图片啦

(1) 获取网页页面的JSON文档
import os
import requests
from urllib.parse import urlencode #来构造url参数的
from hashlib import md5 #用来解析图片二进制的 #获取页面json
def get_page(offest):
params={
'aid':'24',
'offest':offest,
'format':'json',
'keyword':'%E5%B7%A5%E8%A3%85%E8%A3%A4',
'autoload':'true',
'count':'20',
'cur_tab':'1',
'from':'search_tab',
'pd':'synthesis'
}
url='https://www.toutiao.com/api/search/content/?aid=24&offset=0&format=json&keyword=%E5%B7%A5%E8%A3%85%E8%A3%A4&autoload=true&count=20&cur_tab=1&from=search_tab&pd=synthesis'+urlencode(params)
#用urlencode构造url中参数
try:
response=requests.get(url)
if response.status_code==200: #当请求成功时(status_code=200时)才继续下面代码
return response.json() #用json方法将结果转化成JSON格式
except requests.ConnectionError:
return None

注意:

1)构造Ajax请求时,先探索清楚当前页面中Ajax请求链接的结构和规律。这里是Offest改变,其他参数不变。

2)使用urlencode方法构造请求的GET参数

3)发现只有offest发生改变,第一页0,第二页20,第三页40,依次增加20

(2)构造包含图片链接和标题的字典
#提取图片url和标题
def parse_page(json):
if json.get('data'):
for item in json.get('data'): #找到所需数据所处位置
if item.get('title')==None: #运行后发现不是每个item里都有图片链接和title,没有的直接跳过
continue
title=item.get('title') #找到标题
print(title)
images=item.get('image_list')
print(images)
for image in images:
yield{
'image':image.get('url'), #找到这个标题下的所以图片url 形成字典生成器
'title':title
}

注意:

1)yield{}方法构造字典生成器非常简单,快速。

2)用json.get()方法在json文档中找取参数值非常快。

(3)把数据保存到本地
#实现保存图片的方法
def save_image(item):
if not os.path.exists(item.get('title')): #创建以标题为名称的文件夹
os.mkdir(item.get('title'))
try:
response=requests.get(item.get('image')) #访问图片的url
if response.status_code==200:
file_path='{0}/{1}.{2}'.format(item.get('title'),md5(response.content).hexdigest(),'jpg')
if not os.path.exists(file_path): #名称file_path使用其内容的md5值,可以去除重复
with open(file_path,'wb') as f: #访问成功后,将其二进制代码存入file_path.jpg中
f.write(response.content)
else:
print('Already Download',file_path)
except requests.ConnectionError:
print('Failed to save image')

注意:

1)这里的item就是(2)中得到的包含url和标题的字典

1)是以二进制写的方式存入文件,'wb'

(4)构造offest 进行遍历
def main(offest):
json=get_page(offest)
for item in parse_page(json):
print(item)
save_image(item) if __name__=='__main__':
for i in range(0,4):
offest=i*20
main(offest)
PS:代码叙述有不完整的地方,欢迎大家私信我。完整代码链接https://github.com/xubin97
代码有不明白的 欢迎来微信公众号“他她自由行”找我,回复任何话都可以 我都会回你哒~

用Ajax爬取今日头条图片集的更多相关文章

  1. 爬虫—分析Ajax爬取今日头条图片

    以今日头条为例分析Ajax请求抓取网页数据.本次抓取今日头条的街拍关键字对应的图片,并保存到本地 一,分析 打开今日头条主页,在搜索框中输入街拍二字,打开开发者工具,发现浏览器显示的数据不在其源码里面 ...

  2. 【Python3网络爬虫开发实战】6.4-分析Ajax爬取今日头条街拍美图【华为云技术分享】

    [摘要] 本节中,我们以今日头条为例来尝试通过分析Ajax请求来抓取网页数据的方法.这次要抓取的目标是今日头条的街拍美图,抓取完成之后,将每组图片分文件夹下载到本地并保存下来. 1. 准备工作 在本节 ...

  3. 【Python3网络爬虫开发实战】 分析Ajax爬取今日头条街拍美图

    前言本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理.作者:haoxuan10 本节中,我们以今日头条为例来尝试通过分析Ajax请求 ...

  4. 分析Ajax爬取今日头条街拍美图-崔庆才思路

    站点分析 源码及遇到的问题 代码结构 方法定义 需要的常量 关于在代码中遇到的问题 01. 数据库连接 02.今日头条的反爬虫机制 03. json解码遇到的问题 04. 关于response.tex ...

  5. 转:【Python3网络爬虫开发实战】6.4-分析Ajax爬取今日头条街拍美图

    [摘要] 本节中,我们以今日头条为例来尝试通过分析Ajax请求来抓取网页数据的方法.这次要抓取的目标是今日头条的街拍美图,抓取完成之后,将每组图片分文件夹下载到本地并保存下来. 1. 准备工作 在本节 ...

  6. PYTHON 爬虫笔记九:利用Ajax+正则表达式+BeautifulSoup爬取今日头条街拍图集(实战项目二)

    利用Ajax+正则表达式+BeautifulSoup爬取今日头条街拍图集 目标站点分析 今日头条这类的网站制作,从数据形式,CSS样式都是通过数据接口的样式来决定的,所以它的抓取方法和其他网页的抓取方 ...

  7. 爬虫七之分析Ajax请求并爬取今日头条

    爬取今日头条图片 这里只讨论出现的一些问题,代码在最下面github链接里. 首先,今日头条取消了"图集"这一选项,因此对于爬虫来说效率降低了很多: 在所有代码都完成后,也许是爬取 ...

  8. 使用scrapy爬虫,爬取今日头条搜索吉林疫苗新闻(scrapy+selenium+PhantomJS)

    这一阵子吉林疫苗案,备受大家关注,索性使用爬虫来爬取今日头条搜索吉林疫苗的新闻 依然使用三件套(scrapy+selenium+PhantomJS)来爬取新闻 以下是搜索页面,得到吉林疫苗的搜索信息, ...

  9. 使用scrapy爬虫,爬取今日头条首页推荐新闻(scrapy+selenium+PhantomJS)

    爬取今日头条https://www.toutiao.com/首页推荐的新闻,打开网址得到如下界面 查看源代码你会发现 全是js代码,说明今日头条的内容是通过js动态生成的. 用火狐浏览器F12查看得知 ...

随机推荐

  1. WPF 背景网格图

    利用DrawingBrush来画出背景网格图 <DrawingBrush Viewport="0,0,80,80" ViewportUnits="Absolute& ...

  2. Exp1 PC平台逆向破解 20164323段钊阳

    实验目标 学习两种方法运行代码片段,并学习如何注入运行任何Shellcode. 三个实验内容如下: 1.手工修改可执行文件,改变程序执行流程,直接跳转到getshell函数 2.利用foo函数的bof ...

  3. GO学习笔记 - map

    map是GO语言中的一种高级数据类型,特点是key和value对应,这和Delphi中的Dictionary一样!map的声明格式:map[key数据类型]value数据类型.使用map前,必须用ma ...

  4. C# RDLC报表不出现预览窗体直接输出到打印机

    #region 直接打印区域 /// <summary> /// 直接打印到打印机 /// </summary> /// <param name="report ...

  5. Spring-解决请求中文乱码问题

    解决spring请求中文乱码问题 1.web.xml添加编码拦截器 <filter> <filter-name>CharacterEncoding</filter-nam ...

  6. 《快学Scala》第一章 基础

  7. 3分钟解决MySQL 1032 主从错误(转)

    转自  https://blog.51cto.com/suifu/1845457 3分钟解决MySQL 1032主从错误 Part1:写在最前 1032错误----现在生产库中好多数据,在从库误删了, ...

  8. sql注入原理详解(一)

    我们围绕以下几个方面来看这个问题: 1.什么是sql注入? 2.为什么要sql注入? 3.怎样sql注入? 1.什么是sql注入? 所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或 ...

  9. Vue子组件监听事件中传递参数的方法

    在子组件中,我们可以通过以下方式监听事件: v-on:click="$emit('funcName',a)" 如果需要传多个参数,可以通过以下方式: v-on:click=&quo ...

  10. leetcode-55-跳跃游戏

    题目描述: 给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 判断你是否能够到达最后一个位置. 示例 1: 输入: [2,3,1,1,4] 输出: ...