用python的xpath和requests库爬取图片超详细实例(每一步都有注释)
本实例用于学习和研究,禁止非法用途,一切后果自负,若有侵权请联系:2877929996@qq.com。
版权声明:本文为博主原创文章,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_43406819/article/details/102889083
本实例用到的python库有
requests | xpath |
---|---|
1.第一步进入我们要爬取的网站https://colorhub.me
- 按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、欢迎留言和指出错误