python XML实例
案例:使用XPath的爬虫
现在我们用XPath来做一个简单的爬虫,我们尝试爬取某个贴吧里的所有帖子,并且将该这个帖子里每个楼层发布的图片下载到本地。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 | # tieba_xpath.py #!/usr/bin/env python # -*- coding:utf-8 -*- import os import urllib import urllib2 from lxml import etree class Spider: def __init__( self ): self .tiebaName = raw_input ( "请需要访问的贴吧:" ) self .beginPage = int ( raw_input ( "请输入起始页:" )) self .endPage = int ( raw_input ( "请输入终止页:" )) self .url = 'http://tieba.baidu.com/f' self .ua_header = { "User-Agent" : "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1 Trident/5.0;" } # 图片编号 self .userName = 1 def tiebaSpider( self ): for page in range ( self .beginPage, self .endPage + 1 ): pn = (page - 1 ) * 50 # page number word = { 'pn' : pn, 'kw' : self .tiebaName} word = urllib.urlencode(word) #转换成url编码格式(字符串) myUrl = self .url + "?" + word # 示例:http://tieba.baidu.com/f? kw=%E7%BE%8E%E5%A5%B3 & pn=50 # 调用 页面处理函数 load_Page # 并且获取页面所有帖子链接, links = self .loadPage(myUrl) # urllib2_test3.py # 读取页面内容 def loadPage( self , url): req = urllib2.Request(url, headers = self .ua_header) html = urllib2.urlopen(req).read() # 解析html 为 HTML 文档 selector = etree.HTML(html) #抓取当前页面的所有帖子的url的后半部分,也就是帖子编号 # http://tieba.baidu.com/p/4884069807里的 “p/4884069807” links = selector.xpath( '//div[@class="threadlist_lz clearfix"]/div/a/@href' ) # links 类型为 etreeElementString 列表 # 遍历列表,并且合并成一个帖子地址,调用 图片处理函数 loadImage for link in links: link = "http://tieba.baidu.com" + link self .loadImages(link) # 获取图片 def loadImages( self , link): req = urllib2.Request(link, headers = self .ua_header) html = urllib2.urlopen(req).read() selector = etree.HTML(html) # 获取这个帖子里所有图片的src路径 imagesLinks = selector.xpath( '//img[@class="BDE_Image"]/@src' ) # 依次取出图片路径,下载保存 for imagesLink in imagesLinks: self .writeImages(imagesLink) # 保存页面内容 def writeImages( self , imagesLink): ''' 将 images 里的二进制内容存入到 userNname 文件中 ''' print imagesLink print "正在存储文件 %d ..." % self .userName # 1. 打开文件,返回一个文件对象 file = open ( './images/' + str ( self .userName) + '.png' , 'wb' ) # 2. 获取图片里的内容 images = urllib2.urlopen(imagesLink).read() # 3. 调用文件对象write() 方法,将page_html的内容写入到文件里 file .write(images) # 4. 最后关闭文件 file .close() # 计数器自增1 self .userName + = 1 # 模拟 main 函数 if __name__ = = "__main__" : # 首先创建爬虫对象 mySpider = Spider() # 调用爬虫对象的方法,开始工作 mySpider.tiebaSpider() |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)