一、概况

爬个校花,妈妈再也不用担心我的学习了。

二、准备

在爬之前,我们要确定我们爬取的网站以及要爬取的哪些信息。

  • 目标网站:校花网(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标签全部在爬下来

    image

    我们随便点一个div,看看里面的标签,从每个div里面我们可以取出下面这些信息。那么详细信息我们去哪取,对,校花的详细信息在详情链接,我们要把详情链接取出来,在去里面看看有什么?

    image

    打开详细链接,我们可以看到如下信息,是我们想要的,有些信息确实没有,那也没办法了。

    image

    先分析到这,详情页的信息,我们先不管在哪个标签下,先把我们目前想要的这些信息获取出来在说。

四、首页提取

我们用xpath插件先简单定位一下,xpath有个特别好用的功能,就是模糊定位,我们发现想要的div标签class属性都包含一个一样的样式名字。

  • 注意: 一定确保只是你想要的内容包括的样式。如果下面这个包含的是item属性,就会取出126个,这肯定是不对的。功能虽好,但是一定要慎重使用。
image

我们已经把最重要的信息详情地址爬取下来了,剩下的就是代码实现,代码跟上一篇的斗图啦项目的逻辑差不多。

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让它自己东西编码解析。

    image

  • 代码里面请求网站源代码是否和浏览器的源代码是否一致
    如果没出现取不到的情况,可以忽略这个问题。如果出现了,可以考虑一下是否是这出现的影响,在代码里面有注释。

五、详情页分析

  • 资料
    随便点开一个详情页地址,先取出资料信息,取前7个tr标签,最后一个标签不取。暂时看了几个网页,好像都是这几个,后面如果遇到问题,在做容错处理。

    image

  • 详细资料
    详细资料比较好取,但是有需要注意的地方,有的校花没有详细资料。所以得做判空处理,有的详细资料标签不一样,所有咱们取父级div里面所有的文本就行。
    特别提醒我这里面使用的//代表父标签任意的地方的文本。

image

看起来直接取父亲标签下所有的内容应该是没问题。

image

  • 相册
    我们相册都是小图,这不能是我们忍受的,我们要高清大图,但是要高清图片还要进入她的空间取获取。所以在相册这,我们只要获取到校花的空间地址就可以了。

    image

    这详情页基本上我们就需要取这些字段,去用代码一点一点爬下来。

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://www.xiaohuar.com/s-1-2029.html

六、高清大图

这个页面我们最重要的就是把高清大图的链接找到,链接加上域名就是完整的大图地址。

image

在爬的过程中,我们发现有的图片是以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.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)self.loadzone(more)# 校花空间提取def loadzone(self, more):# 发起请求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)else:self.download("http://www.xiaohuar.com" + big_img)# 图片下载def download(self, big_img):print('正在下载', big_img)# 发起请求reponse = requests.get(url=big_img, headers=self.headers)#读取二进制内容content = reponse.content#保存到本地with open(big_img[-20::],'wb') as f:f.write(content)if __name__ == "__main__":xhs = XHSpider()xhs.loadpage()

先暂时下载一些,为了九牛二虎之力,终于可以看到点比较喜欢的校花了。先来预览一张高清大图吧

image

还不错。但是我们需要重新整理一下代码,我们根据校花的名字创建文件夹,然后把校花的资料、详细信息、空间相册的图片全下载进去。方便我们以后管理。又到我们考虑问题的时候了

  • 文件夹的命名
    我们在首页提取的标题字段可以做文件夹的名字
  • 图片的名字
    图片的名字可以拿图片地址后多少位进行命名
  • 个人信息命名
    个人信息的名字也可以拿首页的标题

那么开始实现吧,在每个函数实现创建文件夹的操作。还是实现多页下载。

全部代码:
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()

最终我们在本地看到有如下的文件夹:

image

image

我只爬取了第一页,大家有兴趣的可以多爬取几页。还有一个问题,大家可以自己处理,就是把代码简单的封装一下,比如发起网络请求可以单独封装一个方法。

七、总结

我们又通过一个例子,对爬虫有了一定的理解,在爬取的过程还是会遇到很多问题的,有些问题我们可能前期就能想到,而有的问题可能在运行代码的时候才会发现。不过既然是问题,就有解决办法。所有在打算爬取一个网站的时候,还要简单分析:

  • 我们要提取哪些信息
  • 网页地址的URL变化
  • 信息应该在哪个页面提取,有的页面信息重复
  • 多爬取一些信息,每个网页的结构可能不一样
  • 请求的网站源代码跟浏览器里面的源代码是否有区别(以请求下来的源码为准)

好了,反正不管如何,我们把校花图片爬下来了。


http://www.taodudu.cc/news/show-2630779.html

相关文章:

  • 用python爬取校花网图片
  • 校花网
  • python爬虫——校花网
  • Requests 校花网图片爬取
  • Scrapy爬虫框架之爬取校花网图片
  • python批量爬取校花网图片
  • 实战项目 — 爬取 校花网图片
  • python爬取百度贴吧图片库_python抓取百度贴吧-校花吧,网页图片
  • 爬取校花网的图片
  • 校花网图片爬取
  • 校花爬虫
  • 爬取校花网图片
  • Python爬虫系列-------Scrapy框架爬取校花网校花图片
  • 杜凯杰教学数据分析:python 图片爬取 爬取各校校花图片
  • 用Scrapy框架爬取校花网所有校花图片
  • python从入门到入土图片_python学习手册-爬爬那些年咱没见过的校花图片
  • 最网最全python框架--scrapy(体系学习,爬取全站校花图片),学完显著提高爬虫能力(附源代码),突破各种反爬
  • python爬虫(三):校花图片爬取
  • python_爬校花图片
  • 网红淘宝店的成与败
  • Linux 网络开发必学课程(九)分布式智能家居项目雏形、物联网设备WIFI模式实现
  • 14、网页雏形4
  • 蛋花花:人工智能雏形是怎么出来的
  • c++ primer plus6.11第三题 编写一个菜单驱动程序雏形。
  • 11、网页雏形1
  • 前端模块化雏形
  • 计算机网络的雏形为,计算机网络的发展雏形是什么
  • 现代通用计算机雏形是,科技知识:什么是现代通用计算机的雏形
  • 计算机网络的雏形为,计算机网络的发展雏形是什么(图文)
  • 一款智能家居APP的雏形

Python爬取校花网相关推荐

  1. Python爬取校花网,妈妈再也不会担心我不给她发女朋友照片了

    本文同步发表于我的微信公众号,扫一扫文章底部的二维码或在微信搜索 极客导航 即可关注,每个工作日都有文章更新. 一.概况 上一篇我们用一个表情网站入门了爬虫,爬了很多表情.今天我们继续在爬的路上,今天 ...

  2. python爬取校花网的图片

    import re import os.path import requests import hashlib import timerespose=requests.get('http://www. ...

  3. Python爬虫框架 scrapy 入门经典project 爬取校花网资源、批量下载图片

    ####1.安装scrapy 建议:最好在新的虚拟环境里面安装scrapy 注意:博主是在 Ubuntu18.04 + Python3.6 环境下进行开发的,如果遇到安装scrapy不成功请自行百度/ ...

  4. Python爬虫:正则表达式爬取校花网

    #正则表达式爬取校花网 # 网址 url = 'http://www.xiaohuar.com' #分页爬取大学校花图片共16页640张美图 1.导入模块 import requests import ...

  5. 使用Xpath爬取校花网,致敬10年前的校花『和』我们逝去的青春

    使用xpath爬取校花网 难点: 1.各个分类栏目下的页码url不统一 2.只取前三页,或者后三页 文章代码仅使用xpath和requests,本来想用scrapy框架的,但是偷了个懒. 所以就-哈哈 ...

  6. scrapy 爬取校花网

    原文链接: scrapy 爬取校花网 上一篇: scrapy 安装和简单命令 下一篇: scrapy 腾讯 招聘信息爬取 网址,爬取名称和对应的图片链接,并保存为json格式 http://www.x ...

  7. pycharm 爬取校花网

    1 1:什么是爬虫 2 定义:狭义:模拟浏览器,浏览网页,保存数据的程序 3 定义:广义:自动下载网络数据(网页,游戏,qq)的程序 4 打开校花网 'www.xiaohuar.com/hua/' # ...

  8. div不占位置_Python爬取校花网,妈妈再也不会担心我不给她发女朋友照片了

    一.概况 上一篇我们用一个表情网站入门了爬虫,爬了很多表情.今天我们继续在爬的路上,今天就爬个校花吧,毕竟妹子属于稀缺资源,要不妈妈总会问,你到底找不找女朋友了,爬点校花吧,以后跟妈妈聊天,可以哭着对 ...

  9. scrapy爬取校花网男神图片保存到本地

    爬虫四部曲,本人按自己的步骤来写,可能有很多漏洞,望各位大神指点指点 1.创建项目 scrapy startproject xiaohuawang scrapy.cfg: 项目的配置文件 xiaohu ...

  10. python爬虫爬取校花网视频

    import re import requests import hashlib import time# respose=requests.get('http://www.xiaohuar.com/ ...

最新文章

  1. 线程的介绍(概念、作用)
  2. 如何从命令行重新加载.bash_profile?
  3. 云安全云计算 迷团大揭幕
  4. DNA Sorting
  5. econtrol窗体设计器
  6. webpack第一节(4)
  7. 噪音声压和声功率的区别_南昌汽车隔音,深入了解汽车噪音的来源、危害以及解决方案...
  8. J2EE基础之Web服务简介
  9. pip强制更新包版本
  10. linux c 代码分析工具,编程达人 分享几款Linux 下C/C++程序内存泄漏检查工具
  11. 网络安全模型_工业互联网态势感知,看得见的网络安全
  12. 1022 D进制的A+B (20 分)—PAT (Basic Level) Practice (中文)
  13. FFT【快速傅里叶变换】FWT【快速沃尔什变换】
  14. C# 串口驱动封装成类库
  15. Windows设置自己的程序开机自动启动
  16. 【复盘】如何打造自己的研发能力
  17. 技术:车牌识别摄像机的应用,无人值守洗车房解决方案
  18. C\C++开发的经典魔塔小游戏--(3)主要逻辑处理,角色控制
  19. Android开发学习总结——搭建最新版本的Android开发环境
  20. 高中计算机八字标语,八字高考口号霸气押韵

热门文章

  1. 增加客流量的方法_如何增加博客流量-简单的方法(27条可靠的技巧)
  2. 中奖记录html页面,HTML5 canvas实现中奖转盘的实例代码
  3. Win7 64位重装系统之后,IE11安装失败、升级失败之解决办法
  4. Spring Cloud Eureka 全解 (1) - 总览篇
  5. 基于GoogleMap,Mapabc,51ditu基于GoogleMap,Mapabc,51ditu,VirtualEarth,YahooMap Api接口的Jquery插件的通用实现(含源代码下载)
  6. 自然语言处理系列五》新词发现与短语提取》短语提取
  7. 在48小时内了解智能制造,让你少走弯路
  8. 【STM32学习笔记】(6)—— 跑马灯实验详解
  9. Android跑马灯进度条,table数据跑马灯效果
  10. android跑马灯监听,TextView跑马灯状态监听