show | version | enable_checker |
---|---|---|
step |
1.0 |
true |
- 上次深入了 xpath 中的元素选择
- 可以根据元素层级关系选择
- 也可以根据元素位置选择
- 还可以根据属性具体值选择
- 而且可以根据文本的值进行选择
- 甚至开始使用通配符
- 我们来爬取一个真正的网站吧
- 比如 oeasy.org
- 怎么弄呢?🤔
git clone http://gitee.com/overmind1980/oeasyorg.git
sudo cp -r oeasyorg /usr/share/nginx/html/
sudo service nginx start
firefox http://localhost/oeasyorg/index.html &
- 在浏览器里面 能打开
- 并且 观察到编码格式是
utf-8
- 并且 观察到编码格式是
- 目标是
- 把 红框里面的 菜单
- 扒 下来
- 右键"爱情"
- 检查元素
- 右键a元素
- 复制 xpath
- 得到
- /html/body/header/nav/ul/li[1]/a
- 但是
- 通用的xpath
- 应该
怎么
写呢?
- 爱情的xpath是
- /html/body/header/nav/ul/li[1]/a
- 电路的xpath是
- /html/body/header/nav/ul/li[2]/a
- 综合可以 得到整体的xpath 是
- /html/body/header/nav/ul/li/a
- 含义是
- 根下的html下的
- body下的
- header下的
- nav下的
- ul下的
- li下的
- a
- 如果
- 蓝桥中没有外网
- 下面步骤
- 在 本地 火狐中完成体验
- 点击插件和主题
- 搜索xpath
- 安装插件
- 点击启动插件
- 在expression中
- 粘贴xpath
- 点击 Excute 执行
- 所有的菜单
/html/body/header/nav/ul/li/a
-
可以选中多个标签
-
前三条菜单
/html/body/header/nav/ul/li[position()<=3]/a
- 倒数两条菜单
/html/body/header/nav/ul/li[position()>=last()-1]/a
- 可以确定xpath
- 并写代码了
vi o.py
- 编辑o.py
import requests
from lxml import etree
response = requests.get("http://localhost/oeasyorg/index.html")
b_html = response.content
et_html = etree.HTML(b_html)
et_targets = et_html.xpath("/html/body/header/nav/ul/li/a")
for anchor in et_targets:
print(anchor.text)
- 运行结果
-
运行成功
-
如果我想把链接地址拿到
- 应该怎么办?
- 去源头
- 找官网帮助
- 找到 etree 节点之后
- 找到他的 attrib 成员
- attrib 类型是 dict 字典
- 然后找到["href"]这个key的value(值)
import requests
from lxml import etree
response = requests.get("http://localhost/oeasyorg/index.html")
b_html = response.content
et_html = etree.HTML(b_html)
et_targets = et_html.xpath("/html/body/header/nav/ul/li/a")
for anchor in et_targets:
print(anchor.text)
attributes = anchor.attrib
print(attributes["href"])
- 运行结果
- 输出结果
- 只需要链接
import requests
from lxml import etree
response = requests.get("http://localhost/oeasyorg/index.html")
b_html = response.content
et_html = etree.HTML(b_html)
et_targets = et_html.xpath("/html/body/header/nav/ul/li/a")
for anchor in et_targets:
attributes = anchor.attrib
print(attributes["href"])
- 输出链接
- 代码没有变
- 输出重定向到
urls.txt
- 目前存储的是
- 相对链接
- 没法进一步爬取
- 需要 转化为
- 绝对链接
- 链接字符串
- 拼接
import requests
from lxml import etree
response = requests.get("http://localhost/oeasyorg/index.html")
b_html = response.content
et_html = etree.HTML(b_html)
et_targets = et_html.xpath("/html/body/header/nav/ul/li/a")
for anchor in et_targets:
attributes = anchor.attrib
link = attributes["href"]
link = link.replace("./","")
link = "http://localhost/oeasyorg/" + link
print(link)
- 输出结果
- 重定向到urls.txt
:w|!python3 > urls.txt
- 打开urls.txt 如下图所示
- 这次真的爬了一个网站
- oeasy.org
- 想要得到 菜单上的所有链接
- 获取 xpath
- 右键检查元素
- 爬取之后
- 获得属性 href 的值
- 然后切片并拼接为绝对链接地址
- 并且存储到了 urls.txt 中
- 能进入 这些得到的链接
- 再去 深入爬取 吗?🤔
- 下次再说