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 )

原文地址:https://www.cnblogs.com/liuchaodada/p/12041083.html