• requests模块 & xpath解析库


    1.requests模块介绍

    # requests模块介绍
    对比:urllib使用麻烦
    安装: pip install requests
    ​
    # 初体验: 爬取搜狗首页
    

      


    2.requests发送请求

    1.requests的get请求:
    # requests的简单get请求
    # requests.get + headers
    # requests.get + headers + params
    # requests.get + headers + params + proxy
    import requests
    url = '...'
    headers = {
        "User-Agent":'...'
    }
    params = {
        'key': 'value'
    }
    proxies = {
        'http': 'http://127.0.0.1:8080'
        'https': 'http://127.0.0.1:8899'
    }
    res = requests.get(url=url, headers=headers, params=params, proxies=proxies)


    # 代理:
        透明代理:
        匿名代理:
        高匿代理:
    

      

     
    
    
    #第一种: 反爬机制与反反爬策略
        反爬机制: UA检测
        反反爬策略: UA伪装
    
    2.requests的post请求: 知乎发现页搜索
    import requests
    url = '...'
    headers = {
        "User-Agent":'...'
    }
    data = {
        'key': 'value'
    }
    proxy = {
        'http': 'http://127.0.0.1:8080',
        'https': 'http://127.0.0.1:8899'
    }
    res = requests.post(url=url, headers=headers, data=data, proxies=proxies)

    3.响应数据
    # 获取响应数据内容:(重点)
            res.text        获取HTML文本
            res.content     获取二进制流
            res.json()      获取json数据
    # 响应数据的属性:
            res_code = res.status_code  # 响应状态码(*)
            res_headers = res.headers  # 响应头信息
            res_url = res.url  # 此响应对应的请求url
            res_cookie = res.cookies  # 响应的cookies(*)
            res_history = res.history  # 请求历史
    

      

     

    3.xpath解析库

    
    
    # Xpath解析库介绍:
        数据解析的过程中使用过正则表达式, 但正则表达式想要进准匹配难度较高, 一旦正则表达式书写错误, 匹配的数据也会出错.
        网页由三部分组成: HTML, Css, JavaScript, HTML页面标签存在层级关系, 即DOM树, 在获取目标数据时可以根据网页层次关系定位标签, 在获取标签的文本或属性.
    
    # xpath解析库解析数据原理:
    1. 根据网页DOM树定位节点标签
    2. 获取节点标签的正文文本或属性值
    

      

    
    
    # xpath安装, 初体验 --> 使用步骤:
    1.xpath安装: pip install lxml
    2.requests模块爬取糗事百科热门的标题:
    import requests
    from lxml import etree
    ​
    url = 'https://www.qiushibaike.com/'
    headers = {
        "User-Agent":'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36'
    }
    ​
    res = requests.get(url=url, headers=headers)
    ​
    tree = etree.HTML(res.text)
    title_lst = tree.xpath('//ul/li/div/a/text()')
    for item in title_lst:
        print(item)
        
    3.xpath使用步骤:
    from lxml import etree
    ​
    tree = etree.HTML(res.text)
    tree = etree.parse(res.html, etree.HTMLParse())  # 示例如下, 了解内容
    ​
    tag_or_attr = tree.xpath('xpath表达式')
    
    # xpath解析本地文件
    import requests
    from lxml import etree
    ​
    url = 'https://www.qiushibaike.com/'
    headers = {
        "User-Agent":'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36'
    }
    ​
    res = requests.get(url=url, headers=headers)
    with open('qb.html', 'w', encoding='utf-8') as f:
        f.write(res.text)
    ​
    tree = etree.parse('./qb.html', etree.HTMLParser())
    title_lst = tree.xpath('//ul/li/div/a/text()')
    for item in title_lst:
        print(item)
    # xpath语法:
    1.常用规则:
          1.  nodename:       节点名定位
          2.  //:             从当前节点选取子孙节点(任意位置)
          3.  /:              从当前节点选取直接子节点(根节点)
          4.  nodename[@attribute="..."]  根据属性定位标签
          5.  @attributename:  获取属性 
          6.  text():          获取文本
         7.  .:当前节点          
    8.属性匹配两种情况: 多属性匹配 &  单属性多值匹配  
         2.2 多属性匹配(and )
        示例: tree.xpath('//div[@class="item" and @name="test"]/text()')  
        2.1 单属性多值匹配(contains)
        示例: tree.xpath('//div[contains(@class, "dc")]/text()')
    ​
    3.按序选择:
        3.1 索引定位: 从1开始
        3.2 last()函数(倒数)
        3.3 position()函数
    

      


    解析示例: 示例解析的是本地文件
    
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Xpath练习文件</title>
    </head>
    <body>
    <div id="007">
        "我是div标签的文字内容, 和下面的p标签还有div标签是同级的哦"
        <p>这是p标签内的文字内容</p>
        <div>这是p标签同级的div标签</div>
    </div><div class="divtag">
        <ul>
            <li>第1个li标签</li>
            <li>第2个li标签</li>
            <li>第3个li标签</li>
            <li>第4个li标签</li>
            <li>第5个li标签</li>
        </ul>
        <a href="https://www.baidu.com">这是百度的跳转连接</a>
    </div>
    ​
    ​
    <div class="c1" name="laoda">老大在此</div>
    <div class="c1 c3" name="laoer">老二任性, class有两个值</div>
    <div class="c1" name="laosan">我是老三</div></body>
    </html>
    
    from lxml import etree
    ​
    tree = etree.parse('./x.html', etree.HTMLParser())
    ​
    # 1.根据节点名, 即nodename定位title标签, 获取标签内文字
    title_text = tree.xpath('//title/text()')
    print(title_text)
    ​
    # 2.根据节点属性定位: 定位id为007的div标签
    div_007 = tree.xpath('//div[@id="007"]')
    print(div_007)
    ​
    # 3.示例直接子节点与子孙节点:/, //
    div_007_one = tree.xpath('//div[@id="007"]/text()')
    print(div_007_one)
    div_007_two = tree.xpath('//div[@id="007"]//text()')
    print(div_007_two)
    ​
    # 4.获取a标签的href属性
    a_href = tree.xpath('//div[@class="divtag"]/a/@href')
    print(a_href)
    ​
    # 4.多属性定位: 根据class属性和name属性定位div标签
    div_two_attr = tree.xpath('//div[@class="c1" and @name="laoda"]/text()')
    print(div_two_attr)
    ​
    # 5.属性多值定位: 定位所有class中有c1的div标签
    div_c1 = tree.xpath('//div[contains(@class, "c1")]')
    ​
    # 6.按序定位
    li_first = tree.xpath('//div[@class="divtag"]/ul/li[1]/text()')  # 定位第一个li标签, 获取其文本
    print(li_first)
    ​
    li_last = tree.xpath('//div[@class="divtag"]/ul/li[last()]/text()')  # 定位最后一个li标签
    print(li_last)
    ​
    li_daotwo = tree.xpath('//div[@class="divtag"]/ul/li[last()-1]/text()')  # 定位倒数第二个li标签
    print(li_daotwo)
    ​
    li_qianthree = tree.xpath('//div[@class="divtag"]/ul/li[position()<4]/text()')  # 定位前三个li标签
    print(li_qianthree)
    
    
    # 作业:
    1.爬取糗事百科, 热门前两页的每一项标题, 详情页链接, 好笑指数及评论数
    2.默写
    res = requests.get(url=url, headers=headers, params=params, proxies=proxies)
    res = requests.post(url=url, headers=headers, data=data, proxies=proxies)
    代理类型:
        透明代理:
        匿名代理:
        高匿代理:
        
    获取响应数据内容:
            res.text        获取HTML文本
            res.content     获取二进制流
            res.json()      获取json数据
    xpath常用规则:
          1.  nodename:       节点名定位
          2.  //:             从当前节点选取子孙节点
          3.  /:              从当前节点选取直接子节点
          4.  nodename[@attribute="..."]  根据属性定位标签
          5.  @attributename:  获取属性 
          6.  text():          获取文本
    

      

  • 相关阅读:
    directUI
    PyLucene测试成功
    MFC笔记(1)CPaintDC, CClientDC
    sprintf缓冲区溢出
    2.5 攻击示例:对Microsoft C++编译器的攻击 ZZ
    C++笔记(3)类中与类外的运算符重载
    C++笔记(2)public,private,protected关键字
    RTSP协议
    使用虚函数,减少累赘的if/else/switch
    C++笔记(4)成员函数定义在类内与类外
  • 原文地址:https://www.cnblogs.com/gaodenghan/p/13637871.html
Copyright © 2020-2023  润新知