• Python爬虫实践 —— 2.百度贴吧html文件爬取


    51zxw 的 python爬虫实践课程中,第二章末尾有一个简单的爬取demo。

    输入贴吧名和初始结束页码,获取对应的百度贴吧html文件。

    老师写的demo有点随意,我这边把拼接url分了两个函数,面向对象重写了下,自己下来会好好对比再体会下面对对象和面对过程。

     
    # SpiderT面对对象实现
    from urllib import request
    from urllib import parse
    import time
    
    
    class SpiderT:                                    #封装成类,调用时实例化即可
    
        def __init__(self, keyword, begin, end):      #初始化
            self.keyword = keyword
            self.begin = begin
            self.end = end
    
        def getUrl(self):                             #解码kw拼接百度贴吧网址,获得部分url,剩余的pn页码url是动态生成的
    
            key = parse.urlencode({"kw": self.keyword})
            _url = "http://tieba.baidu.com/f?"
            part_url = _url + key
            return part_url
    
        def loadPage(self, url, filename):             #爬取函数,仅用了一个header,未设置ip池和proxy,创建request对象而不是直接urlopen
    
            print("正在下载 " + filename)
            headers = {"User-Agent": "Mozilla/5.0 (Linux; U; Android 8.1.0; zh-cn; BLA-AL00 Build/HUAWEIBLA-AL00) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/57.0.2987.132 MQQBrowser/8.9 Mobile Safari/537.36"}
    
            req = request.Request(url, headers = headers)
            return request.urlopen(req).read()
    
        def writePage(self, html, filename):           #保存html文件函数,i/o流也该复习复习了
    
            print("正在保存 " + filename)
            #文件写入
            with open(filename, "wb") as f:
                f.write(html)
            print("--------------------------------")
    
        def tiebaSpider(self):                          #爬虫主函数,动态调用load和write函数
                                                        #for循环实现页码数内遍历
            for page in range(self.begin, self.end + 1):
                pn = (page - 1) * 50
                filename = "c:/第" + str(page) + "页.html"
                url = SpiderT.getUrl(self) + "&pn=" + str(pn)  #获取完整地址
                print(url)
                html = SpiderT.loadPage(self, url, filename)  # 调用爬虫,爬取网页
                SpiderT.writePage(self, html, filename)  # 把获取到的网页信息写入本地
    
    
    if __name__ == '__main__':
    
        i = SpiderT("绝地求生", 1, 30)    #实例化SpiderT,爬取绝地求生贴吧 1到30 页码的html文件,应该设置爬取间隔的,不然容易挂ip
        i.tiebaSpider()
        time.sleep(2)

    运行完之后

    sublime打开验证一下是不是爬取的绝地求生贴吧

    ok,bingo,现在完成了 小小爬虫的第一步,获取html/目标文件。

    接下来,就是结合目标,添加get/post请求,再加上正则表达式提取数据,数据库存储数据了,是不是很简单啊,想想还有些小兴奋呢  ( i ^-^ i )

  • 相关阅读:
    20165334 四则运算阶段性总结(第二周)
    20165334 《java程序设计》第8周学习总结
    20165334四则运算阶段性总结(第一周)
    20165334 《java程序设计》第7周学习总结
    20165334实验二 面向对象程序设计
    20165334《java程序设计》第六周学习总结
    2017-2018-2 20165228 实验四《Android程序设计》实验报告
    第十周课堂测试补做
    2017-2018-2 20165228 实验三《敏捷开发与XP实践》实验报告
    20165228 2017-2018-2 《Java程序设计》第9周学习总结
  • 原文地址:https://www.cnblogs.com/liuchaodada/p/12041083.html
Copyright © 2020-2023  润新知