谈谈爬虫中定位元素的常见方法

前言

我们知道,不管是爬虫还是自动化测试,元素定位是最基本而且必须的一个步骤。今天我们就来讲讲怎么定位元素。

爬虫中定位元素

爬虫中怎么定位元素呢?常见的有以下几种:

  • BeautifulSoup find 定位

  • BeautifulSoup css 定位

BeautifulSoup 是一个可以从 HTML 或 XML 文件中提取数据的 Python 库,我们需要安装并导入这个库。

from bs4 import BeautifulSoup

我们再把我们提取的 html 数据转换成 lxml 格式,方便 BeautifulSoup 库直接提取信息。

import requests
html = requests.get('ttps://www.pyzhishiquan.com/crawler')
soup = BeautifulSoup(html, "lxml")

BeautifulSoup find查找元素

接下来我们就可以用 find 方法来查找元素了,比如查看所有 a 标签元素。

soup.find_all('a')

BeautifulSoup css 选择器定位元素

BeautifulSoup 中我们也可以通过 css 选择器查找定位元素,导包和格式转换和上面一样,格式如下。

soup.select('xxx')

select 方法中的字符串参数怎么获取呢,以 Chrome 浏览器为例,F12 检查元素中右键复制 seletor 就可以了。

640?wx_fmt=jpeg

640?wx_fmt=png

640?wx_fmt=png

当然,在源代码中无法获取的元素的 Ajax 动态加载的页面,上面的定位方法就不管用了,我们可以通过分析 Network 中的请求,找到你需要提取的信息的规律,这个内容本文不做讲解。还有一种方法是通过 selenium 库来解决,selenium 库是模拟人工操作浏览器的,优点可见即可爬,就是只要他能看到的都能获取信息爬取下来。

selenium 定位

selenium 库定位元素有方法很多,今天分享下常见的的定位方法。

我们首先需要导入 selenium 库,通过 webdriver 启动 Chrome 浏览器。

from selenium import webdriver
driver = webdriver.Chrome()

ID 定位

ID 一般在页面元素中是唯一的,可以准确定位页面元素。

driver.find_element_by_id('id')

有些页面元素的 id 是每次刷新页面都不一样的,比如 163 邮箱的用户名输入框 id,每次刷新页面,这个 id 都会变。所以,对于这种每次不一样的 id,我们都不能用 id 来定位了。

640?wx_fmt=jpeg

这种随机 id 的元素我们就通过其他属性来定位或者通过父元素来找到子元素。

classname 定位

如果 classname 是唯一的话,我们就可以通过 classname 来定位元素。

driver.find_element_by_id('classname')

Xpath 定位

Xpath 路径获取方法第一个方法和刚才获取 selector 信息一样,直接 copy。

640?wx_fmt=jpeg

第二个方法可以借助插件,Chrome 浏览器上的 Xpath Helper 插件和火狐插件 firepath,以 Xpath Helper 为例,打开后按住 Shift 键,移动到想定位的元素,左边就会显示 Xpath 路径。

640?wx_fmt=jpeg

这种方法缺点也很明显,XPath 都是从根路径开始的,导致 XPath 过长,不利于维护。

双属性定位

对于一个属性不是唯一的,我们可以用 Xpath 的双属性来定位元素,这个方法对于定位网页和 APP 都适用。

640?wx_fmt=jpeg

上图是网易云 APP,我想定位签到按钮,我可以通过 class 属性和 text 属性同时定位元素。

driver.find_element_by_xpath('//*[@class="android.widget.TextView" and @text="签到"]')

这种方法适用于很多元素共用同一个属性的情况,经过我们的组合,就把元素唯一化了。

网页元素同样也可以用双元素来定位,方法是一样的。

以上是 pk 哥平时常用的定位元素的方法,如有其他好的定位方法,欢迎大家留言讨论,共同进步。

640

 精彩推荐 

精选好文:

python爬虫人工智能大数据公众号

640?wx_fmt=gif

  • 4
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值