新手友好!Python爬虫实战:爬取百度贴吧帖子,自动提取标题+正文+评论,保存为MD文件

📅 发布时间:2026/7/7 1:31:28 👁️ 浏览次数:
新手友好!Python爬虫实战:爬取百度贴吧帖子,自动提取标题+正文+评论,保存为MD文件
最近刚学Python的小表弟找我“哥我想把贴吧里那个‘新手学Python避坑指南’的帖子存下来方便以后看但复制粘贴太麻烦了评论也漏了好多”我笑着说“这事儿交给Python啊避开百度贴吧的几个小反爬1小时写个脚本一键提取标题、正文、所有评论还能自动排版成Markdown文件手机电脑都能看”今天就把这个新手零门槛、避开反爬的实战教程分享给你——不用懂复杂的正则表达式不用登录不用Cookie跟着步骤走你也能做出自己的第一个实用爬虫一、准备工作先把家伙事儿备齐10分钟搞定1. 安装Python和VS Code和之前爬天气预报的教程完全一样如果还没装翻回去看我上一篇的“准备工作”部分保姆级步骤零基础也能10分钟搞定。2. 安装必要的Python库用国内镜像源下载速度快10倍打开VS Code的“终端”快捷键Ctrl ~依次输入下面的命令每输完一行按回车# 1. 安装requests库向贴吧发送请求获取网页内容pipinstallrequests -i https://pypi.tuna.tsinghua.edu.cn/simple# 2. 安装lxml库解析网页内容比BeautifulSoup4更快更稳新手也能用pipinstalllxml -i https://pypi.tuna.tsinghua.edu.cn/simple# 3. 安装fake_useragent库自动生成随机浏览器请求头避开最简单的反爬pipinstallfake_useragent -i https://pypi.tuna.tsinghua.edu.cn/simple如果终端显示“Successfully installed xxx”就说明安装成功了二、选一个好爬的贴吧帖子避开反爬太严的新手别碰太火的明星贴吧、游戏贴吧反爬严可能需要Cookie、验证码有敏感内容的贴吧违法违规别碰只有登录才能看的帖子新手先跳过。我推荐选技术类贴吧的“精品贴”比如“Python吧”的新手教程生活类贴吧的“经验贴”比如“租房吧”的避坑指南反爬几乎没有的“冷门精品贴”。今天我就用Python吧的一篇新手友好的精品贴做演示https://tieba.baidu.com/p/8976543210注意如果这个帖子失效了你可以自己找一篇结构类似的精品贴复制URL就行三、分析网页结构这是爬虫的核心用XPath超简单1. 用浏览器的“开发者工具”分析这是新手必须学会的技能和之前爬天气预报的步骤类似但这次我们用XPath比CSS选择器更精准适合贴吧这种嵌套多的网页打开你要爬的贴吧帖子右键点击空白处选择“检查”或者按快捷键F12。点击开发者工具左上角的“小箭头”图标或者按快捷键Ctrl Shift C。用小箭头点击网页上的帖子标题比如“新手学Python避坑100条持续更新”开发者工具会自动定位到对应的HTML代码。右键点击定位到的HTML代码选择“Copy”→“Copy XPath”复制下来的XPath就是我们提取标题的“钥匙”用同样的方法复制正文内容、每一条评论的用户名、评论内容、评论时间的XPath。四、写代码完整可运行附详细注释避开反爬在VS Code里新建一个Python文件命名为tieba_spider.py把下面的代码复制进去我加了超级详细的注释零基础也能看懂# 1. 导入我们需要的库importrequestsfromlxmlimportetreefromfake_useragentimportUserAgentimporttimeimportredefclean_text(text): 辅助函数清理文本中的换行、空格、HTML标签等垃圾内容 :param text: 原始文本 :return: 清理后的干净文本 # 用正则表达式去除HTML标签textre.sub(r[^],,text)# 去除多余的换行和空格连续的换行/空格只保留一个textre.sub(r\s, ,text).strip()returntextdefget_tieba_post(post_url,save_filename): 爬取指定百度贴吧帖子的标题、正文、所有评论保存为Markdown文件 :param post_url: 贴吧帖子的完整URL :param save_filename: 保存的Markdown文件名不用加.md后缀 # 2. 初始化fake_useragent自动生成随机浏览器请求头避开最简单的反爬uaUserAgent()headers{User-Agent:ua.random,# 每次运行都用不同的浏览器请求头Referer:https://tieba.baidu.com/# 告诉贴吧我们是从首页过来的不是直接访问的}try:# 3. 先爬取第一页获取帖子的总页数print(正在爬取第一页获取总页数...)responserequests.get(post_url,headersheaders,timeout10)# 设置网页编码为UTF-8避免中文乱码response.encodingutf-8# 4. 检查请求是否成功状态码200表示成功ifresponse.status_code!200:print(f❌ 请求失败状态码{response.status_code})return# 5. 用lxml解析网页内容htmletree.HTML(response.text)# 6. 提取帖子的总页数如果只有一页默认设为1total_page_xpath//li[classl_reply_num]/span[2]/text()total_page_listhtml.xpath(total_page_xpath)total_pageint(total_page_list[0])iftotal_page_listelse1print(f✅ 总页数获取成功共{total_page}页)# 7. 提取帖子的标题第一页就有不用每页都提title_xpath//h1[classcore_title_txt ]/text()title_listhtml.xpath(title_xpath)titleclean_text(title_list[0])iftitle_listelse未知标题print(f✅ 标题提取成功标题{title})# 8. 初始化Markdown文件的内容md_contentf#{title}\n\nmd_contentf**帖子链接**{post_url}\n\nmd_content---\n\n# 9. 循环爬取每一页的内容forpageinrange(1,total_page1):print(f正在爬取第{page}/{total_page}页...)# 构造当前页的URL第一页不用加pn参数从第二页开始加pn50,100,...ifpage1:current_urlpost_urlelse:current_urlf{post_url}?pn{(page-1)*50}# 发送请求获取当前页的内容current_responserequests.get(current_url,headersheaders,timeout10)current_response.encodingutf-8current_htmletree.HTML(current_response.text)# 10. 第一页才提取正文内容正文只在第一页ifpage1:content_xpath//div[classd_post_content j_d_post_content ]//text()content_listcurrent_html.xpath(content_xpath)# 把正文列表拼接成一个字符串清理垃圾内容contentclean_text(.join(content_list))md_contentf## 正文\n\n{content}\n\nmd_content---\n\nmd_content## 评论\n\n# 11. 提取当前页的所有评论# 找到所有评论的容器每一条评论都在一个div里comment_container_xpath//div[classl_post l_post_bright j_l_post clearfix ]comment_containerscurrent_html.xpath(comment_container_xpath)fori,containerinenumerate(comment_containers,1):# 提取评论的用户名username_xpath.//a[classp_author_name j_user_card]/text()username_listcontainer.xpath(username_xpath)usernameclean_text(username_list[0])ifusername_listelse匿名用户# 提取评论的时间time_xpath.//span[classtail-info]/text()time_listcontainer.xpath(time_xpath)# 时间在最后一个tail-info里comment_timeclean_text(time_list[-1])iftime_listelse未知时间# 提取评论的内容comment_content_xpath.//div[classd_post_content j_d_post_content ]//text()comment_content_listcontainer.xpath(comment_content_xpath)comment_contentclean_text(.join(comment_content_list))# 把评论添加到Markdown内容里md_contentf### 评论{i}{username}·{comment_time}\n\n{comment_content}\n\n# 12. 每爬完一页暂停2-5秒避开百度贴吧的反爬别爬太快sleep_time23*(page%2)# 随机暂停2-5秒print(f✅ 第{page}/{total_page}页爬取成功暂停{sleep_time}秒...)time.sleep(sleep_time)# 13. 把所有内容保存为Markdown文件md_filenamef{save_filename}.mdwithopen(md_filename,w,encodingutf-8)asf:f.write(md_content)print(f\n 全部爬取成功文件已保存到{md_filename})exceptExceptionase:# 捕获所有异常打印错误信息print(f\n❌ 爬取失败错误信息{e})if__name____main__:# 14. 在这里修改你要爬的帖子URL和保存的文件名# 注意如果帖子URL失效了自己找一篇结构类似的精品贴替换post_urlhttps://tieba.baidu.com/p/8976543210save_filenamePython新手避坑100条# 15. 调用爬取函数get_tieba_post(post_url,save_filename)五、运行代码一键搞定在VS Code的终端里输入下面的命令按回车python tieba_spider.py如果终端显示“ 全部爬取成功文件已保存到Python新手避坑100条.md”就说明成功了打开VS Code左侧的“资源管理器”第一个图标你会看到生成的Markdown文件双击打开就能看到排版整齐的标题、正文、所有评论了六、新手常见问题解答我帮你踩过的坑1. 终端提示“‘python’ 不是内部或外部命令”原因安装Python时没有勾选“Add Python 3.x.x to PATH”。解决方法翻回去看我上一篇爬天气预报的教程的“新手常见问题解答”部分。2. 终端提示“ModuleNotFoundError: No module named ‘xxx’”原因没有安装对应的库或者安装库时用了错误的镜像源。解决方法重新用清华镜像源安装对应的库检查VS Code的Python解释器是否正确。3. 爬取到的中文是乱码原因没有设置网页编码为UTF-8。解决方法检查代码里有没有response.encoding utf-8如果没有加上这一行。4. 终端提示“请求超时”原因网络不好或者爬太快被百度贴吧暂时屏蔽了。解决方法检查网络连接把代码里的timeout10改成timeout20延长超时时间把代码里的sleep_time改成更大的数比如5-10秒暂停更久过一会儿再试。5. 只爬取到第一页或者爬取到的评论不全原因XPath复制错了或者贴吧的网页结构变了。解决方法重新用浏览器的“开发者工具”复制正确的XPath检查贴吧的网页结构是否和演示的帖子类似如果不一样调整XPath。七、进阶玩法有兴趣可以试试爬取整个贴吧的所有精品贴先爬取贴吧的精品贴列表获取所有精品贴的URL再用循环调用get_tieba_post函数。自动过滤广告评论用正则表达式或者关键词过滤掉广告评论。保存为PDF文件用Python的markdown2pdf库把生成的Markdown文件自动转换成PDF文件。结尾怎么样是不是很简单避开百度贴吧的几个小反爬新手也能1小时搞定这个脚本不仅能帮你存贴吧的教程你还可以用它存自己喜欢的小说、经验贴、攻略再也不用复制粘贴漏内容了