淘女郎首页:python爬虫入门教程(三):淘女郎爬虫 ( 接口解析 | 图片下载 ) 2024-04-16 10:08:16 0 0 2019/10/28更新网站已改版,代码已失效(其实早就失效了,但我懒得改。。。)此博文仅供做思路上的参考代码使用python2编写,因已失效,就未改写成python3 爬虫入门系列教程: python爬虫入门教程(一):开始爬虫前的准备工作 python爬虫入门教程(二):开始一个简单的爬虫 python爬虫入门教程(三):淘女郎爬虫 ( 接口解析 | 图片下载 ) 等待更新… 转载请注明出处:https://blog.csdn.net/aaronjny/article/details/80291997 时隔好久,爬虫教程终于更新了。不好意思啊= = 这篇教程主要讲如何将网络上的图片保存到本地来,以及如何利用接口解析完成动态页面的抓取。 本来是想依然用“妹子图”站点来演示的,结果点击去一看,没想到只过去一年,里面的图片却尺度越来越大了。。。还是算了。 看了一下,还是用“淘女郎”来演示吧,这也是一个用的比较多的例子。读完本文,你将掌握以下技能: “淘女郎”爬虫的demo和逻辑 基于对接口的解析完成动态页面的抓取 使用python创建文件夹 将网络上的图片(或文件)保存到本地 基本的反ban措施 特别声明:本爬虫仅供学习使用,该博客撰写也仅出于学习目的,请勿用于商业活动,博主不承担相关法律责任。 1.创建项目 首先,在pycharm里面创建一个项目,就按站点域名来命名吧,mm_taobao。 创建完成之后,打开项目。然后创建新的py文件,命名为spider.py。相关代码将在spider.py里进行编写。 ok,接下来我们对要采集的站点进行研究。 2.研究目标站点 我们要采集的站点是“淘女郎”。百度搜索一下,就能够找到链接,比如当前的链接是https://mm.taobao.com/search_tstar_model.htm(如果淘宝的网站架构做了相关调整,这个链接可能会改变)。 页面大概是这个样子的: 我们想要获得的内容如下:淘女郎名字、所在地、以及该名模特发布的一系列图片。 其中,名字和所在地我们已经看到了,而点击该模特的肖像,就能进入该模特的主页,里面有她发布的一系列图片: 那么,如何来编写爬虫呢? 首先,我们回到主页上来。在主页上能够看到模特的列表,比如说第一个模特,名为“朱琳”。好的,让我们邮件点击页面,查看源码。然后在源码中搜索“朱琳”,你会看到: 什么鬼?为什么源码中找不到? 读过前面两篇博文,你应该知道,爬虫获取的内容是从源码中取得的。但是我在页面中明明看到了,在源码里面却没用,这怎么爬? 这就是动态页面抓取。当我们访问这个网址的时候,浏览器返回给我们的只有一部分信息。仔细观察源码就能发现,在本应该显示模特信息的地方,源码是这个样子的: 数据加载中……事实上,服务器是先给我们返回了这个页面,然后又通过ajax技术,请求了另外一个接口。接口返回了淘女郎们的信息,随后浏览器运行javascript代码,将这些信息填充到先前的页面中,因此,我们才在页面中看到了淘女郎们的信息。右键点击页面,选择“检查”,在“网络”一栏中能够看到真相(可能要刷新页面): 能够看到,共进行了两次请求,第一次是我们先前看到的源码,第二次就是淘女郎们相关信息。点开之后,右边有展示。我们需要的淘女郎姓名、所在地以及userId都能够从中获得(userId用于构建模特个人主页访问地址)。 嗯,大概是这个样子。开始写代码吧,其余的问题我们在编码的过程中进行探讨。 3.解析首页 在你对requests库和web请求过程有所了解后,你已经能够很轻松编写出请求首页接口的代码来:# coding=utf-8import sysreload(sys)sys.setdefaultencoding('utf8')import requestsfrom bs4 import BeautifulSoupimport jsonindex_url = 'https://mm.taobao.com/tstar/search/tstar_model.do?_input_charset=utf-8'def parse_index(): """ 解析淘女郎首页接口 :return: """ # 创建一个session session = requests.Session() # 设置用于访问的请求头 headers = { 'accept': 'application/json, text/javascript, */*; q=0.01', 'accept-encoding': 'gzip, deflate, br', 'accept-language': 'zh-CN,zh;q=0.9', 'content-type': 'application/x-www-form-urlencoded; charset=UTF-8', 'origin': 'https://mm.taobao.com', 'referer': 'https://mm.taobao.com/search_tstar_model.htm', 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36', 'x-requested-with': 'XMLHttpRequest', } # 设置post的数据 data = { 'q': '', 'viewFlag': 'A', 'sortType': 'default', 'searchStyle': '', 'searchRegion': 'city:', 'searchFansNum': '', 'currentPage': '1', 'pageSize': '100', } # 进行请求,并用resp接收返回结果 resp = session.post(url=index_url, data=data, headers=headers) # 打印返回结果 print resp print resp.contentif __name__ == '__main__': parse_index() Session是requests库中的一个类,创建session对象进行访问的好处是,session对象能够自动维护访问的cookies信息。当然,它是不具备执行javascript代码的能力的,因此通过javascript修改的cookies信息它是记录不到的。 为什么要记录cookies? 因为有些站点,在你进行请求时,服务器可能会验证你的cookies信息。当cookies信息不正确时,服务器就会拒绝你的访问。 随后,我们设置了本次访问的headers和data,也就是请求消息头和post传递的数据。这些数据都可以从“检查”-“网络”-点击相关请求-"Headers"栏获得: 设置headers和data的目的是,为了将本次请求伪装成浏览器的请求,并通过传递的数据控制服务器返回我们需要的信息。更多的这里就不多说了,后面会在反ban的教程中做详细介绍。 接口的地址也是从这里获得的。 让我们运行一下代码,可以看到,访问成功了,返回的结果是一个json字符串。 接下来,我们进行解析吧。解析json字符串,我们需要用到Python的json库,它能够将一个json字符串转换为一个字典对象(或者反过来也可以)。我们将利用json库从返回的内容中提取需要的信息。# 将json字符串转换成字典对象 data=json.loads(resp.content.decode('gb2312')) # 找到含有淘女郎信息的列表 data=data['data']['searchDOList'] for mm in data: print mm['city'] print mm['realName'] print mm['userId'] print '*'*80 需要注意的是,返回的消息的编码为gb2312,我们需要先进行decode,将其变为utf8,不然会出现乱码。现在运行一下代码看一下,我们已经成功提取出了信息: 测试没出现问题,那么,我们把代码稍微改一下,以适应接下来的步骤。修改后的代码稍后给出。 4.解析模特主页 请求模特主页的代码应该也不存在什么问题,跟上面那个是差不多的,区别只是一个用get一个用post而已。代码如下:# coding=utf-8import sysreload(sys)sys.setdefaultencoding('utf8')import requestsfrom bs4 import BeautifulSoup 收藏(0)