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 )