# -*- coding:utf-8 -*-
from urllib import request
from bs4 import BeautifulSoup
import os
from fake_useragent import UserAgent
agent = UserAgent()
class IvskySpider(object):
def __init__(self):
self.url = 'http://www.ivsky.com'
self.headers = {
'User-Agent': agent.random,
'Host': 'www.ivsky.com'
}
self.html = ''
# 请求函数
def get_html(self, url):
req = request.Request(url, headers=self.headers)
response = request.urlopen(req)
self.html = response.read().decode('utf-8')
# 解析列表页函数
def parse_list(self):
# 创建bs 对象
bs = BeautifulSoup(self.html, 'lxml')
res = bs.select('.ali p a')
# print(res)
for ele in res:
# 从主页获取该图片的链接,点击进去(x张)
href = ele['href']
title = ele.string
print(href, title)
# 拼接详情页url
url = self.url + href
self.get_html(url)
# 根据分类标题,创建文件夹
path = 'images/' + title
if not os.path.exists(path):
os.makedirs(path)
# 解析详情页面数据
self.parse_detail(path)
# 找到下一页链接
next_ele = bs.find(class_='page-next')
if next_ele:
# 获取下一页链接
next_href = next_ele['href']
page = next_href.split('_')[-1].split('.')[0]
print('正在爬取第%s页' % page)
# 拼接完整的url地址
url = self.url + next_href
# 发起请求
self.get_html(url)
# 调用本身函数,解析下一页数据
self.parse_list()
else:
print('没有下一页')
# 解析详情页面数据
def parse_detail(self, path):
"""
高清图 http://img.ivsky.com/img/tupian/pre/201712/11/limao_nvhai-010.jpg
缩略图 http://img.ivsky.com/img/tupian/t/201712/11/limao_nvhai-010.jpg
"""
bs = BeautifulSoup(self.html, 'lxml')
# 找到图片
imgs = bs.select('.pli li div img')
for img in imgs:
try:
src = img['src']
# 替换链接中的/t/ 获取高清图片的链接
src = src.replace('/t/', '/pre/')
# 分割图片名称
name = src.split('/')[-1]
# 拼接图片完整存放路径
img_path = path + '/' + name
request.urlretrieve(src, img_path)
except Exception as e:
print(e)
# 找到下一页
next_ele = bs.find('page-next')
if next_ele:
next_href = next_ele['href']
url = self.url + next_href
self.get_html(url)
self.parse_detail(path)
else:
print('没有下一页')
def start(self):
self.get_html('http://www.ivsky.com/tupian')
self.parse_list()
if __name__ == '__main__':
tt = IvskySpider()
tt.start()
# -*- coding:utf-8 -*-
from lxml import etree
# parse()函数
# 用来解析本地的html文件
# ElementTree html源代码解析之后转换为一个ElementTree对象
html = etree.parse('index.html')
print(html)
# ElementTree 也可以转换为一个字符串对象
string = etree.tostring(html).decode('utf-8')
print(type(string))
# 找到a标签 通过标签名找到所有的标签
# 返回结果列表,列表中存放的是找到的是Element标签对象
res = html.xpath('//a')
print(res)
for ele in res:
print(ele)
# @属性名 查找标签的属性值
# text() 标签内的文本内容
href = ele.xpath('@href')[0]
text = ele.xpath('text()')[0]
print(href, text)
res = html.xpath('//a/@href')
print(res)
# /text()获取当前标签的直接子标签
# //text()获取当前标签和子孙标签内的所有文本
res = html.xpath('//a//text()')
print(res)
# 获取指定位置的标签
# //div[@属性名= 属性值]/标签/标签名[number] number指定找到第几个顺序的标签
res = html.xpath('//div[@id="main"]/ul/li[3]')
print(res[0].xpath('text()'))
# 获取指定属相包含某个属性值的标签
# * 可以表示任意标签名
# contains(@属性名, 属性值) 找到某个属性包含某个属性值的标签
res = html.xpath(".//*[contains(@class, 's')]")
print(res)
# 第一种方式 直接找h1标签
res = html.xpath('//h1[@class="content s"]')
print(res[0].xpath('text()'))
# 第二种方式
res = html.xpath('//p[@class="top"]/h1[contains(@class,"s")]')
print(res)
完整代码
from urllib import request
from bs4 import BeautifulSoup
import os
from fake_useragent import UserAgent
agent = UserAgent()
class IvskySpider(object):
def __init__(self):
self.url = 'http://www.ivsky.com'
self.headers = {
'User-Agent': agent.random,
'Host': 'www.ivsky.com'
}
self.html = ''
# 请求函数
def get_html(self, url):
req = request.Request(url, headers=self.headers)
response = request.urlopen(req)
self.html = response.read().decode('utf-8')
# 解析列表页函数
def parse_list(self):
# 创建bs 对象
bs = BeautifulSoup(self.html, 'lxml')
res = bs.select('.ali p a')
# print(res)
for ele in res:
# 从主页获取该图片的链接,点击进去(x张)
href = ele['href']
title = ele.string
print(href, title)
# 拼接详情页url
url = self.url + href
self.get_html(url)
# 根据分类标题,创建文件夹
path = 'images/' + title
if not os.path.exists(path):
os.makedirs(path)
# 解析详情页面数据
self.parse_detail(path)
# 找到下一页链接
next_ele = bs.find(class_='page-next')
if next_ele:
# 获取下一页链接
next_href = next_ele['href']
page = next_href.split('_')[-1].split('.')[0]
print('正在爬取第%s页' % page)
# 拼接完整的url地址
url = self.url + next_href
# 发起请求
self.get_html(url)
# 调用本身函数,解析下一页数据
self.parse_list()
else:
print('没有下一页')
# 解析详情页面数据
def parse_detail(self, path):
"""
高清图 http://img.ivsky.com/img/tupian/pre/201712/11/limao_nvhai-010.jpg
缩略图 http://img.ivsky.com/img/tupian/t/201712/11/limao_nvhai-010.jpg
"""
bs = BeautifulSoup(self.html, 'lxml')
# 找到图片
imgs = bs.select('.pli li div img')
for img in imgs:
try:
src = img['src']
# 替换链接中的/t/ 获取高清图片的链接
src = src.replace('/t/', '/pre/')
# 分割图片名称
name = src.split('/')[-1]
# 拼接图片完整存放路径
img_path = path + '/' + name
request.urlretrieve(src, img_path)
except Exception as e:
print(e)
# 找到下一页
next_ele = bs.find('page-next')
if next_ele:
next_href = next_ele['href']
url = self.url + next_href
self.get_html(url)
self.parse_detail(path)
else:
print('没有下一页')
def start(self):
self.get_html('http://www.ivsky.com/tupian')
self.parse_list()
if __name__ == '__main__':
tt = IvskySpider()
tt.start()
完整代码:
# -*- coding:utf-8 -*-
from urllib import request
from bs4 import BeautifulSoup
import os
from fake_useragent import UserAgent
agent = UserAgent()
class IvskySpider(object):
def __init__(self):
self.url = 'http://www.ivsky.com'
self.headers = {
'User-Agent': agent.random,
'Host': 'www.ivsky.com'
}
self.html = ''
# 请求函数
def get_html(self, url):
req = request.Request(url, headers=self.headers)
response = request.urlopen(req)
self.html = response.read().decode('utf-8')
# 解析列表页函数
def parse_list(self):
# 创建bs 对象
bs = BeautifulSoup(self.html, 'lxml')
res = bs.select('.ali p a')
# print(res)
for ele in res:
# 从主页获取该图片的链接,点击进去(x张)
href = ele['href']
title = ele.string
print(href, title)
# 拼接详情页url
url = self.url + href
self.get_html(url)
# 根据分类标题,创建文件夹
path = 'images/' + title
if not os.path.exists(path):
os.makedirs(path)
# 解析详情页面数据
self.parse_detail(path)
# 找到下一页链接
next_ele = bs.find(class_='page-next')
if next_ele:
# 获取下一页链接
next_href = next_ele['href']
page = next_href.split('_')[-1].split('.')[0]
print('正在爬取第%s页' % page)
# 拼接完整的url地址
url = self.url + next_href
# 发起请求
self.get_html(url)
# 调用本身函数,解析下一页数据
self.parse_list()
else:
print('没有下一页')
# 解析详情页面数据
def parse_detail(self, path):
"""
高清图 http://img.ivsky.com/img/tupian/pre/201712/11/limao_nvhai-010.jpg
缩略图 http://img.ivsky.com/img/tupian/t/201712/11/limao_nvhai-010.jpg
"""
bs = BeautifulSoup(self.html, 'lxml')
# 找到图片
imgs = bs.select('.pli li div img')
for img in imgs:
try:
src = img['src']
# 替换链接中的/t/ 获取高清图片的链接
src = src.replace('/t/', '/pre/')
# 分割图片名称
name = src.split('/')[-1]
# 拼接图片完整存放路径
img_path = path + '/' + name
request.urlretrieve(src, img_path)
except Exception as e:
print(e)
# 找到下一页
next_ele = bs.find('page-next')
if next_ele:
next_href = next_ele['href']
url = self.url + next_href
self.get_html(url)
self.parse_detail(path)
else:
print('没有下一页')
def start(self):
self.get_html('http://www.ivsky.com/tupian')
self.parse_list()
if __name__ == '__main__':
tt = IvskySpider()
tt.start()
# -*- coding:utf-8 -*-
from lxml import etree
# parse()函数
# 用来解析本地的html文件
# ElementTree html源代码解析之后转换为一个ElementTree对象
html = etree.parse('index.html')
print(html)
# ElementTree 也可以转换为一个字符串对象
string = etree.tostring(html).decode('utf-8')
print(type(string))
# 找到a标签 通过标签名找到所有的标签
# 返回结果列表,列表中存放的是找到的是Element标签对象
res = html.xpath('//a')
print(res)
for ele in res:
print(ele)
# @属性名 查找标签的属性值
# text() 标签内的文本内容
href = ele.xpath('@href')[0]
text = ele.xpath('text()')[0]
print(href, text)
res = html.xpath('//a/@href')
print(res)
# /text()获取当前标签的直接子标签
# //text()获取当前标签和子孙标签内的所有文本
res = html.xpath('//a//text()')
print(res)
# 获取指定位置的标签
# //div[@属性名= 属性值]/标签/标签名[number] number指定找到第几个顺序的标签
res = html.xpath('//div[@id="main"]/ul/li[3]')
print(res[0].xpath('text()'))
# 获取指定属相包含某个属性值的标签
# * 可以表示任意标签名
# contains(@属性名, 属性值) 找到某个属性包含某个属性值的标签
res = html.xpath(".//*[contains(@class, 's')]")
print(res)
# 第一种方式 直接找h1标签
res = html.xpath('//h1[@class="content s"]')
print(res[0].xpath('text()'))
# 第二种方式
res = html.xpath('//p[@class="top"]/h1[contains(@class,"s")]')
print(res)
完整代码
# -*- coding:utf-8 -*-
from lxml import etree
# parse()函数
# 用来解析本地的html文件
# ElementTree html源代码解析之后转换为一个ElementTree对象
html = etree.parse('index.html')
print(html)
# ElementTree 也可以转换为一个字符串对象
string = etree.tostring(html).decode('utf-8')
print(type(string))
# 找到a标签 通过标签名找到所有的标签
# 返回结果列表,列表中存放的是找到的是Element标签对象
res = html.xpath('//a')
print(res)
for ele in res:
print(ele)
# @属性名 查找标签的属性值
# text() 标签内的文本内容
href = ele.xpath('@href')[0]
text = ele.xpath('text()')[0]
print(href, text)
res = html.xpath('//a/@href')
print(res)
# /text()获取当前标签的直接子标签
# //text()获取当前标签和子孙标签内的所有文本
res = html.xpath('//a//text()')
print(res)
# 获取指定位置的标签
# //div[@属性名= 属性值]/标签/标签名[number] number指定找到第几个顺序的标签
res = html.xpath('//div[@id="main"]/ul/li[3]')
print(res[0].xpath('text()'))
# 获取指定属相包含某个属性值的标签
# * 可以表示任意标签名
# contains(@属性名, 属性值) 找到某个属性包含某个属性值的标签
res = html.xpath(".//*[contains(@class, 's')]")
print(res)
# 第一种方式 直接找h1标签
res = html.xpath('//h1[@class="content s"]')
print(res[0].xpath('text()'))
# 第二种方式
res = html.xpath('//p[@class="top"]/h1[contains(@class,"s")]')
print(res)
index文件内容:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8"/>
<title>xpath的基本用法</title>
</head>
<body>
<a class="top s" href="http://www.baidu.com">百度一下<h1>你就知道</h1></a>
<div id="main">
<ul>
<li>Python</li>
<li class="s">JavaScrip</li>
<li>HTML</li>
<li>ElasticSearch</li>
<li>
<a href="http://zhiyou100.com" target="_blank">智游</a>
<p>
<h1 class="content top">标题1</h1>
</p>
<p class="top">
<h1 class="content s">标题2</h1>
<h1 id="ooo">标题</h1>
<h1 id="ttt">ttt</h1>
</p>
<p>
<h1 class="content">标题3</h1>
</p>
<p>
<h1 class="content">标题4</h1>
</p>
</li>
</ul>
</div>
</body>
</html>