python爬虫 Day04

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/luohongtuCSDN/article/details/82889517

目录:

python爬虫 Day04

Xpath工具(解析html)

Xpath

  • 在XML文档中查找信息的语言,同样适用于HTML文档的检索

Xpath辅助工具

  1. Chrome插件 : XPath Helper
    打开/关闭 : Ctrl + Shift + 大写X
  2. FireFox插件 :XPath checker
  3. XPath表达式编辑工具 : XML Quire

XPath匹配规则

  1. 匹配演示
    1. 查找bookstore下面的所有节点 : /bookstore
    2. 查找所有的book节点 : //book
    3. 查找所有book节点下title节点中,lang属性为"en"的节点 : //book/title[@lang=“en”]
  2. 选取节点
    / : 从根节点开始选取 /bookstore
    // : 从整个文档中查找某个节点 //price
    @ : 选取某个节点的属性 //title[@lang=“en”]
  3. @使用
  4. 选取1个节点 : //title[@lang=“en”]
  5. 选取N个节点 : //title[@lang]
  6. 选取节点属性值 : //title/@lang
  7. 匹配多路径
  8. 符号 : |
  9. 示例
  • 获取所有book节点下的title节点和price节点
  • //book/title | //book/price
  1. 函数
    • contains() : 匹配1个属性值中包含某些字符串的节点
    • //title[contains(@lang,"e")]

安装环境

  1. win7 环境
    1. 进入cmd ,输入:python -m pip install lxml

解析HTML源码

  1. lxml库 : HTML/XML解析库
    1. 安装
      conda install lxml
      pip install lxml
  2. 使用流程
    1. 利用lxml库的etree模块构建解析对象
    2. 解析对象调用xpath工具定位节点信息
  3. 使用
    1. 导入模块 from lxml import etree
    2. 创建解析对象 : parseHtml = etree.HTML(html)
    3. 调用xpath进行解析
      • r_list = parseHtml.xpath('//title[@lang="en"]')
      • 只要调用了xpath,则结果一定是列表
  4. 示例+练习
    from lxml import etree
    
    html = """<div class="wrapper">
    	<i class="iconfont icon-back" id="back"></i>
    	<a href="/" id="channel">新浪社会</a>
    	<ul id="nav">
    		<li><a href="http://domestic.firefox.sina.com/" title="国内">国内</a></li>
    		<li><a href="http://world.firefox.sina.com/" title="国际">国际</a></li>
    		<li><a href="http://mil.firefox.sina.com/" title="军事">军事</a></li>
    		<li><a href="http://photo.firefox.sina.com/" title="图片">图片</a></li>
    		<li><a href="http://society.firefox.sina.com/" title="社会">社会</a></li>
    		<li><a href="http://ent.firefox.sina.com/" title="娱乐">娱乐</a></li>
    		<li><a href="http://tech.firefox.sina.com/" title="科技">科技</a></li>
    		<li><a href="http://sports.firefox.sina.com/" title="体育">体育</a></li>
    		<li><a href="http://finance.firefox.sina.com/" title="财经">财经</a></li>
    		<li><a href="http://auto.firefox.sina.com/" title="汽车">汽车</a></li>
    	</ul>
    	<i class="iconfont icon-liebiao" id="menu"></i>
    </div>"""
    # 1.构建解析对象
    parseHtml = etree.HTML(html)
    # 2.解析对象调用 xpath 工具
    # 获取所有a标签的 href属性值
    r_list = parseHtml.xpath('//a/@href')
    #for i in r_list:
    #    print(i)
        
    # 获取 / 
    r_list = parseHtml.xpath(
                       '//a[@id="channel"]/@href')
    #print(r_list)
    # 获取 非 /
    #r_list = parseHtml.xpath(
    #                '//ul[@id="nav"]/li/a/@href')
    
    r_list = parseHtml.xpath(
                    '//ul[@id="nav"]//a/@href')
    #print(r_list)
    # 获取所有<a>节点的文本内容
    r_list = parseHtml.xpath('//a')
    # 得到的是元素对象,需要用 对象名.text 获取内容
    #for i in r_list:
    #    print(i.text)
    # 获取 新浪社会
    r_list = parseHtml.xpath('//a[@id="channel"]')
    #for i in r_list:
    #    print(i.text)
    # 获取非 新浪社会 的节点文本
    r_list = parseHtml.xpath('//ul[@id="nav"]//a')
    for i in r_list:
        print(i.text)
    
    

4.案例 : 抓取百度贴吧帖子里面的图片

  1. 目标 : 抓贴吧中帖子图片
  2. 思路
  3. 获取贴吧主页URL : 美女吧 下一页:URL规律
  4. 获取美女吧中每个帖子的 URL
  5. 对每个帖子发请求,获取帖子里所有图片的URL
  6. 对图片URL发请求,以wb的方式写入本地文件
    3.步骤
  7. 获取贴吧的URL
    http://tieba.baidu.com/f? + 一堆的查询参数
    pn = (page-1)*50
  8. 获取每个帖子的URL
    http://tieba.baidu.com + /p/5869279412
    //div[@class="t_con cleafix"]/div/div/div/a/@href
  9. 打开每个帖子,图片的URL
    http://imgsrc.baidu.com/forum/w%3D580/sign=6e7036eac31b9d168ac79a69c3dfb4eb/9b23f21fbe096b63ee92fa6501338744eaf8ace5.jpg
    xpath匹配: //img[@class="BDE_Image"]/@src
  10. 保存到本地
  11. ProxyBasicAuthHandler私密代理Handler处理器
    1. 密码管理器使用流程

      1. 创建密码管理器对象
        pwd=urllib.request.HTTPPasswordMgrWithDefaultRealm()
    2. 添加私密代理用户名,密码,IP地址,端口信息
      pwd.add_password(None,"IP:端口","用户名","密码")

    3. urllib.request.ProxyBasicAuthHandler(密码管理器对象)

    4. 代码:

      
      server = "114.67.228.126:16819"
      user = "309435365"
      password = "szayclhp"
      url = "http://www.baidu.com/"
      tarenaUrl = "http://code.tarena.com.cn/"
      
      # 密码管理器对象操作
      pwd = urllib.request.HTTPPasswordMgrWithDefaultRealm()
      pwd.add_password(None,server,user,password)
      #pwd.add_password(None,tarenaUrl,"tarenacode","code_2013")
      # 创建处理器对象
      proxy_handler = urllib.request.ProxyBasicAuthHandler(pwd)
      opener = urllib.request.build_opener(proxy_handler)
      # 发请求
      req = urllib.request.Request(url)
      res = opener.open(req)
      html = res.read().decode("utf-8")
      print(html)
      

猜你喜欢

转载自blog.csdn.net/luohongtuCSDN/article/details/82889517