本节中,我们以今日头条为例来尝试通过分析Ajax请求来抓取网页数据的方法。这次要抓取的目标是今日头条的街拍美图,抓取完成之后,将每组图片分文件夹下载到本地并保存下来。
1. 准备工作
在本节开始之前,请确保已经安装好requests库。
2.实战演练
首先,实现方法get_page()
来加载单个Ajax请求的结果。其中唯一变化的参数就是offset
,所以我们将它当作参数传递,实现如下:
import requests from urllib.parse import urlencode def get_page(offset): params = { 'offset': offset, 'format': 'json', 'keyword': '街拍', 'autoload': 'true', 'count': '20', 'cur_tab': '1', } url = 'http://www.toutiao.com/search_content/?' + urlencode(params) try: response = requests.get(url) if response.status_code == 200: return response.json() except requests.ConnectionError: return None
这里我们用urlencode()
方法构造请求的GET参数,然后用requests请求这个链接,如果返回状态码为200,则调用response
的json()
方法将结果转为JSON格式,然后返回。
接下来,再实现一个解析方法:提取每条数据的image_detail
字段中的每一张图片链接,将图片链接和图片所属的标题一并返回,此时可以构造一个生成器。实现代码如下:
def get_images(json): if json.get('data'): for item in json.get('data'): title = item.get('title') images = item.get('image_detail') for image in images: yield { 'image': image.get('url'), 'title': title }
接下来,实现一个保存图片的方法save_image()
,其中item
就是前面get_images()
方法返回的一个字典。在该方法中,首先根据item
的title
来创建文件夹,然后请求这个图片链接,获取图片的二进制数据,以二进制的形式写入文件。图片的名称可以使用其内容的MD5值,这样可以去除重复。相关代码如下:
import os from hashlib import md5 def save_image(item): if not os.path.exists(item.get('title')): os.mkdir(item.get('title')) try: response = requests.get(item.get('image')) 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): with open(file_path, 'wb') as f: f.write(response.content) else: print('Already Downloaded', file_path) except requests.ConnectionError: print('Failed to Save Image')
最后,只需要构造一个offset
数组,遍历offset
,提取图片链接,并将其下载即可:
from multiprocessing.pool import Pool def main(offset): json = get_page(offset) for item in get_images(json): print(item) 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()
这里定义了分页的起始页数和终止页数,分别为GROUP_START
和GROUP_END
,还利用了多线程的线程池,调用其map()
方法实现多线程下载。
这样整个程序就完成了,运行之后可以发现街拍美图都分文件夹保存下来了,如图所示。
最后,我们给出本节的代码地址:https://github.com/Python3WebSpider/Jiepai。
相关推荐
《加速刷新:2018今日头条娱乐白皮书》.pdf
《今日头条》产品分析报告 本报告深入探讨了“今日头条”这一智能新闻推荐平台的产品特性、运营策略以及在数字化转型中的作用。报告分为多个部分,详细阐述了智慧方案、解决方案、数字化工程、大数据平台的整体规划...
【黑芝麻智能】是一家专注于自动驾驶芯片研发的中国独角兽企业,由具有深厚行业经验的创始人团队于2016年创立。公司瞄准智能汽车市场对于高算力、高性能芯片的急迫需求,尤其在新冠疫情导致全球汽车芯片短缺的背景下...
【标题】:“微信小程序开发-新闻咨询类-今日头条案例源码.zip”是一个关于微信小程序开发的实战项目,其中包含了创建一个类似“今日头条”的新闻资讯应用的完整源代码。这个项目旨在帮助开发者理解和学习如何利用...
【标题】"3·今日头条资讯打假报告"指的是一个针对今日头条平台上虚假信息的调查与分析报告,这可能是一个公众或专业机构对当前网络新闻真实性问题的关注与研究。在这个数字化时代,社交媒体和新闻平台成为了信息...
### 掺伪芝麻油中芝麻油含量分析方法的比较 #### 概述 在食品行业中,芝麻油作为一种常见的食用油,其品质与真实性受到了广泛关注。然而,市场上存在的掺伪现象,如添加低价油或使用香精加色素制造假冒产品,严重...
黑芝麻:国产芯片能有多少机会.pdf
【南方黑芝麻集团股份有限公司2020年年度报告】提供了公司过去一年的综合业绩和经营状况,涵盖了财务、业务、风险、未来规划等多个方面。以下是报告中的关键知识点: 1. **年度报告的真实性与责任**:董事会、监事...
在IT领域,网络爬虫是一种自动化程序,用于从互联网上抓取信息,通常用于数据分析、市场研究或构建搜索引擎。在Python中实现定时爬取网页内容是常见需求,它结合了网络爬虫技术与任务调度机制。本文将深入探讨如何...
通达信指标公式源码蜡烛钻石小量(芝麻量 钻石量)是指一个基于通达信指标公式的蜡烛钻石小量指标,该指标通过对 Volume(成交量)和 Close(收盘价)的分析,来识别芝麻量和钻石量的出现。 该指标公式主要包括以下...
首先,芝麻信用接口是阿里巴巴旗下蚂蚁金服提供的一项服务,它通过收集、分析用户的消费行为、支付习惯等多维度数据,为用户生成一个信用评分,这个评分广泛应用于租赁、信贷、求职等多个场景。调用芝麻信用接口,...
芝麻油行业企业市场突围战略分析与建议 芝麻油行业是中国传统产业之一,近年来随着消费升级和健康意识的提高,芝麻油行业市场需求不断增长。为了帮助芝麻油行业企业更好地应对市场挑战,本文对2021-2026年芝麻油...
芝麻测试,或者称为SESAME-TEST,是一种针对软件和应用的测试方法,旨在确保产品的功能性和性能。在本文中,我们将深入探讨与JavaScript相关的芝麻测试技术、重要性以及如何进行有效的测试。 首先,我们理解...
这份食品饮料类调味调料行业芝麻油领域的分析报告是一份涵盖了行业市场规模、公司分布、市场前景、人力成本等多个方面的研究报告。以下是从标题、描述、标签和提供的部分内容中提取的知识点,详细解释如下: 1. ...
芝麻信用接口Demo是一款用于演示如何与芝麻信用开发平台进行交互的应用程序示例。这个压缩包包含了一个或多个文件,它们提供了具体的代码示例,帮助开发者理解并实践芝麻信用的API调用过程。以下是对这个Demo中可能...
【仿芝麻信用分】是一种基于大数据和信用评估的模拟系统,旨在模仿阿里巴巴旗下蚂蚁金服推出的“芝麻信用分”服务。这个项目可能是为了学习和理解如何构建类似的信用评分模型,或者是为了开发一个内部或测试版的信用...
《2014-2020年中国香油(芝麻油)行业分析与投资方向研究报告》针对这一现象,对芝麻油行业进行了深入的分析,并提供了投资方向的建议。 报告从全球视角出发,首先对2012年的全球香油行业运营状况进行了详细分析,...
JAVA WEB项目网页设计作业源码:芝麻开门博客网JAVA WEB项目网页设计作业源码:芝麻开门博客网JAVA WEB项目网页设计作业源码:芝麻开门博客网JAVA WEB项目网页设计作业源码:芝麻开门博客网JAVA WEB项目网页设计作业...
在Java开发领域,芝麻信用是一种基于大数据和云计算的信用评估服务,主要由蚂蚁金服提供。这个实例项目可能涵盖了如何利用Java技术与芝麻信用接口进行交互,获取和处理用户的信用数据。下面将详细讨论相关知识点。 ...
例如,如果爬取的网页内容是以UTF-8编码的,可以这样解码: ```python import requests response = requests.get('http://example.com') content = response.content # 字节串,包含UTF-8编码的Unicode文本 ...