
「AI Python 系列」第 03 栏 · Python 爬虫实战全栏 15 篇 · 零成本跟完 作者梅雅达编程笔记首发CSDN摘要环境搭建其实就三步装库、学看F12、写第一行爬虫代码。本篇带你安装requests/bs4/lxml等核心库手把手教你用浏览器F12分析网络请求和页面结构——这是爬虫最重要的技能没有之一。然后写出第一个爬虫抓取公开页面标题和正文。最后搞懂GET和POST的区别知道什么时候该用哪个。上篇说了爬虫能干啥、不能干啥。今天正式动手。环境搭起来第一个爬虫跑起来你就算入门了。一、安装必要的库打开命令行Windows 用cmd或PowerShellMac 用终端输入pipinstallrequests beautifulsoup4 lxml pandas openpyxl drissionpage装完会看到一堆Successfully installed xxx这就对了。简单说下每个库是干嘛的库用途requests发 HTTP 请求爬虫的手beautifulsoup4lxml解析 HTML从网页里抠出你要的数据pandasopenpyxl数据处理和存 Exceldrissionpage浏览器自动化后面处理动态页面用今天只用前三个后面用到再细说。装完之后验证一下importrequestsfrombs4importBeautifulSoupimportpandasaspdprint(环境 OK)不报错就说明装好了。二、学会用浏览器 F12这比写代码更重要很多新手上来就requests.get()结果抓回来一堆乱码或者空数据。问题出在哪你没看网页到底返回了什么。浏览器 F12 开发者工具是爬虫的眼睛。打开方式Chrome / Edge右键 → 检查或者按 F12Firefox右键 → 检查元素或者按 F12打开之后重点看两个 TabTab 1Elements元素—— 看页面结构这个 Tab 显示的是页面的 HTML 源码。你要从网页里抠数据就得看这里找到数据在 HTML 里的位置。比如打开百度首页你会看到类似这样的结构dividwrapperdividheaddivclasshead_wrapperahrefhttps://www.baidu.comclassmnav新闻/aahrefhttps://www.hao123.comclassmnavhao123/a.../div/div/div你要抓新闻、hao123这些链接就得找它们的标签特征——比如classmnav的a标签。Tab 2Network网络—— 看请求和响应这个 Tab 记录浏览器发出的所有请求。你刷新页面会看到一堆请求列出来。重点关注Name请求的 URLStatus状态码200 是成功404 是没找到403 是被拒绝Type请求类型document 是主页面xhr/fetch 是 Ajax 请求后面专门讲Size响应大小Time耗时点击某一条请求右边会显示详情Headers请求头和响应头Preview / Response响应内容HTML 或 JSON爬虫出问题的时候第一时间看 Network请求发出去了没状态码是多少返回的内容对不对90% 的问题都能在这找到答案。三、第一个爬虫抓取页面标题和正文来写一个真正的爬虫。目标抓取一个公开页面的标题和主要正文内容。我们用 Python 官方文档的首页做演示https://docs.python.org/3/第一步发请求拿到 HTMLimportrequests urlhttps://docs.python.org/3/responserequests.get(url)# 查看状态码print(f状态码{response.status_code})# 查看返回的内容HTMLhtmlresponse.textprint(fHTML 长度{len(html)}字符)print(html[:500])# 打印前 500 个字符看看运行这段代码你会看到状态码200 HTML 长度xxxxx 字符 !DOCTYPE html...状态码 200 表示请求成功response.text就是返回的 HTML 源码。第二步解析 HTML提取标题和正文拿到 HTML 之后要从里面抠出你要的数据。这时候BeautifulSoup上场frombs4importBeautifulSoup# 用 BeautifulSoup 解析 HTMLsoupBeautifulSoup(html,lxml)# 提取标题titlesoup.title.stringprint(f页面标题{title})# 提取主要正文内容Python 文档首页的主要内容在 idpython-documentation 的 div 里main_contentsoup.find(div,idpython-documentation)ifmain_content:# 获取所有段落文本paragraphsmain_content.find_all(p)forpinparagraphs[:5]:# 先看前 5 段print(p.get_text(stripTrue))else:print(未找到主内容区域)运行结果大概是页面标题3.14.6 Documentation Welcome! This is the official documentation for Python 3.14.6. Documentation sections: Other resources: Indices, glossary, and search: ...搞定。你刚写了第一个爬虫。完整代码把上面两段合在一起加上注释 Day 02 示例代码抓取 Python 官方文档首页的标题和正文 作者梅雅达编程笔记 importrequestsfrombs4importBeautifulSoup# 1. 发请求设置超时时间防止无限等待urlhttps://docs.python.org/3/try:responserequests.get(url,timeout10)exceptrequests.exceptions.Timeout:print(f请求超时{url})exit()exceptrequests.exceptions.ConnectionError:print(f连接失败{url}请检查网络)exit()exceptExceptionase:print(f请求异常{e})exit()ifresponse.status_code!200:print(f请求失败状态码{response.status_code})else:# 2. 解析 HTMLhtmlresponse.text soupBeautifulSoup(html,lxml)# 3. 提取标题titlesoup.title.stringprint(f页面标题{title})print(-*50)# 4. 提取主内容页面结构可能变化使用多种选择器尝试main_contentsoup.find(div,class_body)ifnotmain_content:main_contentsoup.find(main)ifnotmain_content:main_contentsoup.find(div,idpython-documentation)ifmain_content:paragraphsmain_content.find_all(p)print(f找到{len(paragraphs)}个段落前 5 段内容)print()fori,pinenumerate(paragraphs[:5],1):textp.get_text(stripTrue)print(f[段落{i}]{text})else:print(未找到主内容区域)四、GET 和 POST什么时候用哪个刚才用的是requests.get()这是最常见的请求方式。HTTP 协议有几种请求方法最常用的是 GET 和 POST方法用途例子GET获取数据打开网页、搜索参数在 URL 里POST提交数据登录、表单提交参数在请求体里GET 请求你平时浏览网页99% 都是 GET。你访问一个 URL服务器返回页面内容。如果 URL 带参数长这样https://www.baidu.com/s?wdpythonwdpython就是参数表示搜索关键词是python。在requests里GET 请求可以这样传参数建议加上超时设置importrequests params{wd:python}try:responserequests.get(https://www.baidu.com/s,paramsparams,timeout10)print(fGET 请求状态码{response.status_code})exceptrequests.exceptions.RequestExceptionase:print(fGET 请求失败{e})效果跟直接访问https://www.baidu.com/s?wdpython一样。POST 请求登录、提交表单的时候通常用 POST。参数不会出现在 URL 里而是放在请求体body里。importrequests data{username:test,password:123456}try:responserequests.post(https://example.com/login,datadata,timeout10)print(fPOST 请求状态码{response.status_code})exceptrequests.exceptions.RequestExceptionase:print(fPOST 请求失败{e})怎么判断一个请求该用 GET 还是 POST打开浏览器 F12 的 Network Tab刷新页面或者操作一下看对应请求的 Method 列显示 GET → 用requests.get()显示 POST → 用requests.post()别猜看浏览器怎么发的你就怎么发。五、实战练手抓取一个公开榜单来做一个稍微完整的例子抓取新浪新闻首页的热点新闻标题和链接。新浪新闻https://news.sina.com.cn/是国内最大的新闻门户网站之一首页会展示最新的热点新闻。分析页面结构打开新浪新闻首页F12 看Elements热点新闻的结构大致是ahrefhttps://news.sina.com.cn/xxxclasslinkNewsTopBold新闻标题/a标题在classlinkNewsTopBold的a标签里。写代码 Day 02 练手抓取新浪新闻首页热点新闻标题和链接 作者梅雅达编程笔记 importrequestsfrombs4importBeautifulSoup urlhttps://news.sina.com.cn/# 设置请求头伪装成浏览器headers{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}try:responserequests.get(url,headersheaders,timeout10)response.encodingresponse.apparent_encoding# 自动检测编码exceptrequests.exceptions.Timeout:print(f请求超时{url})exit()exceptrequests.exceptions.ConnectionError:print(f连接失败{url}请检查网络)exit()exceptExceptionase:print(f请求异常{e})exit()ifresponse.status_code!200:print(f请求失败状态码{response.status_code})exit()soupBeautifulSoup(response.text,lxml)# 找到所有热点新闻链接news_linkssoup.find_all(a,class_linkNewsTopBold)# 过滤空标题和重复链接filtered_news[]seen_hrefsset()forlinkinnews_links:titlelink.get_text(stripTrue)hreflink.get(href)# 跳过空标题或无效链接ifnottitleorlen(title)5ornothref:continue# 跳过重复链接ifhrefinseen_hrefs:continueseen_hrefs.add(href)filtered_news.append({title:title,href:href})print(f首页共{len(filtered_news)}条热点新闻)print()fori,newsinenumerate(filtered_news[:15],1):print(f{i:2d}.{news[title]})print(f 链接{news[href]})print()运行之后你会看到热点新闻的标题和链接整齐地打印出来。这就是爬虫的基础流程分析页面结构 → 找到数据位置 → 用代码提取→ 数据清洗。六、注意事项1. 编码问题有时候抓回来的内容是乱码多半是编码不对。大多数现代网站用 UTF-8但也有些老网站用 GBK。requests默认按response.encoding解码但有时候不准。解决方法importrequeststry:responserequests.get(url,timeout10)response.encodingresponse.apparent_encoding# 自动检测编码htmlresponse.textexceptrequests.exceptions.RequestExceptionase:print(f请求失败{e})2. 请求头有些网站会检查你是不是浏览器。如果请求头太简单可能会被拒绝。最简单的伪装importrequests headers{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}try:responserequests.get(url,headersheaders,timeout10)exceptrequests.exceptions.RequestExceptionase:print(f请求失败{e})这个 User-Agent 表示我是 Chrome 浏览器。3. 请求频率不要一秒发几十次请求人家服务器扛不住。importrequestsimporttimeforurlinurls:try:responserequests.get(url,timeout10)print(f请求{url}状态码{response.status_code})exceptrequests.exceptions.RequestExceptionase:print(f请求{url}失败{e})time.sleep(1)# 每次请求间隔 1 秒养成好习惯别给人添麻烦。 本篇成本透明栏项目数值API 调用次数0消耗 Token0成本¥0本篇纯本地操作不需要任何 API Key。练手改造题**改造 1基础修改新浪新闻的代码把新闻标题和链接存到一个列表里然后打印成 Markdown 格式[标题](链接)。。改造 2进阶用 F12 分析一个你喜欢的网站比如 CSDN 首页、知乎热榜、新华网看看文章/话题的标题在 HTML 里的位置尝试用BeautifulSoup提取出来。提示先用Elements Tab找到数据所在的标签和class/id。下期预告Day 03 · 列表页抓取批量拿数据今天抓了一个页面明天批量抓。列表页的结构分析、CSS 选择器和XPath的高级用法、数据清洗去空值、去重、格式化。从抓一条到抓一百条。 资源与工具requests 文档https://docs.python-requests.org/zh_CN/latest/BeautifulSoup 文档https://www.crummy.com/software/BeautifulSoup/bs4/doc/Chrome DevTools 教程https://developer.chrome.com/docs/devtools/F12 工具的官方文档本专栏配套代码CSDN 下载区每篇更新梅雅达编程笔记专注 Python AI 实战教程提供数据采集与自动化定制服务梅雅达编程笔记只教能落地的东西 往期回顾Day 01 · 爬虫能干啥不能干啥下一篇Day 03 · 列表页抓取批量拿数据专栏订阅「Python 爬虫实战」©️ 梅雅达编程笔记原创 · 首发 CSDN · 转载请注明出处