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()

  

 

posted @   AlamZ  阅读(233)  评论(0编辑  收藏  举报
编辑推荐:
· 基于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)
点击右上角即可分享
微信分享提示