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 )
来源: http://www.bubuko.com/infodetail-3331718.html