安装 cmd 里 pip install lxml 导入 from lxml import etree 作者学爬虫的课:https://www.bilibili.com/video/av33963847,不是广告,老师讲的特别好 ''' 再x-path中,有3种主要类型的节点:元素,属性,文本 常用的路径表达式: //:不考虑位置的查找 ./:从当前节点开始往下查找 ..:从当前节点的父节点查找 @:选取属性 示例: /bookstore/book 选取根节点bookstore子节点book //book 选取所有book /bookstore//book 选取bookstore下面所有的book /bookstore/book[1] 选取bookstore第一个book /bookstore/book[last()] 倒数第一个 /bookstore/book[last()-1] 倒数第二个 /bookstore/book[position()<3] 前2个book //title[@lang] 选取所有带有lang属性的title //title[@lang='eng'] 选取所有带有lang属性值为eng的title * 任何元素节点 /bookstore/* 选取节点bookstore所有子节点 //* 选取文档中的所有元素 //title[@*] 选取所有带有属性的title元素 安装xpath插件 下载解压 打开快捷键ctrl + shift + x 属性定位://input[@id="kw"] //input[@class="bg s_btn"]class有多少写多少 层级定位://div[@id='ftCon']/div[1]//a[@id='setf'] 逻辑运算定位(and)://input[@id="kw" and @name="wd"] 模糊匹配:contains://input[contains(@class,"s_t"] starts-with://input[starts-with(@class,"s_t"] 取文本text()方法:1//p[@id='lh']/a[4]/text() 获取节点内容 2 //p[@id='lh']//text() 不戴标签的所有内容 3 string显示的是连起来的字符串内容,但是string是一个对象,但是可以用字符串方法 string = ret[0].xpath('string(.)') print(string.replace('\n','').replace('\t','')) #拼接 取属性://p[@id='lh']/a[4]/@href 找a下的href属性 [@class="box picblock col3 masonry-brick"]/div/a/img/@src img里的href属性 xpath插件使用时1开始,代码中是0开始 ''' #使用:将html文档变成一个对象,然后调用对象的方法取查找指定的节点 from lxml import etree #本地文件 tree = html.etree.parse(文件名) tree = etree.parse('阜阳师范学院_1.html') ret = tree.xpath('//div[class="search_top clearfix"]/div/a[2]/@href') #ret是一个列表 print(ret) #string显示的是连起来的字符串内容,但是string是一个对象,但是可以用字符串方法 string = ret[0].xpath('string(.)') print(string.replace('\n','').replace('\t','')) #网络文件tree = etree.HTML(网页字符串) # tree = etree.HTML()
chrome里拓展程序把xpath安装包放入即可
安装包:链接:https://pan.baidu.com/s/1T2tp77SJceb-AIWCY2cjOw
提取码:0vsn
实例:爬取http://sc.chinaz.com/图片
import urllib.request import urllib.parse from lxml import etree import os import time def handle_request(url,page): headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3970.5 Safari/537.36" } #由于第一页和后面的页码规律不一样,所以进行判断 if page == 1: url = url.format('') else : url = url.format('_' + str(page)) request = urllib.request.Request(url=url,headers=headers) return request def download_image(image_src): dirpath = 'xuejing' if not os.path.exists(dirpath): os.mkdir(dirpath) #搞个文件名 filename = os.path.basename(image_src) #图片路径,用os.path.join拼接一下 filepath = os.path.join(dirpath,filename) #发送请求,保存图片 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3970.5 Safari/537.36" } request = urllib.request.Request(url=image_src,headers=headers) response = urllib.request.urlopen(request) with open(filepath,'wb') as f: f.write(response.read()) def parse_content(content): tree = etree.HTML(content) #第一页://div[@id="container"]/div/div/a/img/@src #懒加载技术:用到的时候在加载,滑动的时候再加载 image_list = tree.xpath('//div[@id="container"]/div/div/a/img/@src2') #下载图片,遍历列表 for image_src in image_list: download_image(image_src) def main(): start = int(input("请输入起始页码:")) end = int(input("请输入结束页码:")) url = 'http://sc.chinaz.com/tupian/bingxueshijie{}.html' for page in range(start,end+1): request= handle_request(url,page) content = urllib.request.urlopen(request).read().decode() parse_content(content) time.sleep(2) if __name__ == '__main__': main()
我是爬取了一到3页