准备
在爬之前,我们要确定我们爬取的网站以及要爬取的哪些信息。
-
目标网站:校花网(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 os
'''
想要学习Python?Python学习交流群:984632579满足你的需求,资料都已经上传群文件,可以自行下载!
'''
class XHSpider():
def __init__(self):
# 默认第一页开始
self.pn = 0
# 默认URL
self.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.html
print(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 os
'''
想要学习Python?Python学习交流群:984632579满足你的需求,资料都已经上传群文件,可以自行下载!
'''
class XHSpider():
def __init__(self):
# 默认第一页开始
self.pn = 0
# 默认URL
self.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.html
print(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()