python爬虫系列:xpath爬取图片讲解(零基础向)
系列文章目录提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加例如:第一章 Python 机器学习入门之pandas的使用提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录系列文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结前言提示:这里可以添加本文要记录的大概内容:例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开
系列文章目录
python爬虫系列:BeautifulSoup爬取小说讲解(零基础向)(版权问题下架)
python爬虫系列:requests下载酷我音乐讲解(零基础向)(版权问题下架)
先放上代码,因为本人是萌新,所以代码和爬取的数据都是不美观的请见谅(没有第四行的代码也完全可以只不过都要再缩进)。
from lxml import etree #导入Xpath
import requests
import os
if __name__ == '__main__':
url = "https://pic.netbian.com/4kdongman/index.html"
headers = {"user-agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3947.100 Safari/537.36"}
res = requests.get(url,headers=headers).text.encode("ISO-8859-1") #中文转码
tree = etree.HTML(res) #实例化HTML
pictict = tree.xpath('//div[@class="slist"]//li') #获取<li>的数据
if not os.path.exists("./pictict") : #创建文件以便保存图片
os.mkdir("./pictict")
for list in pictict :
html = 'https://pic.netbian.com' + list.xpath("./a/img/@src")[0] #循环获取图片的url
name = list.xpath("./a/img/@alt")[0] + ".png" #获取图片名称
pictict_get = requests.get(url=html,headers=headers).content #进行持久化存储
name_path = "pictict/" + name #
with open(name_path,"wb") as f:
f.write(pictict_get)
print(name , "下载完成")
page = input("页数:") #因为第一张和后面的不太一样所以就从新写了一个
page = int(page)
for i in range(page) :
url_next = "https://pic.netbian.com/4kdongman/index_{}.html".format(page)
get_next = requests.get(url_next,headers=headers).text.encode("ISO-8859-1")
tree_next = etree.HTML(get_next)
pictict_next = tree_next.xpath('//div[@class="slist"]//li')
for list2 in pictict_next :
html_next = 'https://pic.netbian.com' + list2.xpath("./a/img/@src")[0]
name_next = list2.xpath("./a/img/@alt")[0] + ".png"
pictict_get_next = requests.get(url=html_next, headers=headers).content
name_path_next = "pictict/" + name_next
with open(name_path_next, "wb") as f:
f.write(pictict_get_next)
print(name_next, "下载完成")
一、思路
1.我们要明确我们的目标
2.我们要分析怎样实现目标
3.进行详细的代码敲写
二、使用步骤
1.引入库
这次我们要使用Xpath来进行图片的爬取,所以我们先进行安装库,话说是使用xpath,实际上就是把lxml,下下来。
pip install lxml
2.代码分析
Xpath并不是像requests那样导入,而是使用from lxml import etree这样来导入,而且在这里说一下,当你使用Xpath的时候Xpath是没有补全的,不过Xpath仍能正常使用。
其次我们也需要requests来进行从网页源码导入Xpath。
from lxml import etree #导入Xpath
import requests
接下来就是实例化网页源码,先按F12进入开发者工具(记得按F5刷新),再看下面几幅图。
我们可以看到这个网页支持get请求,所以我们就用requests中的get请求。
url = "https://pic.netbian.com/4kdongman/index.html"
headers = {"user-agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36(KHTML,like Gecko) Chrome/69.0.3947.100 Safari/537.36"}
res = requests.get(url,headers=headers).text.encode("ISO-8859-1") #中文转码
tree = etree.HTML(res) #实例化HTML
我们也要使用headers进行UA伪装,你也不必这么纠结这个UA伪装,他的意思就是让网页识别我们为用户而非爬虫,记住小心复制上空格以导致运行时出错。大家也可能看到我圈的cookie了,你可以把它当做饼干,可以贿赂网页,但在这我没写。我们就用get进行请求,因为我们要实例化网页源码才能使用Xpath来进行爬取图片,所以我们后面就跟上了 .text 以便实例化,后面的就是中文转码,要不然名字什么的,都是乱码。Xpath就是用 etree.HTML 进行实例化,这是网页的实例化,还可以本地的保存的HTML实例化,用 etree.parse 进行本地的实例化。
既然实例化好了,那么我们就应该来找到每张壁纸的url,来进行爬取,我们进行网页分析。
这么一看,这些个图片的url藏得有点深,不过还是可以一步一步的爬出来。
pictict = tree.xpath('//div[@class="slist"]//li') #获取<li>的数据
仅这一行代码就可以爬到
标签,我来说下这层代码的含义(Xpath没补全是正常的)。
如果看过那篇BeautifulSoup的话应该也会明白一点,虽然BeautifulSoup和Xpath的关系不大,不过他们的用法却有些相似,因为BeautifulSoup是空格跨级爬取,而在Xpath是通过//来进行跨级爬取,因为简单所以我直接就用//直接跳到了
标签这里。
毕竟要爬的准确一点,所以就有了div后面的那一块,它并不能向BeautifulSoup那样直接输入,它需要用[ ]来进行输入,还要加@,这样以后才能输入div后面的内容。
我们又拿到了
标签,我们就需要循环来帮我们拿到全部的标签的内容,我们就用 for...in... 循环来进行循环。
for list in pictict :
html = 'https://pic.netbian.com' + list.xpath("./a/img/@src")[0] #循环获取图片的url
name = list.xpath("./a/img/@alt")[0] + ".png" #获取图片名称
我们再来看一下网页。
图片的url在里面,那我们怎么获取呢?
html = 'https://pic.netbian.com' + list.xpath("./a/img/@src")[0]
上面我们也说了//是跳级,不过/就不是了,它是一级一级的爬,所以就用/来到了标签里,而想要获取到src,就需要一个Xpath的用法了,那就是@,再通过/@src就能获得它的内容,是不是感觉Xpath还是蛮好用的?在讲一下前面的 . 这个点的意思就是在
标签中。还有那个 [0],因为你 获取的是一个列表,所以你 要把列表的[ ]给去掉,所以就用了这个来进行 索引, 因为索引是从0开始的,所以就用了[0]。
再看一下网页 ,毕竟我们要一个整的图片的url,刚才获取的只不过是一部分。
可见它的地址是https://pic.netbian.com/uploads/allimg/210621/225658-162428741823f5.jpg,而我们获取的地址是/uploads/allimg/210621/225658-162428741823f5.jpg,由此我们可以看出图片的整个url缺的是https://pic.netbian.com,然后通过上面的代码把它们拼接在一起就可以了。
图片也总得有个名字进行保存,我们就去网页看看名字在哪里。
这么一看名字在这个地方,那么获取方法不就和上面的一样了吗?大家自己悟一下吧。
图片url和名称我们都有了,接下来就是保存了。
pictict_get = requests.get(url=html,headers=headers).content #进行持久化存储
name_path = "pictict/" + name #
with open(name_path,"wb") as f:
f.write(pictict_get)
print(name , "下载完成")
requests中保存的用法就是.content,这个用法就是持久化存储,我们只要把上面我们拿到的url放上就行,还有那些大部分都是自己取的名字,不必太在意。第二行的代码意思是,在pictict的文件夹下面,相当于一个路径,因为之前的name后面加了".png"所以在第三行保存时就不用写了,关于文件读写可以去看大佬的文章传送门。在这里就简单讲一下,wb就是写入的意思(好像w也行),后面的f也是可以自己编。下完要记得提醒一下,要不然啥也不知道,于是就我们打印一下某某某下载完成就行了。
这只是第一页,第二页就和第一页不同了。
这是第一页。
这是第二页。
这是第三页。
看出他们之间的差异了吧,2,3页多了个_2和_3。那我们怎么办?
page = input("页数:") #因为第一张和后面的不太一样所以就从新写了一个
page = int(page)
for i in range(page) :
url_next = "https://pic.netbian.com/4kdongman/index_{}.html".format(page)
因为input这个可以自己输入,所以我们就用这个,因为input返回的是字符串,不是数字,所以我们才会用int来变成数字,我们再用到range()这个函数,这个函数配上for....in... 循环可以循环数字,比如range(5),会输出:1,2,3,4,5 。所以我们选择这个。后面的.format()可以讲我们所循环的数字一个一个的输进去,不过在我们要换数字的地方要换上大括号。
下面的内容就和上面一样了,只不过名字都换了一下。
总结
善于分析网页的结构,有清晰的思路,灵活运用各种方法。
文章有不对的地方请大佬指正。
更多推荐










所有评论(0)