Colab运行dryscrape爬虫时已安装xvfb仍提示找不到是什么原因?
问题根因
报错的核心原因是你仅安装了Python侧的xvfbwrapper依赖,没有安装系统层面的Xvfb二进制程序及相关X11运行依赖,dryscrape调用系统可执行文件时找不到对应程序触发报错。此外你的代码存在重复启动Xvfb、重复创建会话的逻辑问题,也会引发运行异常。
修复步骤
- 第一步:先安装系统级的Xvfb及相关依赖,在Colab代码块最开头执行如下命令:
!apt update !apt install -y xvfb libxkbcommon-x11-0 libxcb-icccm4 libxcb-image0 libxcb-keysyms1 libxcb-randr0 libxcb-render-util0 libxcb-xinerama0 libxcb-xfixes0
- 第二步:调整代码逻辑,将
dryscrape.start_xvfb()和会话创建逻辑移到for循环外,避免重复启动和创建。
修正后完整代码
# 系统依赖安装 !apt update !apt install -y xvfb libxkbcommon-x11-0 libxcb-icccm4 libxcb-image0 libxcb-keysyms1 libxcb-randr0 libxcb-render-util0 libxcb-xinerama0 libxcb-xfixes0 # Python依赖安装 !pip install git+https://github.com/niklasb/webkit-server.git@refs/pull/35/head !pip install dryscrape beautifulsoup4 requests xvfbwrapper # 导入依赖 from xvfbwrapper import Xvfb from datetime import datetime import dryscrape from bs4 import BeautifulSoup import requests # 提前启动Xvfb,仅执行一次即可 dryscrape.start_xvfb() # 提前创建会话,复用即可提升爬取效率 session = dryscrape.Session() olderNews = False stories_list = [] for i in range(0, 450): url = "https://www.efsyn.gr/search?created%5B0%5D=2021-01-01&created%5B1%5D=2021-09-13&field_anonymous_author=&field_author=All&field_category=All&keywords=covid&sort_by=created&page=" + str(i) session.visit(url) response = session.body() doc = BeautifulSoup(response) stories = doc.findAll('article', { 'class': 'default-teaser__article' }) print(stories) for story in stories: dt = story.find('time', {'class': "default-teaser__date default-date"}) print(dt.text) parsed_dt = datetime.strptime(dt.text, "%d.%m.%Y, %H:%M") print(parsed_dt) if parsed_dt.date() >= datetime(2021, 1, 1).date(): headline = story.find('div', {'class': 'default-teaser__title'}) link = story.find('a', {'class': 'full-link'}) abstract = story.find('div', {'class': 'default-teaser__summary'}) story_dict = { "headline": headline.text.strip(), "url": link['href'].replace('\r', ''), "summary": abstract.text.replace('\r', '').replace('\n', ''), "date": parsed_dt.strftime('%d.%m.%Y').replace('\n', '') } stories_list.append(story_dict) print(story_dict, sep='\n') print("===") else: print("END OF SCRAPING") olderNews = True break if olderNews: break
内容的提问来源于stack exchange,提问作者user17001824
相关产品推荐
相关产品推荐

