学习了xpath后,又有一个实战二了,利用xpath爬取网站上的图片,由于学的时候疯狂报错,决定再做一遍,然后逐步分析,加深理解,后续学习一下怎么爬取豆瓣评分前100的电影,然后以CSV的格式展示(感觉所有学爬虫的都有白嫖豆瓣电影这个项目。)
现在我先去复习一遍。
----------我肥来了,果然还是频频报错hhh看来我的复习很有必要---------
先整理一下思路:
爬取想要的网站的页面信息->数据解析->利用xpath定位到图片在html中的位置->遍历页面的图片->提取每张图片的标题以及网址->用requests访问图片的地址-->将图片进行持久化存储->完成
首先,要先导入模块:
import requests # 爬取网站用的
from lxml import etree # 数据解析用的
import os # 这个是关于处理文件的模块
接下来看一下要爬取的页面,是一个图片网站,这次要爬取的图片是里面的美食图片。
依旧是熟悉的爬取网址的代码,获取的是文本信息,用text就可以了。
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。
tree = etree.HTML(page_text)
现在我们按下F12,选取元素,鼠标点击图片后可以查看图片在整个HTML网页中的位置。
可见图片是在一个img标签下的,图片的部分地址在src中,而图片的名称在alt中。现在收起这个标签,再看看其他的图片所在的位置。
可以看到所有的图片都在一个div class='slist'标签的ul之下的所有li标签中,现在要做的就是将所有的li标签定位提取出来,然后我们就可以遍历所有的li标签,来获得每张图片的信息。
代码如下:
# 将图片存到上级目录中的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
最后就是将图片持久化存储啦。
with open(img_path, "wb") as fp:
fp.write(img_list)
print("all done")
查看效果:
打开一个看看。
不过应该是缩略图,要下载高清的4K大图貌似还要登录,涉及到cookie的操作,我目前还不会hhh,就这样啦,以后再说吧,其实我也不太懂xpath和bs4比好在哪里。