用python的xpath和requests库爬取图片超详细实例(每一步都有注释)

用python的xpath和requests库爬取图片超详细实例(每一步都有注释)

本实例用于学习和研究,禁止非法用途,一切后果自负,若有侵权请联系:2877929996@qq.com。
版权声明:本文为博主原创文章,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/qq_43406819/article/details/102889083
本实例用到的python库有

requestsxpath

1.第一步进入我们要爬取的网站https://colorhub.me

在这里插入图片描述

  1. 按F12进入DevTools,然后点击Network->选取colorhub.me->点击Headers复制user-agent整行,如下:在这里插入图片描述
    在这里插入图片描述
    3、打开python的编辑器,把要用到的库导进去及刚刚网站要复制的写去
import requests
from lxml import etree



#爬取的网站链接
url = "https://colorhub.me" 
#头部伪装信息
header = {"user-agent":"Opera/9.80 (Windows NT 6.0) Presto/2.12.388 Version/12.14"}
req = requests.get(url,headers=header)

然后把爬取下来的html变为lxml类型

html = etree.HTML(req.text)#把爬取下来的html变为lxml类型

4、然后返回爬取的网站分析图片所在的位置

5、打开DevTools,然后按图步骤操作
在这里插入图片描述
6、当我们找到图片链接和图片标题位置时,用xpath来描述它们所在的位置(xpath教程这里不过多讲述,可以到https://www.w3school.com.cn/xpath/xpath_syntax.asp学习,

以下xpath讲述引用此(https://www.cnblogs.com/ruhai/p/10705719.html)博客

xpath常用函数
xpath的常用函数主要包含节点集函数,字符串函数,布尔函数,数字函数,网上的资料较多,在此就不再累述,可参考以下资料:

[a] XPath, XQuery, and XSLT Functions http://www.w3schools.com/xpath/xpath_functions.asp

[b] XPath Functions http://www.caucho.com/resin-3.0/xml/xpath-fun.xtp

[c] XPath Functions(MSDN) http://msdn2.microsoft.com/en-us/library/ms256138.aspx

常用定位语句实例

//NODE[not(@class)] 所有节点名为node,且不包含class属性的节点

//NODE[@class and @id] 所有节点名为node,且同时包含class属性和id属性的节点

//NODE[contains(text(),substring] 所有节点名为node,且其文本中包含substring的节点

//A[contains(text(),“下一页”)] 所有包含“下一页”字符串的超链接节点

//A[contains(@title,“文章标题”)] 所有其title属性中包含“文章标题”字符串的超链接节点

//NODE[@id=“myid”]/text() 节点名为node,且属性id为myid的节点的所有直接text子节点

BOOK[author/degree] 所有包含author节点同时该author节点至少含有一个的degree孩子节点的book节点

AUTHOR[.=“Matthew Bob”] 所有值为“Matthew Bob”的author节点

//*[count(BBB)=2] 所有包含两个BBB孩子节点的节点

//[count()=2] 所有包含两个孩子节点的节点

//*[name()=‘BBB’] 所有名字为BBB的节点,等同于//BBB

//*[starts-with(name(),‘B’)] 所有名字开头为字母B的节点

//*[contains(name(),‘C’)] 所有名字中包含字母C的节点

//*[string-length(name()) = 3] 名字长度为3个字母的节点

//CCC | //BBB 所有CCC节点或BBB节点

/child::AAA 等价于/AAA

//CCC/descendant:😗 所有以CCC为其祖先的节点

//DDD/parent:😗 DDD节点的所有父节点

//BBB[position() mod 2 = 0] 偶数位置的BBB节点

AUTHOR[not(last-name = “Bob”)] 所有不包含元素last-name的值为Bob的节点

P/text()[2] 当前上下文节点中的P节点的第二个文本节点

ancestor::BOOK[1] 离当前上下文节点最近的book祖先节点

//A[text()=“next”] 锚文本内容等于next的A节点

本实例的描述为:

#任意div下包含.card类的img节点的src属性
//div[contains(@class,"card")]//img/@src

//div[contains(@class,"card")]//img/@title

7、反回python编辑器先定义两个空数组,用来储存图片链接和图片标题,然后打印一下图片标题和链接,看看是否能提取成功

arr=[]#定义空数组,用来存储标题
arr2 = []#定义数组,用来存储图片链接
print('++++++++++++++++++++++++++++++++++')
arr2=html.xpath('//div[contains(@class,"card")]//img/@src')
arr = html.xpath('//div[contains(@class,"card")]//img/@title')
print(arr)
print(arr2)

在这里插入图片描述

8、然后我们用for来循环图片链接和标题,用标题当文件名,(注:因为网站的原因,我们爬取下来的图片链接并不完整,链接缺少“https:”,所以我们要用循环把每条图片链接补完整),把补完整的图片链接再次用requests库爬取的同时把图片链接变为二进制,然后循环写进文件

for i,j in zip(arr,arr2):#同时遍历两个数组
    jj = 'https:'+j#把图片链接补全
    with open(i+'.jpg','wb') as imgs:#用循环把图片写进图片文件
        jjs = requests.get(jj).content #再次用reqsts爬取图片链接的同时把图片变为二进制格式
        imgs.write(jjs)#把图片的二进制写入图片文件
    print(i+jj)
    print('\n')#提示每张图片下载状态
    print('@@@@@@@@@@@'+i+'图片已经下载成功@@@@@@@@@@@@')#
    print('\n')
print('\t\t##########全部图片下载成功############')  

9、到此结束,可运行代码验证。
在这里插入图片描述
10、以下是完整代码(带有注释)

import requests
from lxml import etree



url = "https://colorhub.me"#爬取的网站链接
header = {"user-agent":"Opera/9.80 (Windows NT 6.0) Presto/2.12.388 Version/12.14"}#头部伪装信息
req = requests.get(url,headers=header)

print(req.status_code)#打印响应码,显示是否成功连接
html = etree.HTML(req.text)#把爬取下来的html变为lxml类型

arr=[]#定义空数组,用来存储标题
arr2 = []#定义数组,用来存储图片链接
print('++++++++++++++++++++++++++++++++++')
arr2=html.xpath('//div[contains(@class,"card")]//img/@src')
arr = html.xpath('//div[contains(@class,"card")]//img/@title')
print(arr)
print(arr2)
for i,j in zip(arr,arr2):#同时遍历两个数组
    jj = 'https:'+j#把图片链接补全
    with open(i+'.jpg','wb') as imgs:#用循环把图片写进图片文件
        jjs = requests.get(jj).content #再次用reqsts爬取图片链接的同时把图片变为二进制格式
        imgs.write(jjs)#把图片的二进制写入图片文件
    print(i+jj)
    print('\n')#提示每张图片下载状态
    print('@@@@@@@@@@@'+i+'图片已经下载成功@@@@@@@@@@@@')#
    print('\n')
print('\t\t##########全部图片下载成功############')  

11、成功爬虫示例在这里插入图片描述
12、欢迎留言和指出错误

  • 13
    点赞
  • 73
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值