1、xpath表达式(层级)
2、Xpath解析数据基本步骤
1)将本地的html文档中的源码数据加载到etree对象中
etree.parse(filepath)
2)将互联网上获取的源码数据加载到该对象中
etree.Html('pagetext')
--需求:爬取彼岸图网的任意图片,我选择爬取的美食图片
--url http://pic.netbian.com/4kmeishi/
1、第一步:我们还是老步骤,我们需要先获取到页面源码数据,也就是根据requests的方法获取,对了不要忘记进行UA伪装哦!
import requests
url = 'http://pic.netbian.com/4kmeishi/'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36'}
response = requests.get(url=url, headers=headers)
page_text=response.text
2、第二步就是我们上面基础步骤中的实例etree对象,那么首先我们需要导入库,然后再根据上面我们介绍的方法进行实例化对象,下面是具体的代码~
from lxml import etree
tree = etree.HTML(page_text)
3、第三步就是重头戏了,我们要进行xpath定位图片了,打入敌人内部,小F12安排上,我们看下面的截图,很容易发现,我们的目标是解析到class=slist下面的ul下面的li标签下面的src属性,再拼接上url就可以获取到图片了,那么图片我们需要进行存储,这里就用alt属性进行图片命名吧,下面我们再进一步分析
首先我们要做一个局部解析,也就是先定位到li标签,再循环这个li-list,获取到当前页面所有的src,src是第一个属性值所以[0]定位,在进行拼接,也就是这样
# 解析src的属性值、图片命名,url拼接,解析alt属性值
li_list = tree.xpath('//div[@class="slist"]/ul/li')
for li in li_list:
# 对第一个做局部解析
image_src = 'http://pic.netbian.com/' + li.xpath('./a/img/@src')[0]
然后我们来对图片进行命名,命名是中文的,而且我们遇到了中文乱码,后面具体再说爬虫遇到中文乱码的解决办法吧,先按照我们的步骤往下走
image_name = li.xpath('./a/img/@alt')[0] + '.jpg'
下一步就是获取图片的二进制数据,进行持久化存储了,这里是我们的老朋友了,就不多说了,直接上部分代码,后面我再贴个完整的代码哈
image_data=requests.get(url=image_src,headers=headers).content
image_path='picLibs/'+image_name
with open(image_path,'wb') as fp:
fp.write(image_data)
print(image_name,"下载成功")
fp.close()
最后呢,我们存储数据,发现图片的命名真的乱码了,但是用波波老师的方法并没有解决我的中文乱码问题,而是用另一个同学的办法解决的,下面部分说下解决办法
1、获取响应数据,设置响应数据的encoding
# 解决乱码
response.encoding=response.apparent_encoding
page_text=response.text
if __name__ == '__main__':
url = 'http://pic.netbian.com/4kmeishi/'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36'}
response = requests.get(url=url, headers=headers)
# 获取响应对象
# 解决乱码
response.encoding=response.apparent_encoding
page_text=response.text
# 数据解析
tree = etree.HTML(page_text)
# 解析src的属性值、图片命名,url拼接,解析alt属性值
li_list = tree.xpath('//div[@class="slist"]/ul/li')
if not os.path.exists('./picLibs'):
os.mkdir('./picLibs')
for li in li_list:
# 对第一个做局部解析
image_src = 'http://pic.netbian.com/' + li.xpath('./a/img/@src')[0]
image_name = li.xpath('./a/img/@alt')[0] + '.jpg'
image_name = image_name.encode("utf-8").decode("utf-8")
# print(image_name, image_src)
image_data=requests.get(url=image_src,headers=headers).content
image_path='picLibs/'+image_name
with open(image_path,'wb') as fp:
fp.write(image_data)
print(image_name,"下载成功")
fp.close()