zoukankan      html  css  js  c++  java
  • 爬虫 (3)- lxml库和贴吧图片下载案例

    lxml库

    lxml 是 一个HTML/XML的解析器,主要的功能是如何解析和提取 HTML/XML 数据。

    lxml和正则一样,也是用 C 实现的,是一款高性能的 Python HTML/XML 解析器,我们可以利用之前学习的XPath语法,来快速的定位特定元素以及节点信息。

    lxml python 官方文档:http://lxml.de/index.html

    需要安装C语言库,可使用 pip 安装:pip install lxml (或通过wheel方式安装)

    百度贴吧下载图片案例

    源码下载,直接拉进PyCharm运行即可,当然你需要对应的包,下载包的教程链接

    源码展示解析

    # -*- coding:utf-8 -*-
    # Author:shifu204
    
    import urllib.request
    import urllib.parse
    from lxml import etree
    
    def loadPage(url):
        """
            作用:根据url发送请求,获取服务器响应文件
            url: 需要爬取的url地址
        """
        #print url
        #headers = {"User-Agent" : "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11"}
    
        request = urllib.request.Request(url)
        html = urllib.request.urlopen(request).read()
        # 解析HTML文档为HTML DOM模型
        content = etree.HTML(html)
        #print content
        # 返回所有匹配成功的列表集合
        link_list = content.xpath('//div[@class="t_con cleafix"]/div/div/div/a/@href')
    
        for link in link_list:
            fulllink = "http://tieba.baidu.com" + link
            # 组合为每个帖子的链接
            # print(link)
            loadImage(fulllink)
    
    
    def loadImage(link):
        """
            取出每个帖子里的每个图片连接
        """
        headers = {"User-Agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"}
        request = urllib.request.Request(link, headers = headers)
        html = urllib.request.urlopen(request).read()
        # 解析
        content = etree.HTML(html)
        # 取出帖子里每层层主发送的图片连接集合
        link_list = content.xpath('//img[@class="BDE_Image"]/@src')
    
        # 取出每个图片的连接
        for link in link_list:
            # print(link)
            writeImage(link)
    
    def writeImage(link):
        """
            作用:将html内容写入到本地
            link:图片连接
        """
        #print "正在保存 " + filename
        headers = {"User-Agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"}
        # 文件写入
        request = urllib.request.Request(link, headers = headers)
        # 图片原始数据
        image = urllib.request.urlopen(request).read()
        # 取出连接后10位做为文件名
        filename = link[-10:]
        # 写入到本地磁盘文件内
        with open(filename, "wb") as f:
            f.write(image)
        print("已经成功下载 "+ filename)
    
    
    
    
    
    def tiebaSpider(url, beginPage, endPage):
        """
            作用:贴吧爬虫调度器,负责组合处理每个页面的url
            url : 贴吧url的前部分
            beginPage : 起始页
            endPage : 结束页
        """
        for page in range(beginPage, endPage + 1):
            pn = (page - 1) * 50
            #filename = "第" + str(page) + "页.html"
            fullurl = url + "&pn=" + str(pn)
            # print (fullurl)
            loadPage(fullurl)
            #print (html)
    
            print("谢谢使用")
    
    if __name__ == "__main__":
        kw = input("请输入需要爬取的贴吧名:")
        beginPage = int(input("请输入起始页:"))
        endPage = int(input("请输入结束页:"))
    
        url = "http://tieba.baidu.com/f?"
        key = urllib.parse.urlencode({"kw": kw})
        fullurl = url + key
        # print(fullurl)
        tiebaSpider(fullurl, beginPage, endPage)
    

      

  • 相关阅读:
    spring---aop(1)---AOP概念
    spring---transaction(6)---事务的配置
    spring---transaction(5)---事务的体系
    spring---transaction(4)---源代码分析(事务的状态TransactionStatus)
    spring---transaction(3)---源代码分析(事务的管理器PlatformTransactionManager)
    spring---transaction(2)---源代码分析(事务的定义TransactionDefinition)
    spring---transaction(1)---源代码分析(事务的拦截器TransactionInterceptor)
    mybatis源码分析(8)-----事务(mybatis管理、spring管理)
    mybatis源码分析(7)-----缓存Cache(一级缓存,二级缓存)
    mybatis源码分析(6)-----核心调度对象StatmentHandler
  • 原文地址:https://www.cnblogs.com/shifu204/p/9662482.html
Copyright © 2011-2022 走看看