Python 爬虫实战:如何爬取网站文章并保存到 Excel
嘿哟!疯狂星期五!!!
这周的工作也将画上个句号,我正准备着享受周末的时光!
今晚!将是个不眠之夜!!!
谁曾想,我的上司急匆匆地向我奔来,就差点把焦急写在脸上。

一、紧急任务来袭/天降大任于斯人也
事情是这样的。说他刚接到一个重要项目,需要在最短的时间内从一个网站上爬取所有文章,并将这些文章保存到 Excel 文档中。这些文章将被用于训练一款专门为各领域编写论文的AI模型,而AI模型的交付日期已经迫在眉睫。
今晚!将是个不眠之夜?!!

二、项目需求
-
• 项目经理给予了一个具体的任务,需要从目标网站(IvyPanda: https://ivypanda.com/essays/all/)中获取所有的文章信息,并存储到 Excel 文档中。
-
• 将主分类作为 Excel 文档的名称,子分类作为 Sheet 的名称,进行规范性分类。
-
• 需要过滤掉文章中所有的 ‘FAQ’, ‘Reference’, ‘Bibliography’, ‘Works Cited’ 等内容
-
• 只保存 200-2000 词以内的文章
-
• 这些文章将被用于训练一个AI模型,从而输出各领域的论文内容。
三、技术方案
编程语言和框架
- Python(通过 Selenium 自行封装框架使用)
第三方库
- Selenium (访问网站 -> 提取信息 -> 遍历文章 -> 定位内容)
- BeautifulSoup (提取元素)
- openpyxl (存储数据至Excel)
四、爬虫实现
时间紧任务重,我选择使用Python语言来实现爬虫,我的核心想法如下:

1、通过自己提前封装好的 Selenium 库完成整次爬虫流程。
2、获取网页中所有分类文章主分类和子分类,并提取出子分类的跳转链接。
3、遍历所有跳转链接并依次访问,提取文章详情链接并访问。
4、遍历访问文章详情链接,提取文章内容并保存到 Excel 表格的 sheet 中。
5、流程完成。
class BasePage(object):
def open_browser(self):
"""打开浏览器"""
self.driver = webdriver.Chrome()
self.driver.maximize_window()
self.driver.implicitly_wait(20)
return self.driver
def get_url(self, url):
"""加载网址的"""
self.driver.get(url)
def wait_element(self, location):
"""
功能:等待元素的出现,引入显示等待机制
原理:总共等待10s,每0.5找一次,看元素是否存在,如果存在,则直接返回。并不会一直等待10s
如果10s到了,元素还未找到,则会抛出异常,处理异常
:param location:
:return:
"""
try:
element =WebDriverWait(self.driver,10,0.5).until(lambda x: x.find_element(*location))
return element
except NoSuchElementException as e:
print(f'元素定位失败:{e}')
def input_element(self, location, value):
"""向某个元素中输入内容"""
# 1,找元素(调用等待元素的方法)
element = self.wait_element(location)
# 2,输入值
element.send_keys(value)
def click_element(self, location):
"""对某个元素进行点击动作"""
self.wait_element(location).click()
# 其他代码略
完整演示代码,请查看:
https://gist.github.com/YANGoio010/508ef339489b689413eac6b1766d1d90
五、数据存储
将爬取到的文章信息存储到 Excel 文档中,可以方便后续的数据处理和 AI 模型训练。使用 Python 的 Openpyxl 库可以轻松实现将数据写入 Excel 文件中。
存储结果 展示

六、实战演示
七、踩坑点
-
• 本地网速过慢,网页加载过时,导致脚本报错中止。
-
• 脚本长时间执行可能会出现 timeout 的情况,导致脚本报错中止。
-
• 数据存储,sheet的名称可能会存在过长的情况,保存时不会报错,但读取时却会报错。
-
• 当元素无法正常定位时,需要注意定位的元素是否在 iframe 中,需要进入到 iframe 中才能正确定位。
-
• 使用 requests 库进行爬虫时,需要注意为请求增加 timeout 参数,避免请求过多未释放达到上限导致脚本报错中止。
-
• 数据提取,这部分操作需要多关注,网站中会夹杂了各式各样的广告、弹窗等无关内容,若没有加以处理随时都会导致脚本报错中止。
-
• 爬虫过程中,会高频率访问网站,部分网站存在限制访问频率的防爬机制,因此我们可以加入 time.sleep() 进行强制等待放缓爬虫速度。
-
• 使用 Selenium 库进行爬虫时,若定位的元素不存在页面上时,会出现无法定位成功的情况,此时我们只需要将页面操作通过传入 js脚本 下滑等操作,让页面移动到元素出现在页面中即可。
八、爬虫小技巧
-
• 罗列操作流程,将每个重点步骤封装函数,方便函数的多次调用(提取文章操作、保存数据操作等)
-
• F12 抓包观察接口返回的数据,若没有接口直接返回你想要的数据,则采用 Selenium 库 直接对页面进行爬虫;若有,则使用 requests 进行爬虫。
-
• Pycharm 中返回的数据往往都是一大坨,很难进行元素定位或接口数据的提取,因此我们只需要直接扔给GPT完成提取即可。
-
• 采用 Selenium 库时,优先使用 XPATH 定位,因为 XPATH 可以说就是万金油,只要没有动态ID,那就 98% 能够精准定位。
-
• 若 XPATH 中包含了动态ID,则直接使用 FULL XPATH 完成定位,主打一个效率高,不用思考。
-
• Selenium 框架有一个比较坑的一点,在脚本执行结束后会自动关闭浏览器,对于正在调试脚本中的我们是十分不友好的,因此我们可以通过在结尾加入 input() 将页面有效停滞在你所期待的位置。
-

九、任务圆满完成
脚本撸完!接下来就是我翘起二郎腿等待脚本执行完毕的时刻!!!
终于在数个小时后完成上司交给我的任务,爬虫执行成功后文档规整的分类,琳琅满目十几万条数据,打心底里的那种成就感和来自上司的夸赞所带来的成就感是无所言语的!
爬取到的文章信息成功保存到Excel文档中,并用于训练AI模型。这个项目不仅提升了我对爬虫技术和数据处理的能力,还为AI领域的发展做出了一定的贡献。

十、总结与展望
这个项目的成功不仅是团队合作的成果,也是我们公司对技术不断追求和创新的体现。在这里,我想简单介绍一下我们的超绝乐豆和我们所提供的超强服务。
十一、公司介绍
我们是 Beansmile,一家有超过10年经验的软件开发公司,专注于为中国市场消费者提供技术解决方案。作为微信认证合作伙伴,我们不仅提供全面的微信服务,还开发iOS/Android/网页应用,结合国际设计师和营销专家的全球知识,专门为中国用户定制。我们特别擅长为希望进入中国市场的海外客户提供技术解决方案,包括微信官方账号和小程序服务,并提供定制的iOS、Android和Web应用开发服务。我们的营销团队对中国市场了如指掌,确保提供既有效又具文化相关性的策略。希望以上分享对您有所帮助,欢迎交流分享更多技术心得!如需更多信息,请访问我们的官方网站。