首页 > 其他分享 >使用xpath爬取对应百度贴吧下面的帖子图片

使用xpath爬取对应百度贴吧下面的帖子图片

时间:2022-12-28 17:38:21浏览次数:48  
标签:xpath __ self 爬取 start data page 百度


hello,小伙伴们,上次给大家分享了如何使用python的正则匹配爬取百思不得姐的网站代码,虽然说正则匹配爬取网站的执行效率高,但是正则匹配的规则编写着实是令人头痛的一件事。今天给大家分享一篇使用xpath来爬取百度贴吧里面的图片的文章,对比下上一篇的文章,我们就可以看出xpath的简单易用。


XPath,全称 XML Path Language,即 XML 路径语言,它是一门在 XML 文档中查找信息的语言。最初是用来搜寻 XML 文档的,但同样适用于 HTML 文档的搜索。所以在做爬虫时完全可以使用 XPath 做相应的信息抽取。


说到xPath的话,XPath Helper 这款强大的Chrome插件要和大家分享下。


xpath helper插件是一款免费的chrome爬虫网页解析工具。可以帮助用户解决在获取xpath路径时无法正常定位等问题。该插件主要能帮助你在各类网站上通过按shift键选择想要查看的页面元素来提取查询其代码,同时你还能对查询出来的代码进行编辑,而编辑出的结果将立即显示在旁边的结果框中。


xpath helper这款插件的安装是在谷歌的网上应用店里面搜索xpath helper,点击添加即可。当然是用谷歌浏览器的话需要科学上网才行,这个自行解决,若是不行的话可以在微信后台咨询我,我发给大家。具体演示如下图:


使用xpath爬取对应百度贴吧下面的帖子图片_xml


安装完成后就可以看到浏览器的右上角会有一个黑色的X图标。如图即代表安装成功。


使用xpath爬取对应百度贴吧下面的帖子图片_贴吧_02


这个安装成功以后,接下来让我们来步入今天的正文。打开百度贴吧地址:​​https://tieba.baidu.com,​​然后在搜索框输入想要搜索的贴吧内容,如‘海贼王’,可以看到链接栏的展示地址以及携带参数。如下:


使用xpath爬取对应百度贴吧下面的帖子图片_贴吧_03



然后我们点击第二页,第三页寻找链接上的规律,可以看到第二页时pn=50,第三页为pn=100,我们可以得知页面的参数步长为50,以此类推。如下图:


使用xpath爬取对应百度贴吧下面的帖子图片_贴吧_04

使用xpath爬取对应百度贴吧下面的帖子图片_搜索_05

综上所述我们发现我们所需要携带的参数有:kw即搜索的关键词,以及显示的内容是第几页的内容。


我们的目标是爬取对应贴吧下面的帖子里面的图片,接下来让我们运用xpath插件来定位页面的元素,找到每个贴子对应的网址,例如,我们搜索的是海贼王,那么我们应该提取关于海贼王贴吧下面每个贴子对应的网址,所以我们第一步目标是取出href里面的值如下图所示:


使用xpath爬取对应百度贴吧下面的帖子图片_xml_06


然后我们编辑相关的xpath路径取值,具体推演过程如下图所示:

使用xpath爬取对应百度贴吧下面的帖子图片_贴吧_07


最后我们使用如下代码,可以成功的取出每个帖子的相对路径。

#元素定位对应的规则
//div[@class="t_con cleafix"]/div/div/div/a/@href


然后让我们看下每个贴字里面的图片对应的元素,这个就相对简单了,我们直接定位到图片的属性,使用即可成功地取到每个图片的对应地址了。


使用xpath爬取对应百度贴吧下面的帖子图片_贴吧_08

#元素定位对应的规则
//img[@class="BDE_Image"]/@src


在前面分析了对应的xpath的语法,那么在代码中我们如何使用xpath呢,我们需要对应的lxml模块。安装代码:

pip install lxml

接下来就是展示我们代码的环节了,如下所示:

import requests
from lxml import etree
import time


class Tieba_spider(object):


def __init__(self,BaiduTie,start_page,end_page):
#请求地址
self.base_url = "http://tieba.baidu.com"
#模拟header头
self.headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko"}
#开始页
self.start = start_page
#结束页
self.end = end_page
#贴吧名称
self.name = BaiduTie
#第一层数据解析 找到贴吧的对应链接地址
self.first_xpath = '//div[@class="t_con cleafix"]/div/div/div/a/@href'
#第二层数据解析 找到对应网址下所有的图片
self.sec_xpath = '//img[@class="BDE_Image"]/@src'


#发送请求
def send_request(self,url,params={}):
time.sleep(1)
#如果发生异常 捕获异常 try: except Exception
try:
#携带参数和头部请求地址
response = requests.get(url,params=params,headers=self.headers)
#返回请求页面内容
return response.content
except Exception:
print("程序异常")


#写入文件
def write_file(self,data,page):
print(page)
filename = "TieBa" + page
#with open(**) as f 常见的读写操作:
with open(filename,"wb") as f:
#写入文件
f.write(data)


#解析数据
def analysis_data(self,data,xpathstr):
#转换成 lxml文档
html_data = etree.HTML(data)
#取出所有的指定标签内容
data_list = html_data.xpath(xpathstr)
return data_list


#开始调用
def start_work(self):
for page in range(self.start,self.end+1):
pn = (page - 1) * 50
params = {
"kw":self.name,
"pn":pn,
"fr":"search"
}
#发送第一次页面请求
first_data = self.send_request(self.base_url+'/f?',params)
#提取自连接 每一条单独的帖子
first_data_list = self.analysis_data(first_data,self.first_xpath)
#将每一条的数据请求
for link in first_data_list:
#拼接请求地址
link_url = self.base_url + link
#请求每个href里面的页面
second_data = self.send_request(link_url)
#二次解析 去取每个帖子里面的图片 地址 请求数据
second_list = self.analysis_data(second_data,self.sec_xpath)
#print(second_list)
for imgurl in second_list:
#请求每个图片的内容
img_data = self.send_request(imgurl)
#字符串切片 截取字符串末尾15个字符作为文件名
page = imgurl[-15:]
self.write_file(img_data,page)


if __name__ == "__main__":
BaiduTie = input("请输入贴吧名字:")
start_page = 1
end_page = 1
#实例化类
tool = Tieba_spider(BaiduTie,start_page,end_page)
#调度方法
tool.start_work()


## from lxml import etree 从lxml模块导入etree方法
## import requests 导入requests请求模块
## class Tieba_spider(object): 创建类对象
## def __init__(self,BaiduTie,start_page,end_page):
## 定义类的时候,若是添加__init__方法,那么在创建类的实例的时候,实例会自动调用这个方法


标签:xpath,__,self,爬取,start,data,page,百度
From: https://blog.51cto.com/u_15924937/5975823

相关文章

  • 利用python爬取百思不得姐demo实例
    作为一个刚接触爬虫的小白,在学习了一定的语法后,第一个目标就是找一个适合初学者的网站来小试牛刀。一般来讲都会选择一个难度系数比较低的网站来进行爬取,这样不仅有助于我们......
  • 利用bs4爬取传智的讲师团队信息
    终于五一了,好不容易迎来了小长假,首先在这里恭祝大家节日快乐,劳动人民最可爱,向劳动人民致敬,在这也祝愿大家的付出都能够得到回报。面对疫情后的复工复产,想必大家现在恨不得全......
  • 利用py爬取生日的那天哈勃望远镜拍到了什么?
    于1990年4月发射升空的哈勃太空望远镜迎来了升空30周年纪念。为此,美国宇航局(NASA)近日在其官网上发起一项活动——“哈勃望远镜在你生日那天看到了什么?”NASA邀请大家搜索自......
  • 爬虫之 xPath 用法总结整理
    在网络爬虫中,对于HTML的解析,XPath是一种常用的方法。XPath最初是用于XML中,其主要使用路径表达式在XML文档中进行导航。用于HTML中主要是因为HTML和XML非常的相似:它们具有......
  • Python爬取意林杂志所有期刊文章
    可能很多人对这个意林杂志比较陌生,但是对于小编来说,那可是满满的回忆。记得我们上中学那时候读过的意林,那可是一本接着一本,其中有很多令人感动的故事,一直被温暖,被治愈。接下......
  • python爬取公众号链接里面的图片
    话不多说,步入今天文章的分享内容,今天给大家带来的是~~爬取微信公众号文章里面的图片。爬虫代码:#coding:utf-8#__auth__="maiz"#__date__="2021/3/27"importosimport......
  • Python中使用xpath一键获取各国国旗
    国旗是一个国家的主权意识不断增强后必然的产物,国旗是国家的一种标志性旗帜,是国家的象征。代表着一个国家的主权和民族的尊严。每个国家的国旗都由特有的颜色和图案构成,这些......
  • py爬取当当网前500畅销书,送给书荒的你
    最近和朋友聊天,讨论到读书的问题,说是读书到底有什么用?我半开玩笑的给他讲了一个故事。男孩将女孩送到宿舍楼下,看着一路上两人始终保持着的那一步的距离,男孩终于鼓起勇气,说道......
  • 使用py爬取复产后的鹅厂都在招聘哪些职位
    hello呀,各位小伙伴,今天是五月的第二天,不知道大家是在家里wifi,空调,西瓜呢,还是在拥挤的景区看着人山人海!反正小编是穿着大裤衩,坐在马路边的沙滩上,啜一口摆在身边的饮料,享受......
  • 使用python爬取B站视频
    B站之所以火,是因为趣味与知识并存。正如一句“你在B站看番,我在B站学习”,B站还是有一些质量比较好的学习视频。当你在B站上看到喜欢的视频想保存下来时,怎么办呢?我相信很多逛B......