耗时一周,我用Python爬取全国各地大学校花(高清照片和个人信息)
点击上方“何俊林”,马上关注,每天早上8:50准时推送
真爱,请置顶或星标
本文转载自公号极客导航
一、概况
今天就爬校花MM吧,毕竟妹子属于稀缺资源,要不妈妈总会问,你到底找不找女朋友了,爬点校花吧,以后跟妈妈聊天,可以哭着对她说,这就是我女朋友,漂亮吧~。行了,为了妈妈不担心,我们开始行动吧。
二、准备
在爬之前,我们要确定我们爬取的网站以及要爬取的哪些信息。
目标网站:校花网(http://www.xiaohuar.com/list-1-1.html)
获取信息:
校花的名字
校花的照片
校花的详细资料
确定好要爬的东西,就开始分析网站,其实我特别想获取联系方式,可是实力不允许呀。没有~
三、首页分析
URL地址变化分析
第一页:http://www.xiaohuar.com/list-1-0.html
第二页:http://www.xiaohuar.com/list-1-1.html
第五页:http://www.xiaohuar.com/list-1-4.html
不解释了,每页的地址应该能看的清清楚楚,明明白白。
提取信息分析
我们确定了每张图片都是一个独立的div标签,那么我首要任务就是把每页的div标签全部在爬下来
我们随便点一个div,看看里面的标签,从每个div里面我们可以取出下面这些信息。那么详细信息我们去哪取,对,校花的详细信息在详情链接,我们要把详情链接取出来,在去里面看看有什么?
打开详细链接,我们可以看到如下信息,是我们想要的,有些信息确实没有,那也没办法了。
先分析到这,详情页的信息,我们先不管在哪个标签下,先把我们目前想要的这些信息获取出来在说。
四、首页提取
我们用xpath插件先简单定位一下,xpath有个特别好用的功能,就是模糊定位,我们发现想要的div标签class属性都包含一个一样的样式名字。
注意: 一定确保只是你想要的内容包括的样式。如果下面这个包含的是item属性,就会取出126个,这肯定是不对的。功能虽好,但是一定要慎重使用。
我们已经把最重要的信息详情地址爬取下来了,剩下的就是代码实现,代码跟上一篇的斗图啦项目的逻辑差不多。
import requests
from lxml import etree
import osclass XHSpider():def __init__(self):# 默认第一页开始self.pn = 0# 默认URLself.url = 'http://www.xiaohuar.com/list-1-{0}.html'# 添加请求头,模拟浏览器self.headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'}# 发起请求def loadpage(self):# 拼接请求地址req_url = self.url.format(self.pn) # http://www.xiaohuar.com/list-1-0.htmlprint(req_url)# 发起请求reponse = requests.get(url=req_url, headers=self.headers)# 取返回的内容content = reponse.text'''注意:如果发现用xpath插件在浏览器上能取到标签,但是在代码里面取不到最好把请求下来的源代码保存到代码,分析一下为什么取不到,有时候浏览器里面的源代码跟你在代码里面请求的源码可能稍微不一样。'''with open('xiaohua.html','w') as f:f.write(content)# 构造xpath解析对象html = etree.HTML(content)# 先取出这个页面所有div标签div_list = html.xpath('//div[contains(@class,"masonry_brick")]')for div in div_list:# 从从每个div标签取出详情页链接 .代表当前位置desc_url = div.xpath('.//div[@class="img"]//a/@href')[0]# 标题img_title = div.xpath('.//div[@class="img"]//img/@alt')[0]# 封面图片地址img_url= div.xpath('.//div[@class="img"]//img/@src')[0]print(desc_url)if __name__ == "__main__":xhs = XHSpider()xhs.loadpage()#打印
http://www.xiaohuar.com/p-1-1997.html
http://www.xiaohuar.com/p-1-1995.html
http://www.xiaohuar.com/p-1-1994.html
http://www.xiaohuar.com/p-1-1993.html
http://www.xiaohuar.com/p-1-1991.html
http://www.xiaohuar.com/p-1-1986.html
......
上面有大家两个注意的地方
网站的编码格式
可以通过查看源码看到网站编码格式,可以看到这个网站并不是UTF-8的编码格式,我们可以直接用reponse.text让它自己东西编码解析。
代码里面请求网站源代码是否和浏览器的源代码是否一致
如果没出现取不到的情况,可以忽略这个问题。如果出现了,可以考虑一下是否是这出现的影响,在代码里面有注释。
五、详情页分析
资料
随便点开一个详情页地址,先取出资料信息,取前7个tr标签,最后一个标签不取。暂时看了几个网页,好像都是这几个,后面如果遇到问题,在做容错处理。
详细资料
详细资料比较好取,但是有需要注意的地方,有的校花没有详细资料。所以得做判空处理,有的详细资料标签不一样,所有咱们取父级div里面所有的文本就行。
特别提醒:我这里面使用的//代表父标签任意的地方的文本。
看起来直接取父亲标签下所有的内容应该是没问题。
相册
我们相册都是小图,这不能是我们忍受的,我们要高清大图,但是要高清图片还要进入她的空间取获取。所以在相册这,我们只要获取到校花的空间地址就可以了。
这详情页基本上我们就需要取这些字段,去用代码一点一点爬下来。
import requests
from lxml import etree
import osclass XHSpider():def __init__(self):# 默认第一页开始self.pn = 0# 默认URLself.url = 'http://www.xiaohuar.com/list-1-{0}.html'# 添加请求头,模拟浏览器self.headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'}# 发起请求def loadpage(self):# 拼接请求地址req_url = self.url.format(self.pn) # http://www.xiaohuar.com/list-1-0.htmlprint(req_url)# 发起请求reponse = requests.get(url=req_url, headers=self.headers)# 取返回的内容content = reponse.text'''注意:如果发现用xpath插件在浏览器上能取到标签,但是在代码里面取不到最好把请求下来的源代码保存到代码,分析一下为什么取不到,有时候浏览器里面的源代码跟你在代码里面请求的源码可能稍微不一样。'''with open('xiaohua.html', 'w') as f:f.write(content)# 构造xpath解析对象html = etree.HTML(content)# 先取出这个页面所有div标签div_list = html.xpath('//div[contains(@class,"masonry_brick")]')for div in div_list:# 从从每个div标签取出详情页链接 .代表当前位置desc_url = div.xpath('.//div[@class="img"]//a/@href')[0]# 标题img_title = div.xpath('.//div[@class="img"]//img/@alt')[0]# 封面图片地址img_url = div.xpath('.//div[@class="img"]//img/@src')[0]print(desc_url)self.loaddescpage(desc_url)#详情页def loaddescpage(self, desc_url):# 发起请求reponse = requests.get(url=desc_url, headers=self.headers)# 取返回的内容content = reponse.text# 构造xpath解析对象html = etree.HTML(content)# 取出资料的前6个,她的空间这个栏目不要tr_list = html.xpath('//div[@class="infodiv"]//tbody/tr[position()<6]')info = ""for tr in tr_list:info += " ".join(tr.xpath('./td/text()')) # 把每个取出来的列表拼接成字符串info += "\n"# 取出详细资料。注意的有点资料会有空的,做判空处理content = html.xpath('//div[@class="infocontent"]//text()')if content: # 假如不为空content = "".join(content) # 把详细资料拼接成字符串# 校花空间地址more = html.xpath('//span[@class="archive_more"]/a/@href')[0]print(info)print(content)print(more)if __name__ == "__main__":xhs = XHSpider()xhs.loadpage()#打印
姓 名: 李玮
年 龄:
星 座:
专 业:
学 校: 河北司法警官职业学院
你不知道,当你半夜躲过督察偷偷在宿舍玩手机的怎样的兴奋快感;你不知道,当你只没有学校的命令,天冷了不能穿高领,只能穿作训,天热了不能脱是什么感觉; 你不知道校规,每天把牙膏盒吹胀是什么感觉; 你不知道,为了学校严格规定,每天不吃饭也要压去了,三、四年就这样结束了……可正因为这样,我疯狂的爱上了它,不知疲倦!
六、高清大图
这个页面我们最重要的就是把高清大图的链接找到,链接加上域名就是完整的大图地址。
在爬的过程中,我们发现有的图片是以Http开头,有的不是,并且的有是错误的图片地址,所有我们需要做容错处理。
先暂时下载一些,为了九牛二虎之力,终于可以看到点比较喜欢的校花了。先来预览一张高清大图吧
还不错。但是我们需要重新整理一下代码,我们根据校花的名字创建文件夹,然后把校花的资料、详细信息、空间相册的图片全下载进去。方便我们以后管理。又到我们考虑问题的时候了
文件夹的命名
我们在首页提取的标题字段可以做文件夹的名字图片的名字
图片的名字可以拿图片地址后多少位进行命名个人信息命名
个人信息的名字也可以拿首页的标题
那么开始实现吧,在每个函数实现创建文件夹的操作。还是实现多页下载。
全部代码:
import requests
from lxml import etree
import osclass XHSpider():def __init__(self):# 默认第一页开始self.pn = 0# 默认URLself.url = 'http://www.xiaohuar.com/list-1-{0}.html'# 目录self.dir = '校花/'#刚开始就创建一个目录if not os.path.exists(self.dir): # 如果文件夹不存在os.mkdir(self.dir) # 创建文件夹# 添加请求头,模拟浏览器self.headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'}# 发起请求def loadpage(self):# 拼接请求地址req_url = self.url.format(self.pn) # http://www.xiaohuar.com/list-1-0.htmlprint(req_url)# 发起请求reponse = requests.get(url=req_url, headers=self.headers)# 取返回的内容content = reponse.text'''注意:如果发现用xpath插件在浏览器上能取到标签,但是在代码里面取不到最好把请求下来的源代码保存到代码,分析一下为什么取不到,有时候浏览器里面的源代码跟你在代码里面请求的源码可能稍微不一样。'''with open('xiaohua.html', 'w') as f:f.write(content)# 构造xpath解析对象html = etree.HTML(content)# 先取出这个页面所有div标签div_list = html.xpath('//div[contains(@class,"masonry_brick")]')for div in div_list:# 从从每个div标签取出详情页链接 .代表当前位置desc_url = div.xpath('.//div[@class="img"]//a/@href')[0]# 标题img_title = div.xpath('.//div[@class="img"]//img/@alt')[0]# 封面图片地址、这个地址好像没用。发现相册里面有这种图片img_url = div.xpath('.//div[@class="img"]//img/@src')[0]print(desc_url)#创建每个校花的文件夹folder = self.dir + img_titleif not os.path.exists(folder): # 如果文件夹不存在os.mkdir(folder) # 创建文件夹#开始请求详情页,把标题传过去,后面有用self.loaddescpage(desc_url, img_title)# 详情页def loaddescpage(self, desc_url, img_title):# 发起请求reponse = requests.get(url=desc_url, headers=self.headers)# 取返回的内容content = reponse.text# 构造xpath解析对象html = etree.HTML(content)# 取出资料的前6个,她的空间这个栏目不要tr_list = html.xpath('//div[@class="infodiv"]//tbody/tr[position()<6]')info = ""for tr in tr_list:info += " ".join(tr.xpath('./td/text()')) # 把每个取出来的列表拼接成字符串info += "\n"# 取出详细资料。注意的有点资料会有空的,做判空处理content = html.xpath('//div[@class="infocontent"]//text()')if content: # 假如不为空content = "".join(content) # 把详细资料拼接成字符串# 校花空间地址more = html.xpath('//span[@class="archive_more"]/a/@href')[0]print(info)print(content)print(more)# 个人信息info_dir = self.dir + img_title + "/" + img_title + "个人信息.txt"with open(info_dir, 'w') as f:f.write(info)f.write(content)#开始请求校花空间self.loadzone(more, img_title)# 校花空间提取def loadzone(self, more, img_title):# 发起请求reponse = requests.get(url=more, headers=self.headers)# 取返回的内容content = reponse.text# 构造xpath解析对象html = etree.HTML(content)# 取图片的地址列表big_imgs = html.xpath('//div[@class="inner"]//a/@href')# 做图片地址容错处理for big_img in big_imgs:if big_img.startswith('http') or big_img.endswith('.jpg'):if big_img.startswith('http'):self.download(big_img, img_title)else:self.download("http://www.xiaohuar.com" + big_img, img_title)# 图片下载def download(self, big_img, img_title):print('正在下载', big_img)# 发起请求reponse = requests.get(url=big_img, headers=self.headers)# 读取二进制内容content = reponse.content#图片地址img_dir = self.dir + img_title + "/" + big_img[-20::]# 保存到本地with open(img_dir, 'wb') as f:f.write(content)if __name__ == "__main__":xhs = XHSpider()#这正确的逻辑应该自动提取下一页,然后自动加载,不过数据量不大。可以简单通过循环提取。for i in range(0, 44):print('爬取第%d页' % i)xhs.pn = i # 把每页赋值给pnxhs.loadpage()
最终我们在本地看到有如下的文件夹:
我只爬取了第一页,大家有兴趣的可以多爬取几页。还有一个问题,大家可以自己处理,就是把代码简单的封装一下,比如发起网络请求可以单独封装一个方法。
七、总结
我们又通过一个例子,对爬虫有了一定的理解,在爬取的过程还是会遇到很多问题的,有些问题我们可能前期就能想到,而有的问题可能在运行代码的时候才会发现。不过既然是问题,就有解决办法。所有在打算爬取一个网站的时候,还要简单分析:
我们要提取哪些信息
网页地址的URL变化
信息应该在哪个页面提取,有的页面信息重复
多爬取一些信息,每个网页的结构可能不一样
请求的网站源代码跟浏览器里面的源代码是否有区别(以请求下来的源码为准)
好了,反正不管如何,我们把校花图片爬下来了,妈妈在也不会担心我们不给她发女朋友的照片了。
推荐阅读
看完这篇 Android ANR 分析,就可以和面试官装逼了!
阿里的朋友拿到头条Offer后,却反而头疼和纠结~
我想加入阿里,我该怎么做?
工作5年,为什么我越混越差?
耗时一周,我用Python爬取全国各地大学校花(高清照片和个人信息)相关推荐
- Python爬取王者荣耀所有英雄以及高清大图
转自 https://www.jianshu.com/p/93aba4661652
- 真厉害用python只要50行代码爬取黑丝美眉纯欲高清图
要说最美好的欲望莫过于看黑丝美眉. 一.技术路线 requests:网页请求 BeautifulSoup:解析html网页 re:正则表达式,提取html网页信息 os:保存文件 import re ...
- 利用Python爬取全国250m精度的人口数据
此次以GeoQ(智图)为基础,利用Python爬取全国250m精度的人口数据(GeoQ)这个网站开放过250m精度的人口分布数据,而且人口分布有年龄分段等属性.先得注册登录到达创建地图的界面. 看人口 ...
- 利用Python爬取全国250m精度的人口数据(GeoQ)、房价数据和公交站(线路)等数据
前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 中原百科 GIS大师兄 PS:如有需要Python学习资料的小伙伴可 ...
- 使用scrapy框架爬取汽车之家的图片(高清)
使用scrapy框架爬取汽车之家的图片(高清) 不同于上一篇的地方是,这篇要爬取的是高清图片,而不仅仅是缩略图. 先来看一下要爬取的页面:https://car.autohome.com.cn/pic ...
- 利用Python爬取全国250m精度的人口数据、房价数据等数据 | CSDN博文精选
作者 | 中原百科来源 | CSDN博客 (一) 我的第一篇博客写的就是爬取人口数据基于腾讯位置大数据平台的全球移动定位数据获取(Python爬取),精度是1000m,后来有朋友和我说有个网站开放过2 ...
- 用python爬取全国和全球疫情数据,并进行可视化分析(过程详细代码可运行)
用Python爬取最新疫情数据 这次重大疫情,每时每刻数据都有可能变化,这篇博文将为大家讲解如何爬取实时疫情数据,并且分析数据,作出数据可视化的效果. 报告梗概: 对中国疫情分析 1.1 展示各省疫情 ...
- python爬取全国五级行政区
以前爬过国家统计局的四级行政区(http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/2017/),但是对于五级数据效果不是很好. 偶然间发现这个网站:ht ...
- 你在的城市撒币了吗?Python爬取全国各城市消费券发放数据并分析
前言 近期,全国多地以各种形式投放消费券.消费补贴来鼓励消费,部分城市在首期消费券的基础上,连续追加发放多期消费券.你在的城市撒币了吗?哪个省份最爱撒币?哪个城市撒币最多?跟随本文一起来看看. 数据说 ...
- 用python爬取考研信息网_【高考、考研党的福利】使用Python爬取全国高校及GIS/RS专业信息【附代码和Excel】...
题外话:前一段时间翻译了一部关于GIS的纪录片,然后发了一篇文章,没想到有这么多人感兴趣,为了让广大GISER知道有这部神片,遂想投稿至GIS相关的专栏,不曾想居然还没人开设,真是"绕树三匝 ...
最新文章
- HBase保存的各个字段意义解释
- UIWindow 使用介绍
- java include 传递对象_变量的值传递,地址引用(和对象成员变量、局部变量创建和初始化的内存机制)...
- 全球及中国生产性服务产业动态展望与十四五建设现状规划报告2022版
- cadshx字体怎么安装_福利 | 关于PPT字体,你应该知道的几件事...字体包福利见文末...
- Windows Hook
- Java8-Guava实战示例
- Box Shadow CSS教程–如何向任何HTML元素添加投影
- 套接字(Windows)
- python找色_python实现从一组颜色中找出与给定颜色最接近颜色的方法
- 十六进制转换html,如何使用JavaScript将十进制转换为十六进制?
- c语言程序答设计答案张文祥,c语言程序设计答案张文祥
- 组态王与松下PLC FP系列连接
- 安装mysql数据库,Install/Remove of the Service Denied,服务名无效,No All Pattern Found.File Already Patched?问题解决
- 有损脑健康的七种坏习惯
- Xilinx SRIO_gen2关于时钟的问题
- 计算机科学与技术大学容易挂科吗,大一容易“挂科”的4个学科,学霸都未必敢报,最后一个“团灭”...
- Spring Cloud 五大组件
- Mobile TV Vs IPTV
- 模拟信号到数字信号转化_从模拟到数字再返回