Skip to content

[实例]爬取百度贴吧数据

面向对象的方法编写爬虫程序时,逻辑结构较为固定:

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()

爬取百度贴吧数据:

  1. 分析url,找规律
  2. 开干
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))