前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >利用xpath爬取图片

利用xpath爬取图片

作者头像
y191024
发布2022-09-20 19:07:08
发布2022-09-20 19:07:08
1.3K00
代码可运行
举报
运行总次数:0
代码可运行

学习了xpath后,又有一个实战二了,利用xpath爬取网站上的图片,由于学的时候疯狂报错,决定再做一遍,然后逐步分析,加深理解,后续学习一下怎么爬取豆瓣评分前100的电影,然后以CSV的格式展示(感觉所有学爬虫的都有白嫖豆瓣电影这个项目。)

现在我先去复习一遍。

----------我肥来了,果然还是频频报错hhh看来我的复习很有必要---------

先整理一下思路:

爬取想要的网站的页面信息->数据解析->利用xpath定位到图片在html中的位置->遍历页面的图片->提取每张图片的标题以及网址->用requests访问图片的地址-->将图片进行持久化存储->完成

首先,要先导入模块:

代码语言:javascript
代码运行次数:0
复制
import requests # 爬取网站用的
from lxml import etree  # 数据解析用的
import os  # 这个是关于处理文件的模块

接下来看一下要爬取的页面,是一个图片网站,这次要爬取的图片是里面的美食图片。

依旧是熟悉的爬取网址的代码,获取的是文本信息,用text就可以了。

代码语言:javascript
代码运行次数:0
复制
if __name__ == "__main__":
    url = "https://pic.netbian.com/4kmeishi/"
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:87.0) Gecko/20100101 Firefox/87.0"
    }
    page_text = requests.get(url=url, headers=headers).text

接下来就是xpath登场,首先实例化一个实例,由于是网页信息,所有用的是etree.HTML()方法,我们将他命名为tree。

代码语言:javascript
代码运行次数:0
复制
tree = etree.HTML(page_text)

现在我们按下F12,选取元素,鼠标点击图片后可以查看图片在整个HTML网页中的位置。

可见图片是在一个img标签下的,图片的部分地址在src中,而图片的名称在alt中。现在收起这个标签,再看看其他的图片所在的位置。

可以看到所有的图片都在一个div class='slist'标签的ul之下的所有li标签中,现在要做的就是将所有的li标签定位提取出来,然后我们就可以遍历所有的li标签,来获得每张图片的信息。

代码如下:

代码语言:javascript
代码运行次数:0
复制
    # 将图片存到上级目录中的picture文件夹中
    if not os.path.exists("../picture"):
           # 没有的话就创建一个picture文件夹
            os.mkdir("../picture")
    for li in li_list:
        # 获得每张图片的地址,由于标签下的src不完整,所以需要拼接
        # 利用xpath解析的结果返回的是一个列表,所以用了索引[0]可以变成str类型
        img_url = "https://pic.netbian.com" + li.xpath("./a/img/@src")[0]
        # 存储时用的文件名,后面要加上后缀,否则图片的格式会出错
        name_list = li.xpath("./a/img/@alt")[0]+".jpg"  # 忘记加后缀了
        # 尝试打印发现出来的是乱码,因此要加上下面这句
        img_name = name_list.encode("iso-8859-1").decode("gbk")
        # 现在访问图片的地址,由于是图片(二进制),要用content而不是text
        img_list = requests.get(url=img_url, headers=headers).content
        # 这是存储图片的路径
        img_path = "../picture/" + img_name

最后就是将图片持久化存储啦。

代码语言:javascript
代码运行次数:0
复制
        with open(img_path, "wb") as fp:
            fp.write(img_list)
    print("all done")

查看效果:

打开一个看看。

不过应该是缩略图,要下载高清的4K大图貌似还要登录,涉及到cookie的操作,我目前还不会hhh,就这样啦,以后再说吧,其实我也不太懂xpath和bs4比好在哪里。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-04-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 睡不着所以学编程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档