xpath爬虫顺序(以找一些简单的数据为例)
导入模块request(请求),lxml(解析)
导入模块: pip install 模块名字, 网速慢用清华源
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple some-package 模块名
import requests
from lxml import etree
确定目标网址,以及需要的数据是否在网页源代码里
网页右键查看网页源代码,C+f 查找数据是否在网页源代码中确认后就可以开始准备入手请求了
设置url,以及请求头headers(一般的网页就够了,不行就加上cookie)
url = 'https://cs.lianjia.com/ershoufang/'
head_data = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36 Edg/108.0.1462.76'}
html = requests.get(url, headers = head_data)
代码部分
import requests
from lxml import etree
url = 'https://cs.lianjia.com/ershoufang/'
head_data = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36 Edg/108.0.1462.76'}
html = requests.get(url, headers = head_data)
#第七行写完的时候我们首先要确认我们是否获取到数据可以用print(html.text)确定
html = etree.HTML(html.text)#树形分析文档
#接下来就是找数据
title = html.xpath('//div[@class="info clear"]/div[1]/a/text()')
#以11行为例 变量 = html.xpath 注意这里的xpath要手打,点的话后面可能点不出来的
('//div[@class="info clear"]/div[1]/a/text()')以这一行为例
//div[@class="info clear"中“//”意思是不管之前有多少条,我要从“//”后面的一个div里有class="info clear"的开始。
首先要确定的是,代码中是否是唯一的class="info clear",如果不唯一就会获取多条class="info clear"里的数据,这个唯一是指同类型数据唯一类而不是同文本唯一,接下来找到这个class="info clear"后“/”代表继续往下找(子目录)里面的 div[1],也就是第一个div,然后是a标签,到这里就找到最后了假设我们需要a标签里的文本数据,就可以用/text()代表要获取文本数据。
现在我们拿到了这个网页中所有的class="info clear"中第一个div里的a标签里的文本数据,可以根据网页来确定一下数量,我们print(title)和print(len(title)),看看数据是否正确以及完整数量够。确定没问题了我们在进行下一步,每完成一步,都要检查数据,这样报错的话处理会方便一点,等都写完了报错很难第一时间知道问题在哪里。
获取数据后,可以整理数据,然后以我们想要的方式保存数据,我们可以以文件的方式保存或者存放到数据库。以上就是xpath的基础用法。
附:
/ 从根节点触发 绝对路径
// 当前节点选择文档中的节点 相对路径
@ 选取属性。
| 或者 可以同时满足多个路径
text() 获取元素内容
//title[@lang] 获取title里面有lang属性的元素
未知元素 * //*[@rel] 获取元素里面有rel属性的元素 不会受到标签的限制
提示:如果不想自己写xpath路径可以右键直接复制xpath路径,但是有时候不一定能获取数据,最好还是要学会自己看HTML结构,找到自己需要的数据位置。
附上完整的代码
import requests
from lxml import etree
l1 = ['https://xxxxxxxxx.com/']
l2 = [f'https://xxxxxxxxx.com/pg{i}/' for i in range (2, 6)]
#获取前五页数据
l3 = l1 + l2
f = open("xx.text", "w", encoding="utf-8")
for url in l3:
head_data = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36 Edg/108.0.1462.76'
}
html = requests.get(url, headers = head_data)
# #请求网页
html = etree.HTML(html.text)
title = html.xpath('//div[@class="info clear"]/div[1]/a/text()')
href = html.xpath('//div[@class="flood"]/div[1]/a[1]/text()')
href1 = html.xpath('//div[@class="flood"]/div[1]/a[2]/text()')
href2 = zip(href, href1)
pic = html.xpath('//div[@class="info clear"]/div[6]/div[1]//span/text()')
pic1 = html.xpath('//div[@class="info clear"]/div[6]/div[2]//span/text()')
for title, href2, pic, pic1 in zip(title, href2, pic, pic1):
f.write(' | '.join([title, '- '.join(href2).replace(' ', ''), pic + "万", pic1]) + "\n")
print(title, href2, pic, pic1)
f.close()
注:zip的用法可以参考菜鸟教程Python zip()函数,
3.尾声
希望分享能帮助到别人,如果我有写错或者不全面欢迎各路大神来纠正我一下(抱拳),特别鸣谢耐心的苯环老师和星星班主任