大数据分析与可视化 之 百度贴吧(标题和链接)

发布时间 2023-12-30 20:40:18作者: Ivan丶c

大数据分析与可视化 之 百度贴吧(标题和链接)

import csv
from urllib import request,parse
import time
import random

import requests
from lxml import etree
from urllib import request, parse



#定义一个爬虫类
class TiebaSpider(object):

    #初始化url属性
    def __init__(self):
        self.url='http://tieba.baidu.com/f?{}'


    # 1.请求函数,得到页面,传统三步
    def get_html(self,url):
        res=requests.get(url=url,headers = {"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36"})
        #windows会存在乱码问题,需要使用 gbk解码,并使用ignore忽略不能处理的字节
        #linux不会存在上述问题,可以直接使用decode('utf-8')解码
        html = res.content.decode('utf-8').replace("<!--", "").replace("-->", "")
        return html
    # 2.解析函数,此处代码暂时省略,还没介绍解析模块
    def parse_html(self,html):
        # print(html)
        eroot = etree.HTML(html)
        # 提取行数据
        li_list = eroot.xpath('//ul[@id="thread_list"]/li/div/div[2]/div[1]/div[1]/a')
        data = []
        for i in li_list:
            name = i.xpath('./text()')[0]
            tiebaurl = i.xpath('./@href')[0]
            tiebaurl = 'https://tieba.baidu.com'+str(tiebaurl)
            dic={'贴子名称':name,'链接':tiebaurl}
            data.append(dic)
        # print(data)
        return data
    # 3.保存文件函数
    def save_html(self,filename,html_data):
        header_list = ["贴子名称","链接"]
        with open(filename, mode="w", encoding="utf-8-sig", newline="") as f:
            wt = csv.DictWriter(f,header_list)   #通过字典方式打开文件,需要多传入一个标题变量
            wt.writeheader()   #保存标标题
            wt.writerows(html_data)   #写入数据,加上s就是报错多个


    # 4.入口函数
    def run(self):
        name=input('输入贴吧名:')
        begin=int(input('输入起始页:'))
        stop=int(input('输入终止页:'))
        # +1 操作保证能够取到整数
        for page in range(begin,stop+1):
            pn=(page-1)*50
            params={
                'kw':name,
                'pn':str(pn)
            }
            #拼接URL地址
            params=parse.urlencode(params)
            url=self.url.format(params)
            #发请求
            html=self.get_html(url)
            #获取网页信息
            html_data=self.parse_html(html)
            #定义路径
            filename='{}-{}页.csv'.format(name,page)
            self.save_html(filename,html_data)
            #提示
            print('第%d页抓取成功'%page)
            #每爬取一个页面随机休眠1-2秒钟的时间
            time.sleep(random.randint(1,2))

#以脚本的形式启动爬虫
if __name__=='__main__':
    start=time.time()
    spider=TiebaSpider() #实例化一个对象spider
    spider.run() #调用入口函数
    end=time.time()
    #查看程序执行时间
    print('执行时间:%.2f'%(end-start))  #爬虫执行时间