python爬虫基础实战案例
文章目录1 实战一爬取豆瓣Top250图书信息目标分析完整代码2 实战二批量下载图片关键技巧多线程加速下载3 实战三爬取表格数据并存入Excel安装依赖爬取天气历史数据4 完整项目知乎热榜数据采集下面通过几个经典案例把前面的知识串联起来。包含三类实战项目静态页面爬取、图片批量下载、表格数据提取与存储。每个案例都有完整代码可以直接运行。1 实战一爬取豆瓣Top250图书信息豆瓣图书是学习爬虫的经典案例页面结构清晰适合练习CSS选择器和数据存储。目标分析目标爬取豆瓣Top250图书的书名、作者、评分、出版信息、评价人数保存为CSV文件。打开F12分析页面结构每本书在div.item容器中书名在span.title中评分在span.rating_num中作者和出版信息在p标签中翻页链接在a标签URL参数为?start0,25,50...完整代码importrequestsfrombs4importBeautifulSoupimportcsvimporttimeimportrandomdefget_headers():返回伪装请求头return{User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36,Accept-Language:zh-CN,zh;q0.9}defparse_book_list(html):解析单页图书列表soupBeautifulSoup(html,lxml)books[]foriteminsoup.select(div.item):# 书名有时会有副标题title_tagsitem.select(span.title)titletitle_tags[0].text.strip()iftitle_tagselse未知# 评分rating_tagitem.select_one(span.rating_num)ratingrating_tag.text.strip()ifrating_tagelse0# 评价人数inq_tagitem.select_one(span.inq)inqinq_tag.text.strip()ifinq_tagelse# 作者/出版信息info_tagitem.select_one(div.bd p)infoinfo_tag.text.strip().replace(\n, )ifinfo_tagelse# 排名rank_tagitem.select_one(em)rankrank_tag.textifrank_tagelsebooks.append({rank:rank,title:title,rating:rating,inq:inq,info:info})returnbooksdefcrawl_douban_books():爬取豆瓣图书Top250all_books[]base_urlhttps://book.douban.com/top250forstartinrange(0,250,25):urlf{base_url}?start{start}print(f爬取第{start//251}页:{url})try:responserequests.get(url,headersget_headers(),timeout10)response.raise_for_status()booksparse_book_list(response.text)all_books.extend(books)print(f本页提取{len(books)}本书)exceptExceptionase:print(f爬取失败:{e})# 随机延时 1-3 秒避免被封time.sleep(random.uniform(1,3))returnall_booksdefsave_to_csv(books,filenamedouban_books.csv):保存为CSV文件ifnotbooks:print(没有数据可保存)returnwithopen(filename,w,encodingutf-8-sig,newline)asf:fieldnames[rank,title,rating,inq,info]writercsv.DictWriter(f,fieldnamesfieldnames)writer.writeheader()writer.writerows(books)print(f已保存{len(books)}条数据至{filename})if__name____main__:bookscrawl_douban_books()save_to_csv(books)# 打印前5条预览forbookinbooks[:5]:print(f[{book[rank]}]{book[title]}-{book[rating]}分)2 实战二批量下载图片批量下载图片是爬虫的常见需求。这个案例演示如何下载图片并保存到本地。关键技巧图片是二进制数据需要用response.content获取而不是response.text。importrequestsimportosimporttimeimportrandomfrompathlibimportPathfromurllib.parseimporturlparsedefdownload_image(url,save_path,headersNone):下载单张图片try:responserequests.get(url,headersheaders,timeout15,streamTrue)response.raise_for_status()# 检查是否是图片类型content_typeresponse.headers.get(Content-Type,)ifimagenotincontent_type:print(f不是图片类型:{content_type})returnFalse# 从URL中获取文件名parsed_urlurlparse(url)filenameos.path.basename(parsed_url.path)ifnotfilenameor.notinfilename:filenamefimage_{int(time.time())}.jpg# 保存图片full_pathos.path.join(save_path,filename)withopen(full_path,wb)asf:forchunkinresponse.iter_content(chunk_size8192):f.write(chunk)file_sizeos.path.getsize(full_path)print(f下载成功:{filename}({file_size/1024:.1f}KB))returnTrueexceptExceptionase:print(f下载失败{url}:{e})returnFalsedefbatch_download_images(image_urls,save_dirimages):批量下载图片# 创建保存目录Path(save_dir).mkdir(parentsTrue,exist_okTrue)headers{User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64),Referer:https://example.com# 防盗链处理}success_count0fail_count0fori,urlinenumerate(image_urls,1):print(f[{i}/{len(image_urls)}] 下载:{url[:60]}...)ifdownload_image(url,save_dir,headers):success_count1else:fail_count1# 下载间隔time.sleep(random.uniform(0.5,1.5))print(f\n下载完成: 成功{success_count}张失败{fail_count}张)# 使用示例先爬取图片URL列表再批量下载defget_image_urls_from_page(page_url):从页面中提取图片URLheaders{User-Agent:Mozilla/5.0 ...}responserequests.get(page_url,headersheaders)soupBeautifulSoup(response.text,lxml)image_urls[]forimginsoup.select(div.gallery img):srcimg.get(src)orimg.get(data-src,)ifsrcandsrc.startswith(http):image_urls.append(src)returnimage_urls# 主流程# page_url https://example.com/gallery# urls get_image_urls_from_page(page_url)# batch_download_images(urls, save_dirdownloaded_images)多线程加速下载当图片数量多时单线程速度太慢。可以用多线程并发下载。fromconcurrent.futuresimportThreadPoolExecutor,as_completeddefbatch_download_with_threads(image_urls,save_dirimages,max_workers5):多线程批量下载Path(save_dir).mkdir(parentsTrue,exist_okTrue)headers{User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64)}defdownload_task(args):idx,urlargsreturndownload_image(url,save_dir,headers)taskslist(enumerate(image_urls,1))success0withThreadPoolExecutor(max_workersmax_workers)asexecutor:future_to_url{executor.submit(download_task,task):taskfortaskintasks}forfutureinas_completed(future_to_url):idx,urlfuture_to_url[future]try:iffuture.result():success1exceptExceptionase:print(f任务异常:{e})print(f多线程下载完成:{success}/{len(image_urls)})3 实战三爬取表格数据并存入Excel很多网站有表格形式的数据比如排行榜、统计数据等。这个案例演示如何完整爬取这类数据。安装依赖pipinstallopenpyxl pandas爬取天气历史数据importrequestsfrombs4importBeautifulSoupimportpandasaspdfromdatetimeimportdatetimedefcrawl_table_data(url,table_selectortable): 通用表格数据爬取函数 headers{User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36}responserequests.get(url,headersheaders,timeout10)response.encodingutf-8soupBeautifulSoup(response.text,lxml)tablesoup.select_one(table_selector)ifnottable:print(f未找到表格:{table_selector})returnNone# 提取表头headers_rowtable.select(tr:first-child th)ifnotheaders_row:headers_rowtable.select(thead tr th)columns[th.text.strip()forthinheaders_row]# 提取数据行rows[]fortrintable.select(tbody tr):cellstr.select(td)ifcells:row_data[cell.text.strip()forcellincells]rows.append(row_data)ifnotcolumnsornotrows:print(表格数据为空)returnNone# 转换为DataFramedfpd.DataFrame(rows,columnscolumns)returndfdefsave_to_excel(df,filenametable_data.xlsx,sheet_name数据):保存到Excel支持格式美化withpd.ExcelWriter(filename,engineopenpyxl)aswriter:df.to_excel(writer,sheet_namesheet_name,indexFalse)# 获取worksheet对象进行格式调整wswriter.sheets[sheet_name]# 自动调整列宽forcolumninws.columns:max_length0col_lettercolumn[0].column_letterforcellincolumn:ifcell.value:max_lengthmax(max_length,len(str(cell.value)))ws.column_dimensions[col_letter].widthmin(max_length4,30)print(f已保存到{filename})# 多页表格数据爬取defcrawl_multi_page_table(base_url,total_pages,page_parampage):多页表格数据爬取all_data[]forpageinrange(1,total_pages1):urlf{base_url}?{page_param}{page}print(f爬取第{page}页...)dfcrawl_table_data(url)ifdfisnotNone:df[来源页码]page all_data.append(df)importtime time.sleep(1)ifall_data:resultpd.concat(all_data,ignore_indexTrue)print(f共爬取{len(result)}条数据)returnresultreturnNone4 完整项目知乎热榜数据采集importrequestsimportjsonimportcsvfromdatetimeimportdatetimedefcrawl_zhihu_hot(): 爬取知乎热榜接口版本比解析HTML更稳定 # 知乎热榜接口api_urlhttps://www.zhihu.com/api/v3/feed/topstory/hot-lists/totalheaders{User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36,Referer:https://www.zhihu.com/hot,Accept:application/json}params{limit:50,desktop:true}responserequests.get(api_url,headersheaders,paramsparams,timeout10)ifresponse.status_code!200:print(f请求失败:{response.status_code})return[]dataresponse.json()hot_listdata.get(data,[])results[]forrank,iteminenumerate(hot_list,1):targetitem.get(target,{})results.append({排名:rank,标题:target.get(title,),热度:item.get(detail_text,),回答数:target.get(answer_count,0),关注数:target.get(follower_count,0),链接:fhttps://www.zhihu.com/question/{target.get(id,)},采集时间:datetime.now().strftime(%Y-%m-%d %H:%M)})returnresultsdefsave_hot_list(data,filenameNone):ifnotfilename:filenamefzhihu_hot_{datetime.now().strftime(%Y%m%d_%H%M)}.csvwithopen(filename,w,encodingutf-8-sig,newline)asf:writercsv.DictWriter(f,fieldnamesdata[0].keys())writer.writeheader()writer.writerows(data)print(f已保存{len(data)}条热榜数据至{filename})if__name____main__:hot_datacrawl_zhihu_hot()ifhot_data:save_hot_list(hot_data)print(f\n当前热榜前10:)foriteminhot_data[:10]:print(f[{item[排名]}]{item[标题]}-{item[热度]})以上三个案例覆盖了静态爬虫的核心场景。注意在实际使用时需要添加适当的请求延时遵守网站robots.txt规则不要爬取隐私数据。下一章进入爬虫的进阶领域动态网页爬取。

相关新闻

DVD视频备份与MP4格式转换全指南

DVD视频备份与MP4格式转换全指南

1. 从DVD到数字存储:视频备份与格式转换全指南每次整理家里的DVD收藏时,总担心这些珍贵的影像资料会因为碟片老化而消失。上周我就遇到一张十年前的家庭录像DVD无法读取的情况,这促使我系统研究了DVD视频备份的方案。把DVD内容转存到硬盘并转…

2026/10/15 12:21:56 阅读更多 →
企业私有化大模型平台CSGHub架构与落地实践

企业私有化大模型平台CSGHub架构与落地实践

1. 企业私有化大模型平台的战略价值在数字化转型浪潮中,企业级AI基础设施正从"能用"向"可控"演进。CSGHub这类私有化大模型平台的核心价值在于,它让企业摆脱了公有云服务的黑箱限制,实现了从数据预处理、模型训练到推理服…

2026/10/15 16:49:17 阅读更多 →
SM技术全解析:状态机与会话管理的工程实践指南

SM技术全解析:状态机与会话管理的工程实践指南

在技术领域,我们常常会遇到一些看似简单却蕴含深意的缩写和概念。SM 这个组合在计算机科学中有着多重含义,从系统管理到状态机,从安全模型到存储管理,不同的上下文赋予它完全不同的技术内涵。理解这些缩写背后的具体场景&#xff…

2026/10/12 11:26:16 阅读更多 →

最新新闻

一网统飞定义、痛点、逻辑与落地试点

一网统飞定义、痛点、逻辑与落地试点

基层低空政务治理中长期存在一个典型痛点现象:城管、水利、公安、应急、自然资源等政务部门,各自独立采购无人机、机巢、地面站等硬件设备,各自搭建专属管理系统、各自组建运维队伍、各自开展飞行作业。各部门设备独立管控、飞行独立审批、数…

2026/10/15 16:48:54 阅读更多 →
Positron 中的 context7 项目脚手架:解析 project-setup-info-context7 Skill 的加载机制与使用流程

Positron 中的 context7 项目脚手架:解析 project-setup-info-context7 Skill 的加载机制与使用流程

开发工具代码编辑器数据科学 【免费下载链接】positron Positron, a next-generation data science IDE 项目地址: https://gitcode.com/gh_mirrors/po/positron 点击查看 免费下载 GitHub Copilot Chat 内置了一组"代理技能(Agent Skills&#xf…

2026/10/15 16:48:54 阅读更多 →
无线话筒射频链路复现指南:从综合文档到可量产方案

无线话筒射频链路复现指南:从综合文档到可量产方案

简介:这份资源是围绕无线话筒技术整理的综合性文档包,面向音频工程初学者、电子设计爱好者及需要了解无线传输原理的从业者,帮助其系统认识无线话筒的工作机制与工程实现。压缩包共12个文件,约70KB,以Altium Designer工…

2026/10/15 16:48:54 阅读更多 →
Apollo-11项目全解析:从AGC源码复刻到模拟器与教学实践

Apollo-11项目全解析:从AGC源码复刻到模拟器与教学实践

1. 从“Apollo-11”这个名字说起:它到底指什么第一次看到“Apollo-11”这个标题,很多人脑子里蹦出来的第一反应是阿波罗登月计划。这个联想没错,但如果只停留在“登月”这个层面,就完全错过了它在技术圈里真正的分量。在软件工程和…

2026/10/15 16:48:54 阅读更多 →
Web安全实战指南:从漏洞原理到纵深防御体系构建

Web安全实战指南:从漏洞原理到纵深防御体系构建

Web安全这块儿,入行门槛看着不高,但水是真的深。你可能听说过“三百亿条数据泄露”“某大厂被脱库”这类新闻,往深了挖,背后基本都是Web层面的漏洞被利用。无论是刚转行做开发、想往安全方向走的运维,还是已经有几年经…

2026/10/15 16:48:54 阅读更多 →
粮油方向论文降重:三类做法的实际体验对比

粮油方向论文降重:三类做法的实际体验对比

粮油方向的论文,重复率高的地方很固定:国标检测方法的步骤描述、原料特性的通用表述、工艺原理的铺垫段。这三类占了重复的大头。要降得干净,得先分清哪些能改、哪些碰不得。 一、先划"不能改"的线 这一步必须在动手前做&#xf…

2026/10/15 16:47:54 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →