1. 解析站长素材图片
需求:下载站长素材前10页的图片
站长素材
这是第一页图片的链接:https://sc.chinaz.com/tupian/fengjingtupian.html
这是第二页图片的链接:https://sc.chinaz.com/tupian/fengjingtupian_2.html
然后后面的规律为:
- 这是第三页图片的链接:
https://sc.chinaz.com/tupian/fengjingtupian_3.html
- 这是第四页图片的链接:
https://sc.chinaz.com/tupian/fengjingtupian_4.html
- 这是第五页图片的链接:
https://sc.chinaz.com/tupian/fengjingtupian_5.html
以此类推......
1.1 第一步:获取请求对象
UA(User-Agent)用户代理的获取方式为(UA介绍:User Agent中文名为用户代理,简称 UA,它是一个特殊字符串头,使得服务器能够识别客户使用的操作系统 及版本、CPU 类型、浏览器及版本。浏览器内核、浏览器渲染引擎、浏览器语言、浏览器插件等),有了UA就可以模仿是从游览器发起的请求。
def create_request(page):
if (page == 1):
url = 'https://sc.chinaz.com/tupian/fengjingtupian.html'
else:
url = 'https://sc.chinaz.com/tupian/fengjingtupian_' + str(page) + '.html'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3883.400 QQBrowser/10.8.4559.400'
}
request = urllib.request.Request(url=url, headers=headers)
return request
1.2 第二步:获取网页的源码
def get_content(request):
# 打开链接
response = urllib.request.urlopen(request)
# 获得网页源码(utf-8编码)
content = response.read().decode('utf-8')
return content
1.3 第三步:下载图片
xpath解析图片名称的路径:
name_list = tree.xpath('//div[@id="container"]//a/img/@alt')
xpath解析图片地址的路径:
我们使用 src_list = tree.xpath('//div[@id="container"]//a/img/@src')
我们看一下刷新后靠下面图片的链接:
我们发现这里图片的链接是 src2 而不是 src
当我们往下面翻的时候,发现src2又会变为src,这里是因为页面懒加载
机制的关系:
因此我们在爬虫的时候需要用到的是src2
此时我们就可以完成我们的代码了:
# (1) 请求对象的定制
# (2)获取网页的源码
# (3)下载
# 需求 下载的前十页的图片
# https://sc.chinaz.com/tupian/fengjingtupian.html 1
# https://sc.chinaz.com/tupian/fengjingtupian_2.html
import urllib.request
from lxml import etree
def create_request(page):
if (page == 1):
url = 'https://sc.chinaz.com/tupian/fengjingtupian.html'
else:
url = 'https://sc.chinaz.com/tupian/fengjingtupian_' + str(page) + '.html'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3883.400 QQBrowser/10.8.4559.400'
}
request = urllib.request.Request(url=url, headers=headers)
return request
def get_content(request):
# 打开链接
response = urllib.request.urlopen(request)
# 获得网页源码(utf-8编码)
content = response.read().decode('utf-8')
return content
def down_load(content):
# 下载图片
# urllib.request.urlretrieve('图片地址','文件的名字')
tree = etree.HTML(content)
name_list = tree.xpath('//div[@id="container"]//a/img/@alt')
# 一般设计图片的网站都会进行懒加载
src_list = tree.xpath('//div[@id="container"]//a/img/@src2')
for i in range(len(name_list)):
name = name_list[i]
src = src_list[i]
# 因为获取到的路径没有协议, 所以我们这里补上协议
url = 'https:' + src
urllib.request.urlretrieve(url=url, filename='./loveImg/' + name + '.jpg')
if __name__ == '__main__':
start_page = int(input('请输入起始页码'))
end_page = int(input('请输入结束页码'))
for page in range(start_page, end_page + 1):
# (1) 请求对象的定制
request = create_request(page)
# (2)获取网页的源码
content = get_content(request)
# (3)下载
down_load(content)
运行结果:
注意:需要在当前py文件同级目录建立一个loveImg的文件夹,否则会IO异常。