Python 爬虫实战:如何爬取网站文章并保存到 Excel
如何爬取网站文章并保存到 Excel
嘿哟!疯狂星期五!!!
这周的工作也将画上个句号,我正准备着享受周末的时光!
今晚!将是个不眠之夜!!!
谁曾想,我的上司急匆匆地向我奔来,就差点把焦急写在脸上。
一、紧急任务来袭/天降大任于斯人也
事情是这样的。说他刚接到一个重要项目,需要在最短的时间内从一个网站上爬取所有文章,并将这些文章保存到 Excel 文档中。这些文章将被用于训练一款专门为各领域编写论文的AI模型,而AI模型的交付日期已经迫在眉睫。
今晚!将是个不眠之夜?!!
二、项目需求
- 项目经理给予了一个具体的任务,需要从目标网站(IvyPanda)中获取所有的文章信息,并存储到 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 文件中。
存储结果 展示
六、实战演示
完整演示视频,请查看:
Python 爬虫实战:如何爬取网站文章并保存到 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领域的发展做出了一定的贡献。