老wu最近在查阅一份技术资料,该资料内容仅提供在线的网页浏览方式,并且需要通过账号登录之后才有权限进行内容浏览。每次浏览都需要登录嫌麻烦不说,老wu还担心后续账号权限被撤销就再也无法查阅内容了,所以,将在线内容保存到本地才是王道。好在该资料对内容的复制不做任何限制,将网页内容复制并粘贴到老wu目前在用的Typora这款markdown编辑工具中,可以很好保持原文的图文排版,并且图片也可以一并缓存到本地。
但问题是,该资料的网页页面太多了,有好几千个页面,手动复制粘贴感觉太枯燥,效率也不高,需要好几天才能完成,这时老wu自然就想到用爬虫来抓取内容。当然,老wu之前只知道有爬虫可以抓取内容,老wu的博客网站就经常被各种爬虫把CPU负载拉满,所以之前一直关注的是如何防范爬虫,至于如何使用爬虫来抓取内容倒是没怎么研究过。
按以往的模式,在没有经验的情况下,用python开发一款爬虫程序,老wu通常会去谷歌上搜索现成的代码,这些代码要么是github上的项目,要么是各种论坛或者博客的分享。当然,别人分享的代码即使可以顺利运行,其功能也不一定适合自己的需求,所以搜索代码,修改代码然后测试,然后再继续搜索和验证,一番折腾下来估计得花三四天的时间吧。
不过现在不一样了,现在有了豆包的AI编程,老wu只需要把程序的逻辑需求给到豆包AI,豆包AI在短短几秒内就能给出完整的可执行的代码,简直就是革命性的生产力提升!
以下是老wu调戏,不对,是调试豆包AI的过程,也作为老wu的备忘录记录下。
akol1fjv3sf6402420548.png
首先,老wu投喂给豆包AI提示词:
“请帮我用 Python 生成一个网页内容爬取程序,网页的链接为https://abc.com/browse_item.php?id=1逐步递增到https://abc.com/browse_item.php?id=8216,提取内容为markdown格式,特别提示:该网站需要登录之后才有权限浏览内容,登录的链接为:https://abc.com/Login.php,能否在爬取之前先通过浏览器进行登录,然后使用浏览器登录后的会话进行内容的爬取,提取所有网页的内容归档到同一个markdown文件中,文件名为doc.md,需要提取的是网页中的#workingarea选择器内的内容,其中的#workingarea > div.item_question中的内容添加H3标题格式,跳过#workingarea > div.item_params的内容无需提取,提取#workingarea > div.item_answer内的内容为正文部分。”
然后豆包给出了解决方案:
要实现这个需求,我们可以使用selenium库来模拟浏览器登录,并获取登录后的会话,然后使用BeautifulSoup库来解析网页内容。以下是具体的实现步骤和代码:
安装依赖库
首先,确保你已经安装了所需的库:
pip install selenium beautifulsoup4另外,你还需要下载对应浏览器的驱动,例如 Chrome 浏览器需要下载 ChromeDriver,下载地址:ChromeDriver 下载,下载后将驱动的可执行文件路径配置到系统环境变量中。
ps:这里下载的ChromeDriver需要与您电脑上安装的Chrome 浏览器的主版本号保持一致,比如老wu写这篇文章时ChromeDriver的Last updated版本为133.0.6943.53,那么您电脑上Chrome主版本号也需要更新到对应的133.xxx版本。
代码实现
import timefrom selenium import webdriverfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.chrome.service import Servicefrom bs4 import BeautifulSoup
# 配置 ChromeDriver 路径chrome_driver_path = 'path/to/chromedriver' # 请替换为你的 ChromeDriver 实际路径service = Service(chrome_driver_path)driver = webdriver.Chrome(service=service)
# 登录页面 URLlogin_url = 'https://abc.com/Login.php'driver.get(login_url)
# 等待用户手动登录input("请在浏览器中完成登录,登录完成后按回车键继续...")
# 初始化 Markdown 内容markdown_content = ""
# 循环爬取网页内容for id in range(1, 8216): url = f'https://abc.com/browse_item.php?id={id}' driver.get(url) time.sleep(2) # 等待页面加载
# 获取页面源代码 page_source = driver.page_source soup = BeautifulSoup(page_source, 'html.parser')
# 找到 workingarea 元素 working_area = soup.find('div', id='workingarea') if working_area: # 提取问题 question_div = working_area.find('div', class_='item_question') if question_div: question = question_div.get_text(strip=True) markdown_content += f'### {question}
'
# 提取答案 answer_div = working_area.find('div', class_='item_answer') if answer_div: answer = answer_div.get_text(strip=True) markdown_content += f'{answer}
'
# 关闭浏览器driver.quit()
# 将 Markdown 内容保存到文件with open('doc.md', 'w', encoding='utf-8') as f: f.write(markdown_content)
print("爬取完成,内容已保存到 doc.md 文件中。")
代码说明登录部分:使用selenium打开登录页面,等待用户手动完成登录操作,用户登录完成后按回车键继续。循环爬取:使用for循环遍历id从 1 到 8216的所有网页,依次打开网页并等待页面加载。内容提取:使用BeautifulSoup解析页面源代码,找到#workingarea元素,提取#workingarea > div.item_question和#workingarea > div.item_answer的内容,并添加相应的 Markdown 格式。保存文件:将提取的 Markdown 内容保存到doc.md文件中。
[/ol]
注意事项
请将chrome_driver_path替换为你实际的 ChromeDriver 路径。由于网站可能存在反爬机制,爬取过程中可能会遇到验证码或其他限制,需要根据实际情况进行处理。爬取过程中可能会因为网络问题或页面加载缓慢导致提取内容失败,你可以适当调整time.sleep()的时间。
豆包给出的代码可以运行,但获取的结果老wu发现有点问题,这是老wu给的提示词不够准确,接着老wu再次提供了修正后的提示词:
“修改一下上边的需求,需要提取的是网页中的[td]内的内容,其中的 提取为纯文本,并转换为markdown的H3标题格式,跳过的内容无需提取,提取内的内容为正文部分并保留原来html格式。其中的图片的src如果是相对路径的,如src="/images/11.png",则替换为绝对路径如:“https://abc.com/images/11.png”,提取内的内容为正文部分并保留原来html格式。”
然后豆包给出了修改后的代码,这回就完美解决了老wu的需求,包括程序的运行验证总共花了不到10分钟的时间搞定。ps:当然,这不包括实际抓取八千多页内容的时间,因为程序里设置了“time.sleep(2) # 等待页面加载”的等待逻辑,同时也可以避免触发服务器那边的反爬虫机制吧。
豆包根据修改后的提示词给出了修正后的代码:
printf("hello world!");import timefrom selenium import webdriverfrom selenium.webdriver.chrome.service import Servicefrom bs4 import BeautifulSoup
# 请将此路径替换为你本地 ChromeDriver 的实际路径chrome_driver_path = 'path/to/chromedriver'service = Service(chrome_driver_path)driver = webdriver.Chrome(service=service)
# 登录页面的 URLlogin_url = 'https://abc/Login.php'driver.get(login_url)
# 等待用户手动完成登录操作input("请在浏览器中完成登录,登录完成后按回车键继续...")
# 初始化用于存储 Markdown 内容的字符串markdown_content = ""# 基础 URL,用于将图片的相对路径转换为绝对路径base_url = "https://abc.com"
# 循环爬取从 id=1 到 id=8216 的网页内容for id in range(1, 8216): url = f'https://abc/browse_item.php?id={id}' driver.get(url) # 等待页面加载完成 time.sleep(2)
# 获取当前页面的源代码 page_source = driver.page_source # 使用 BeautifulSoup 解析页面源代码 soup = BeautifulSoup(page_source, 'html.parser')
# 查找 td 标签且 id 为 workingarea 的元素 working_area = soup.find('td', id='workingarea') if working_area: # 提取问题部分,转换为纯文本并添加 Markdown 的 H3 标题格式 question_div = working_area.find('div', class_='item_question') if question_div: question_text = question_div.get_text(strip=True) markdown_content += f'### {question_text}
'
# 提取答案部分,处理图片的相对路径并保留 HTML 格式 answer_div = working_area.find('div', class_='item_answer') if answer_div: for img in answer_div.find_all('img'): src = img.get('src') if src and src.startswith('/'): img['src'] = base_url + src answer_html = str(answer_div) markdown_content += f'{answer_html}
'
# 提取 r_linx 部分,处理图片的相对路径并保留 HTML 格式 r_linx_div = working_area.find('div', class_='r_linx') if r_linx_div: for img in r_linx_div.find_all('img'): src = img.get('src') if src and src.startswith('/'): img['src'] = base_url + src r_linx_html = str(r_linx_div) markdown_content += f'{r_linx_html}
'
# 关闭浏览器driver.quit()
# 将提取并处理好的 Markdown 内容保存到文件中with open('doc.md', 'w', encoding='utf-8') as f: f.write(markdown_content)
print("爬取完成,内容已保存到 doc.md 文件中。")
然后,我们还可以让豆包对刚才生成的代码给出详细的分析,比如我们后续可以继续投喂提示词,如:
“基于最后一次的代码给出脑图”
jfvoh230htg6402420648.png
写在最后
AI已来,其正以前所未有的速度渗透到我们生活和工作的方方面面,比如这次,老wu不用敲一行代码也不用任何的搜索,就能让AI生成完全符合老wu需求的python爬虫程序,感觉比老wu自己写的程序都好用。老wu也真切地感受到了AI浪潮带来的革命性的冲击,焦虑与迷茫也随之而来,也就是担心自己会被 AI 替代,毕竟,AI 在代码生成、测试等方面展现出了强大的能力,PCB layout目前还好,但各大EDA厂商也正在加大力度开发基于AI的PCB Layout功能。
焦虑是面对变革时的正常情绪反应,克服焦虑的关键在于积极主动地去应对 AI 带来的变化。就好像百年前的黄包车夫面对汽车时代的来临,你必须调整心态和技能去适应新的时代的来临,比如黄包车夫可以考取驾照后成为出租车司机,并利用自己对城市道路熟悉的优势,地图上没有标注的小巷子你都能给客人带到,
5mbe4csqsa52_062420748.png
照样不会被时代所淘汰。
AI 时代既充满了挑战,也蕴藏着无限机遇,调整心态、拥抱 AI 是顺应时代发展的必然选择,共勉。 |