开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第21天,点击查看活动详情
前言
在上一篇《xpath基本使用》中,学习到了相关的语法以及基本的使用,还有浏览器插件的安装,但却未与实际场景相结合,今天就来学习下如何将xpath用在实际的爬取案例中吧。
站长素材:sc.chinaz.com/
该网站中有很多素材图片,字体,简历模板,PPT,代码模板等等的资源,是一个很不错的网站,今天我们就来获取一下该网站上的风景图片,看看有没有什么好看的拿来做壁纸吧~
前置准备
定位接口
通过翻页按钮,我们可以获取到前三页的链接如下所示:
# 第一页
https://sc.chinaz.com/tupian/fengjing.html
# 第二页
https://sc.chinaz.com/tupian/fengjing_2.html
# 第三页
https://sc.chinaz.com/tupian/fengjing_3.html
请求对象定制
需要请求的接口已经找到了,那么我们就可以来定制请求的对象了
def create_request(page):
base_url = 'https://sc.chinaz.com/tupian/fengjing'
tail_url = '.html'
if(page == 1):
url = base_url + tail_url
else:
url = base_url + '_' + str(page) + tail_url
headers = {
'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36'
}
return urllib.request.Request(url=url, headers=headers)
获取网页源码
请求对象拿到了,那么我们就需要向服务器发出请求,拿到响应的源码了
def getHtml(request):
response = urllib.request.urlopen(request)
return response.read().decode('utf-8')
下载图片
源码已经拿到了,那么剩下的自然就是将页面中的图片下载下来了。既然要下载图片,那就肯定涉及到解析页面的操作了,解析步骤如下:
- 定位图片,通过单击左下角的小箭头图标,然后再选择我们所需的图片,点击一下,即可跳到当前图片对应的源码部分
- 解析路径,按
Ctrl + Shift + x唤起浏览器插件,找到多个图片标签的共同点,输入查询条件校验看是否能正常获取我们所需的数据。
图中圈起来的地方,命中的标签都被加上高亮效果了,上下滚动一下,可以看到确实是我们需要获取的数据,那就可以把公式复制到我们代码中了。
- 获取
img标签数据,根据前面两步,我们已经可以抓取到所需要的图片标签了,剩下的就是将图片下载到本地了。在这里面,我们需要图片的名字以及图片链接,先来获取,打印一下看看结果吧。
打印出来的图片名称没问题,但是src怎么跟我们在页面中看到的不一样呢?
这种情况一般是网站做的一个懒加载缓存功能,我们可以先打印下获取到的响应页面源码看一下
在控制台中可以看到,src属性确实是../static/common/com_images/img-loding.png,但是下面又多了一个data-original属性,里面是图片的地址,那么我们就需要将表达式中src更换为data-original再打印出来看一下
这一次就能正常的获取到了,剩下的就是将图片下载到本地了。
def download_img(html):
tree = etree.HTML(html)
img_name_list = tree.xpath("//div/img[@class='lazy']/@alt")
img_src_list = tree.xpath("//div/img[@class='lazy']/@data-original")
for i in range(len(img_name_list)):
urllib.request.urlretrieve('https:' + img_src_list[i], './img/' + img_name_list[i] + '.jpg')
完整代码
import urllib.request
from lxml import etree
def create_request(page):
base_url = 'https://sc.chinaz.com/tupian/fengjing'
tail_url = '.html'
if(page == 1):
url = base_url + tail_url
else:
url = base_url + '_' + str(page) + tail_url
headers = {
'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36'
}
return urllib.request.Request(url=url, headers=headers)
def getHtml(request):
response = urllib.request.urlopen(request)
return response.read().decode('utf-8')
def download_img(html):
tree = etree.HTML(html)
img_name_list = tree.xpath("//div/img[@class='lazy']/@alt")
img_src_list = tree.xpath("//div/img[@class='lazy']/@data-original")
for i in range(len(img_name_list)):
urllib.request.urlretrieve('https:' + img_src_list[i], './img/' + img_name_list[i] + '.jpg')
if __name__ == '__main__':
start_page = int(input('请输入起始页码:'))
end_page = int(input('请输入结束页码:'))
for page in range(start_page, end_page + 1):
request = create_request(page)
html = getHtml(request)
download_img(html)
温馨提示:本案例仅供学习参考,切勿暴力爬取或用于其它非法途径。发生任何纠纷与本人无关!