安装 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页