切换主题
[实例]爬取百度贴吧数据
面向对象的方法编写爬虫程序时,逻辑结构较为固定:
python
# 程序结构
class xxxSpider(object):
def __init__(self):
# 定义常用变量,比如url或计数变量等
def get_html(self):
# 获取响应内容函数,使用随机User-Agent
def parse_html(self):
# 使用正则表达式来解析页面,提取数据
def write_html(self):
# 将提取的数据按要求保存,csv、MySQL数据库等
def run(self):
# 主函数,用来控制整体逻辑
if __name__ == '__main__':
# 程序开始运行时间
spider = xxxSpider()
spider.run()
爬取百度贴吧数据:
- 分析url,找规律
- 开干
python
from urllib import request, parse
import time
import random
from public.ua_info import ua_list
# 定义一个爬虫类
class TiebaSpider(object):
# 初始化属性
def __init__(self):
self.url = 'http://tieba.baidu.com/f?{}'
self.headers = {
'User-Agent': random.choice(ua_list)
}
# 获取html页面(重构请求,发送请求,编码并读取)
def get_html(self):
req = request.Request(url=self.url, headers=self.headers)
res = request.urlopen(req)
html = res.read().decode('utf-8')
return html
# 解析html页面
def parse_html(self):
pass
# 保存文件
def save_file(html, filename):
with open(filename, 'w', encoding='utf-8') as f:
f.write(html)
# 入口函数
def run(self):
name = input('请输入贴吧名:')
start_page = int(input('请输入起始页码:'))
end_page = int(input('请输入结束页码:'))
for page in range(start_page, end_page + 1):
pn = (page - 1) * 50
params = {
'kw': name,
'pn': pn
}
params = parse.urlencode(params)
self.url = self.url.format(params)
html = self.get_html()
filename = '第%s页.html' % page
save_file(html, filename)
print('第%s页爬取成功' % page)
time.sleep(random.randint(1, 3))
if __name__ == '__main__':
start = time.time()
spider = TiebaSpider()
spider.run()
end = time.time()
print('总共耗时%.2f秒' % (end - start))