用Ajax爬取今日头条图片集
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爬取今日头条图片集的更多相关文章
- 爬虫—分析Ajax爬取今日头条图片
以今日头条为例分析Ajax请求抓取网页数据.本次抓取今日头条的街拍关键字对应的图片,并保存到本地 一,分析 打开今日头条主页,在搜索框中输入街拍二字,打开开发者工具,发现浏览器显示的数据不在其源码里面 ...
- 【Python3网络爬虫开发实战】6.4-分析Ajax爬取今日头条街拍美图【华为云技术分享】
[摘要] 本节中,我们以今日头条为例来尝试通过分析Ajax请求来抓取网页数据的方法.这次要抓取的目标是今日头条的街拍美图,抓取完成之后,将每组图片分文件夹下载到本地并保存下来. 1. 准备工作 在本节 ...
- 【Python3网络爬虫开发实战】 分析Ajax爬取今日头条街拍美图
前言本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理.作者:haoxuan10 本节中,我们以今日头条为例来尝试通过分析Ajax请求 ...
- 分析Ajax爬取今日头条街拍美图-崔庆才思路
站点分析 源码及遇到的问题 代码结构 方法定义 需要的常量 关于在代码中遇到的问题 01. 数据库连接 02.今日头条的反爬虫机制 03. json解码遇到的问题 04. 关于response.tex ...
- 转:【Python3网络爬虫开发实战】6.4-分析Ajax爬取今日头条街拍美图
[摘要] 本节中,我们以今日头条为例来尝试通过分析Ajax请求来抓取网页数据的方法.这次要抓取的目标是今日头条的街拍美图,抓取完成之后,将每组图片分文件夹下载到本地并保存下来. 1. 准备工作 在本节 ...
- PYTHON 爬虫笔记九:利用Ajax+正则表达式+BeautifulSoup爬取今日头条街拍图集(实战项目二)
利用Ajax+正则表达式+BeautifulSoup爬取今日头条街拍图集 目标站点分析 今日头条这类的网站制作,从数据形式,CSS样式都是通过数据接口的样式来决定的,所以它的抓取方法和其他网页的抓取方 ...
- 爬虫七之分析Ajax请求并爬取今日头条
爬取今日头条图片 这里只讨论出现的一些问题,代码在最下面github链接里. 首先,今日头条取消了"图集"这一选项,因此对于爬虫来说效率降低了很多: 在所有代码都完成后,也许是爬取 ...
- 使用scrapy爬虫,爬取今日头条搜索吉林疫苗新闻(scrapy+selenium+PhantomJS)
这一阵子吉林疫苗案,备受大家关注,索性使用爬虫来爬取今日头条搜索吉林疫苗的新闻 依然使用三件套(scrapy+selenium+PhantomJS)来爬取新闻 以下是搜索页面,得到吉林疫苗的搜索信息, ...
- 使用scrapy爬虫,爬取今日头条首页推荐新闻(scrapy+selenium+PhantomJS)
爬取今日头条https://www.toutiao.com/首页推荐的新闻,打开网址得到如下界面 查看源代码你会发现 全是js代码,说明今日头条的内容是通过js动态生成的. 用火狐浏览器F12查看得知 ...
随机推荐
- OpenSSH服务及其相关应用
远程登录工具: telnet,TCP/23:认证明文,数据传输明文,不够安全,所以出现了ssh ssh:Secure SHell,TCP/22,刚开始免费,后来商业化了,所以出现了Openssh,这个 ...
- ASP.NET中Onclick和OnserverClick事件的区别 (转)
对于服务器按钮控件(即<asp:Button>类型的按钮): 服务器响应事件:OnClick 客户端响应属性:OnClientClick 对于html按钮控件(即<input typ ...
- MongoDB .Net Driver(C#驱动) - 内嵌数组/嵌入文档的操作(增加、删除、修改、查询(Linq 分页))
目录 一.前言 1. 运行环境 二.前期准备工作 1. 创建 MongoDBContext MongoDb操作上下文类 2.创建测试类 3.创建测试代码 三.内嵌数组增加元素操作 1.Update.S ...
- IntelliJ IDEA 配置JSP & Servlet开发环境
首先我们要安装和配置好JAVA和TOMCAT,这里不再详细描述 下载地址: JAVA:https://www.oracle.com/technetwork/java/javase/downloads/ ...
- javascript高逼格代码实现数组去重,JSON深度拷贝,匿名函数自执行,数字取整等
1.如何装逼用代码骂别人傻逼 (!(~+[])+{})[--[~+""][+[]]*[~+[]] + ~~!+[]]+({}+[])[[~!+[]]*~+[]] 2.如何优雅的用代 ...
- [ActionScript 3.0] File下载工具
更新数据原理,访问接口,将服务器数据抓取并下载到本地的临时文件夹,当所有下载完成,卸载客户端内容,出现升级界面,此时移动下载的内容到目标文件夹,移动完成再重新加载客户端,访问接口,下载文件,移动文件均 ...
- 【FAQ】调用接口序列化问题
问题: Exception in thread "main" com.fasterxml.jackson.databind.JsonMappingException:Can not ...
- Dota2APP--第一天
从今天开始,下定决心自己独立开发一个有关于Dota2的APP,因为非常喜欢这个游戏恰好自己又是做iOS移动开发的所以萌生了这个想法.希望可以坚持下去,有喜欢dota2的朋友也可以提点建议. 一.项目的 ...
- Python-Django编程问题汇总
OS:Windows10 64 IDE:JetBrain Python Community Edition 2017.3.4 Python:python-3.6.4 Django:V2.0.3 问题一 ...
- 常用的PHP超全局变量$_SERVER 收集整理
传送带:https://www.cnblogs.com/rendd/p/6182918.html