python爬虫-学习记录day04

152 阅读4分钟

数据解析之xpath

1.数据解析介绍

"""
网络请求模块 urllib requests  获取整个网页源代码数据的 
爬虫四大步骤:
1 发请求 url 请求头参数 
            get 
            post   表单参数 
2 获取响应 
        response
3 解析数据 
        找的数据是垂直数据  最漂亮的女孩子 
        从获取到的响应数据中 找到自己想要的目标数据 学习数据解析的方式 
        实际上就是从大盒子中找小盒子    
4 保存数据  
        将小盒子中的数据 保存到本地或者说数据库   持久化  
"""

"""
数据解析对应三大方法 
1 xpath解析 都是用响应中找数据  
2 bs4
3 正则 

库的安装:
pip install lxml -i 换源地址 

"""

2.lxml的基本使用

# 导入模块
from lxml import etree
# html源代码
web_data = """
        <div>
            <ul>
                 <li class="item-0"><a href="link1.html">first item</a></li>
                 <li class="item-1"><a href="link2.html">second item</a></li>
                 <li class="item-inactive"><a href="link3.html">third item</a></li>
                 <li class="item-1"><a href="link4.html">fourth item</a></li>
                 <li class="item-0"><a href="link5.html">fifth item</a>
             </ul>
         </div>
        """
# 将html转成xml文件
element = etree.HTML(web_data)
# print(element)
# 获取li标签下面的a标签的href
links = element.xpath('//ul/li/a/@href')
print(links)  # ['link1.html', 'link2.html', 'link3.html', 'link4.html', 'link5.html']
# 获取li标签下面的a标签的文本数据
result = element.xpath('//ul/li/a/text()')
print(result)  # ['first item', 'second item', 'third item', 'fourth item', 'fifth item']
"""
1 导入网络请求模块库  数据解析库 
2 发请求获取响应
3 将响应对象转成xml对象 
4 通过xml对象的xpath语法定位数据 (页面分析)
5 将获取的数据进一步处理即可 
"""

3.文本定位测试方法

import requests

from lxml import etree

url = 'https://www.biedoul.com/article/180839'

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36'
}

response = requests.get(url, headers=headers)
html = etree.HTML(response.text)  # 转成xml对象
data = html.xpath('//div[@class="cc2"]//text()')   # 是一个列表
print(data)
data1 = html.xpath('//div[@class="cc2"]')[0].xpath('string(.)')
print(data1)

运行结果: image.png

4.top250实战

"""
1 页面与思路分析:
    1.1  确定数据接口  翻页的情况下 考虑url的规律 
        1.1.1 url分析 
    1.2  观察请求头信息是否有加密
    1.3  确定编码  utf-8 
    1.4  确定目标数据 
        1.4.1题目/文档中的需求会给出
    1.5  xpath语法构建 
        1.5.1 难度上升 手写xpath语法
             注意点: 我们要的数据是elements中的数据还是网页源代码中的数据  非常相似的
                但是我们获取的是网页源代码中的数据  我们elements中标签的属性可能在网页源代码中没有
                所以我们elements仅仅只是作为一个辅助定位 实际上我们要找的数据还是在网页源代码中 
    1.6  保存数据    
            保存数据的方式
2 代码实现
"""


import requests
from lxml import etree
'''
目标:熟悉xpath解析数的方式
需求:爬取电影的名称 评分 引言 详情页的url  翻页爬取1-10页 保存到列表中

如何实现?
设计技术与需要的库 requests lxml(etree)

实现步骤
1 页面分析(一般讲数据解析模块 都是静态页面)
   1.1 通过观察看网页源代码中是否有我们想要的数据 如果有就分析这个url
        如果没有再通过ajax寻找接口   通过分析数据在网页源代码中

   1.2 确定目标url
        https://movie.douban.com/top250?start=0&filter= 第一页
        通过页面分析发现所有我们想要的数据都在一个div[class="info"]里面

具体实现步骤
1 获取整个网页的源码 html
2 将获取的数据源码转成一个element对象(xml)
3 通过element对象实现xpath语法 对数据进行爬取(标题 评分 引言 详情页的url)
4 保存数据  先保存到字典中-->列表中

'''

# 定义一个函数用来获取网页源代码
def getsource(pagelink):
    # 请求头
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36'
    }
    # 获取源码
    response = requests.get(pagelink, headers=headers)
    response.encoding = 'utf-8'
    html = response.text
    return html

# 定义一个函数用于解析我们的网页源代码并获取我们想要的数据
def geteveryitem(html):
    element = etree.HTML(html)
    # 拿到[class="info"]的所有div
    movieitemlist = element.xpath('//li//div[@class="info"]')
    # print(movieitemlist,len(movieitemlist))
    # 定义一个列表
    itemlist = []
    for item in movieitemlist:
        # 定义一个字典
        itemdict = {}
        # 标题
        title = item.xpath('./div[@class="hd"]/a/span[@class="title"]/text()')
        title = "".join(title).replace("\xa0", "")
        # print(title)
        # 副标题
        othertitle = item.xpath('./div[@class="hd"]/a/span[@class="other"]/text()')[0].replace("\xa0", "")
        # print(othertitle)
        # 评分
        grade = item.xpath('./div[@class="bd"]/div[@class="star"]/span[2]/text()')[0]
        # print(grade)
        # 详情页的url
        link = item.xpath('div[@class="hd"]/a/@href')[0]
        # print(link)
        # 引言
        quote = item.xpath('div[@class="bd"]/p[@class="quote"]/span/text()')
        # print(quote)
        # list index out of range
        # 处理方式1 非空处理
        if quote:
            quote = quote[0]
        else:
            quote = ""
        # 将数据存放到字典中
        itemdict['title'] = ''.join(title + othertitle)
        itemdict['grade'] = grade
        itemdict['link'] = link
        itemdict['quote'] = quote
        # print(itemdict)
        itemlist.append(itemdict)
    # print(itemlist)
    return itemlist


if __name__ == '__main__':
    url = 'https://movie.douban.com/top250?start=0&filter='
    html = getsource(url)
    itemlist = geteveryitem(html)
    print(itemlist)

运行结果: image.png