admin 管理员组

文章数量: 887021

通过lxml模块xpath语法爬取某壁纸链接

#导入requests模块
import requests
#导入etree
from lxml import etree

class meinv(object):
    #初始化函数
    def __init__(self):
    	#设置url
        self.url="https://picbian/4kmeinv/index.html"
        #设置请求头
        self.headers={
            'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'
        }
        
   	#请求函数
    def get_data(self,url):
    
    	#返回网页的源码,字符串格式赋值给respose
        response = requests.get(url, headers=self.headers)
        return response.content
        
    #此函数功能主要是通过xpath语法搜索需要的数据
    def parse_list_page(self, data):
    
    	#将requests请求后返回的网页字符串源码通过etree函数转换成一个element对象html
        html = etree.HTML(data)
        
        #通过xpath语法在element对象html中筛选出需要的img标签并返回一个列表,列表的内容是找出的img标签的element形式
        mn_list=html.xpath('//ul[@class="clearfix"]/li/a/img')
        data_list=[]
        
        #for循环将列表中所有element形式的img标签,通过xpath语法从img标签中筛选出需要的数据
        for mn in mn_list:
            temp={}
            
            #xpath语法查找完后返回的是一个列表,所以要通过下标取数据
            #为什么此处xpath返回的不是element对象而直接是想要的数据了,通过@符号直接返回参数中的数据了
            temp['title']=mn.xpath('./@alt')[0]
            print(temp['title'])
            temp['src']='https://picbian'+mn.xpath('./@src')[0]
            print(temp['src'])
            
            #将筛选出来的数据添加进列表data_list
            data_list.append(temp)

        try:
        		#此处xpath也是,直接通过@返回参数中的数据了
        		#查找当前页面的下一页网址
            next_url='https://picbian/' + html.xpath('//a[contains(text(),"下一页")]/@href')[0]
            print(next_url)
        except:
        	#当最后一页时,给一个None
            next_url=None
            print(next_url)
            
		#将当页筛选出的数据,和下一页的网址返回
        return data_list,next_url

    def run(self):
    
    	#将初始url赋值给next_url
        next_url = self.url
		
		#循环请求网页并筛选出数据
        while True:
        	#请求网页返回数据
            list_page_data=self.get_data(next_url)
            
         	#筛选出需要的数据和下一页的url并返回,将当前页中的下一页的url重新赋值给next_url,使得每次循环,next_url中都是当前页面的下一页的url
            data_list, next_url=self.parse_list_page(list_page_data)

			#当最后一页时结束循环
            if next_url == None:
                break
if __name__ == '__main__':
    meinv1=meinv()
    meinv1.run()

本文标签: 爬虫 模块 lxml