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


手动反爬虫: 原博地址

 知识梳理不易,请尊重劳动成果,文章仅发布在CSDN网站上,在其他网站看到该博文均属于未经作者授权的恶意爬取信息

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还是有点无脑,快捷,但是基本的语法还是要多写一写,不然时间久了就手生)
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/lys_828/article/details/106740191
今日推荐