当前位置 : 主页 > 编程语言 > python >

【爬虫高阶】使用xpath语法获取任意关键词的百度搜索结果

来源:互联网 收集:自由互联 发布时间:2022-07-13
xpath爬取百度搜索结果 ​​1. 需求背景​​ ​​2. xpath语法​​ ​​3. 实战操作​​ ​​3.1 分析页面信息​​ ​​3.2 共用代码​​ ​​3.3 手动输入Xpath语法​​ ​​3.4 手动copy Xp


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 分析页面信息

打开相应的界面,如下

【爬虫高阶】使用xpath语法获取任意关键词的百度搜索结果_xpath


注意,这里的搜索内容存在不同的标签中(标签为​​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语法获取任意关键词的百度搜索结果_网络爬虫_02


代码如下,可以发现每次复制的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这个搜索的关键词不见了,核实一下标签信息,发现这个关键词是在单独的标签中,如下,如果只通过 绝对路径获取文本数据,只能获取上面输出的结果,不能获取全部的标题数据

【爬虫高阶】使用xpath语法获取任意关键词的百度搜索结果_百度搜索_03


最后完善的全部代码如下,注意​​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还是有点无脑,快捷,但是基本的语法还是要多写一写,不然时间久了就手生)

【爬虫高阶】使用xpath语法获取任意关键词的百度搜索结果_copy_04

网友评论