【Xpath】、【使用xpath解析方式爬取QZZN论坛中的帖子标题及url】

一、数据解析常用的三种方式——②Xpath
1.调用时

from lxml import etree

2.转解析类型时

xpath_data = etree.HTML(data)#将html文档或者xml文档转换成一个etree对象,然后调用对象中的方法查找指定的节点

3.xpath返回的数据类型是list,xpath的基本语法

#xpath 语法1.节点: /  2.跨节点:  //  3.精确的标签: //a[@属性=“属性值”] 4.标签包裹的内容:text()  5.属性:@href

4.示例代码:

#安装支持 解析 html 和xml的解析库  lxml
#pip  install lxml;xpath是一个语法,不是解析库
import requests
import re
from lxml import etree

headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1'
}
url = 'http://news.baidu.com/'
data = requests.get(url,headers=headers).content.decode()
#print(data)
#1.转解析类型
xpath_data = etree.HTML(data)#将html文档或者xml文档转换成一个etree对象,然后调用对象中的方法查找指定的节点
#xpath 语法1.节点: /  2.跨节点:  //  3.精确的标签: //a[@属性=“属性值”] 4.标签包裹的内容:text()  5.属性:@href
#xpath返回的类型是list

#2.调用xpath的方法
# result = xpath_data.xpath('/html/head/title/text()')#'/'为根节点,不方便;输出:百度新闻——海量中文资讯平台
# result = xpath_data.xpath('//a/text()')#'//'为跨节点;取a标签包裹的内容
# result = xpath_data.xpath('//a[@mon="ct=1&c=top&a=30&pn=1"]/text()')# 精确的标签://a[@属性=“属性值”]/text()
# result = xpath_data.xpath('//a[@mon="ct=1&c=top&a=30&pn=1"]/@href')#取出链接
print(len(result))
print(result)

二、代码1——使用xpath解析方式爬取QZZN论坛中的帖子,将数据保存为json格式

import requests
from lxml import etree #xpath的库
import json  #list转str

class QzznSpider(object):
    def __init__(self):
        self.base_url = 'https://bbs.qzzn.com/forum-133-'
        self.headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1'
}
        self.data_list = []#爬取数据的汇总,后续用self.data_list.append(xxx)的方式进行数据填充
    #1.发请求
    def get_response(self,url):
        #网页的编码到底是gbk还是utf-8,进入抓取网页的开发者模式(F12),查询‘head-meta-charset=’能得到
        #原因是抓取的网页的编码就是gbk的,所以解码的模式也要是gbk
        data = requests.get(url, headers=self.headers).content.decode('gbk')#此时data数据类型是二进制,要实现翻页功能,而url是一个变量,需要外界拼接传入
        return data

    #2.解析数据
    #使用xpath解析当前页面所有的帖子title和url 保存
    def parse_data(self,data):
        #2.1转换类型
        x_data = etree.HTML(data)
        #2.2根据xpath路径开始解析
        title_list = x_data.xpath('//a[@class="s xst"]/text()')
        url_list =  x_data.xpath('//a[@class="s xst"]/@href')
        for index,title in enumerate(title_list):#enumerate为枚举遍历
            news={}
            news['title'] = title
            news['url'] = 'https://bbs.qzzn.com/'+url_list[index]#index输出依次为0,1,2,3,4....79(一页有80条帖子),实现了url的拼接
            self.data_list.append(news)

    #3.保存数据
    def save_Data(self):
        #使用with open 写入文件,所需的格式是str,所以需要将list转为str
        data_str = json.dumps(self.data_list)#将list转为str
        with open('05-example-QZZN.html','w',encoding='gbk')as f:
            f.write(data_str)

    # 4.启动
    def run(self):
        n = 100# n代表翻多少页
        for i in range(1, n):
             #4.1拼接完整的url
            url = self.base_url+str(i)+'.html'
            print(url)
             #4.2发请求
            data = self.get_response(url)
            #4.3做解析
            self.parse_data(data)#self.data_list.append(news),解析完数据就往init函数中的汇总列表中添加
        #4.4数据持久化。翻页完毕,爬取的数据都保存在了大集合self.data_list,然后进行数据持久化。
        self.save_Data()
#调用函数
QzznSpider().run()
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值