xpath爬取百度搜索结果
- 1. 需求背景
- 2. xpath语法
- 3. 实战操作
- 3.1 分析页面信息
- 3.2 共用代码
- 3.3 手动输入Xpath语法
- 3.4 手动copy Xpath语法
- 4. 全部代码
1. 需求背景
纯粹是为了练习一下手动copy Xpath语法和手写输入Xpath语法之间的对比,前期准备,需要安装lxml和requests库
pip install requests lxml
2. xpath语法
简单的三个小点:
// 相对路径
/ 绝对路径
@ 选择属性
实用的五个方法,如下
序号
举例
应用
① contains()
//div[contains(@id,‘in’)]
选择标签的时候常用
② text()
//a[text()=‘baidu’]
直接获取文本
③ starts-with()
//div[starts-with(@id,‘in’)]
选择开始的标识
④ not()
//input[not(contains(@class,‘a’)]
选择剔除的标识
⑤ last()
//span/a/span[last()]
选择最后一项,selenium中选择翻页最后一个按钮
3. 实战操作
还是以‘python’作为搜索的关键词,进行有关信息的爬取
3.1 分析页面信息
打开相应的界面,如下
注意,这里的搜索内容存在不同的标签中(标签为result c-container 和标签为result-op c-container xpath-log),因此在选择的时候就可以用到实用方法①的内容
3.2 共用代码
使用xpath语法获取之前需要将网页信息转化为可以选取的内容,那么这一部分对于手动copy Xpath语法或者手动输入Xpath语法都是一样的过程,因此是可以共用的
import requests
from lxml import etree
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36',
'Cookie': 'BIDUPSID=82508FD9E8C7F366210EB75A638DF308; PSTM=1567074841; BD_UPN=12314753; BAIDUID=0F2472E83269C89F55EFE0E6B0FEF5A9:FG=1; H_WISE_SIDS=142058_142112_132921_139203_142081_141124_143647_143855_142505_142018_141748_143424_142511_139176_141901_142779_131862_131246_142910_137745_138165_138883_141942_127969_140066_142905_140593_134047_143059_141807_140351_143470_143275_141930_131423_107312_140986_138596_139884_143477_140913_143549_141102_110085; BDUSS=FFQmx0SVFlVjJqdHBIc0tkRTZUOVJKfmotMnY5dU1WYUpPfjhoUTZnU2Qzd0pmRVFBQUFBJCQAAAAAAAAAAAEAAABQontKTWlzc2Fst-gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJ1S216dUtteTz; MCITY=-%3A; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; ispeed_lsm=2; H_PS_645EC=cf552cnaA948r4Z3SxcPHhp5RSadAH1Ub95%2BXYc%2FnEzqueJzigDPiyFKU%2BGrNsTbM2UI; BD_HOME=1; H_PS_PSSID=31624_1442_31325_21087_31253_32045_31715_30823_22158; sug=3; sugstore=1; ORIGIN=0; bdime=0'
}
url = 'http://www.baidu.com/s?wd=python&rsv_spt=1&rsv_iqid=0xeed810a9001e6895&issp=1&f=3&rsv_bp=1&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_enter=0&rsv_dl=ts_1&rsv_btype=t&rsv_t=57c5siBk05bcHb4BPjbcKLMdz3LBQHqZaqvo%2BNf%2FlbX84n%2BS5jxTw%2B4bNPeM2dkOdpGd&oq=python&rsv_pq=a3612735003f993f&prefixsug=python&rsp=1&rsv_sug9=es_0_1&rsv_sug=9'
html = requests.get(url, headers = headers)
soup = etree.HTML(html.text)
3.3 手动输入Xpath语法
代码如下,首先是要定位一个父标签,然后选择含有‘result’的子标签,最后所获取的内容就是在这里面了
titles = soup.xpath("//div[@id='content_left']/div[contains(@class,'result')]")
for i in titles:
title = i.xpath('h3/a/text()') #这里h3之前不能添加下划线
print(''.join(title).strip())
→ 输出的结果为:
Welcome to .org官方
基础教程 | 菜鸟教程
(计算机程序设计语言)_百度百科
5年 功力,总结了 10 个开发技巧
教程 - 廖雪峰的官方网站
环境搭建 | 菜鸟教程
你都用 来做什么? - 知乎
基础教程,入门教程(非常详细)
3 * 和 ** 运算符__极客点儿-CSDN博客
_视频大全_高清在线观看
3.4 手动copy Xpath语法
这种方式还是简单无脑,直接动动鼠标右键然后数数就可以完成xpath语法的输入,最终获得想要的数据,获取方式如下,这里直接把之前爬取淘宝时候的示例图拿过来了
代码如下,可以发现每次复制的Xpath 都是以‘id’为属性的,因此修改‘id’对应的值就可以获取想要的目标数据,最后也就是遍历该页面的数据量即可
for i in range(1,11):
titles = soup.xpath(f'//*[@id="{i}"]/h3/a/text()')
print(''.join(titles).strip())
→ 输出的结果为:
Welcome to .org官方
基础教程 | 菜鸟教程
(计算机程序设计语言)_百度百科
5年 功力,总结了 10 个开发技巧
环境搭建 | 菜鸟教程
教程 - 廖雪峰的官方网站
你都用 来做什么? - 知乎
基础教程,入门教程(非常详细)
3 * 和 ** 运算符__极客点儿-CSDN博客
_视频大全_高清在线观看
4. 全部代码
通过上面两个结果的输出,仔细查看会发现python/Python这个搜索的关键词不见了,核实一下标签信息,发现这个关键词是在单独的标签中,如下,如果只通过 绝对路径获取文本数据,只能获取上面输出的结果,不能获取全部的标题数据
最后完善的全部代码如下,注意a标签后面是有两个反斜杠的(// 相对路径)
import requests
from lxml import etree
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36',
'Cookie': 'BIDUPSID=82508FD9E8C7F366210EB75A638DF308; PSTM=1567074841; BD_UPN=12314753; BAIDUID=0F2472E83269C89F55EFE0E6B0FEF5A9:FG=1; H_WISE_SIDS=142058_142112_132921_139203_142081_141124_143647_143855_142505_142018_141748_143424_142511_139176_141901_142779_131862_131246_142910_137745_138165_138883_141942_127969_140066_142905_140593_134047_143059_141807_140351_143470_143275_141930_131423_107312_140986_138596_139884_143477_140913_143549_141102_110085; BDUSS=FFQmx0SVFlVjJqdHBIc0tkRTZUOVJKfmotMnY5dU1WYUpPfjhoUTZnU2Qzd0pmRVFBQUFBJCQAAAAAAAAAAAEAAABQontKTWlzc2Fst-gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJ1S216dUtteTz; MCITY=-%3A; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; ispeed_lsm=2; H_PS_645EC=cf552cnaA948r4Z3SxcPHhp5RSadAH1Ub95%2BXYc%2FnEzqueJzigDPiyFKU%2BGrNsTbM2UI; BD_HOME=1; H_PS_PSSID=31624_1442_31325_21087_31253_32045_31715_30823_22158; sug=3; sugstore=1; ORIGIN=0; bdime=0'
}
url = 'http://www.baidu.com/s?wd=python&rsv_spt=1&rsv_iqid=0xeed810a9001e6895&issp=1&f=3&rsv_bp=1&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_enter=0&rsv_dl=ts_1&rsv_btype=t&rsv_t=57c5siBk05bcHb4BPjbcKLMdz3LBQHqZaqvo%2BNf%2FlbX84n%2BS5jxTw%2B4bNPeM2dkOdpGd&oq=python&rsv_pq=a3612735003f993f&prefixsug=python&rsp=1&rsv_sug9=es_0_1&rsv_sug=9'
html = requests.get(url, headers = headers)
soup = etree.HTML(html.text)
#手写Xpath语法
titles = soup.xpath("//div[@id='content_left']/div[contains(@class,'result')]")
for i in titles:
title = i.xpath('h3/a//text()') #这里第一个下划线都不能添加
print(''.join(title).strip())
#这种是手写xpath语法,还有复制粘贴的方式
#手动copy Xpath语法
for i in range(1,11):
titles = soup.xpath(f'//*[@id="{i}"]/h3/a//text()')
print(''.join(titles).strip())
#这种是直接复制粘贴的,要想获得全部的数据,就需要使用新相对路径
→ 输出的结果为:(总结一下:这两种方式直接copy还是有点无脑,快捷,但是基本的语法还是要多写一写,不然时间久了就手生)