引言

最近在做一个项目,需要定期抓取一些国外新闻网站的最新资讯,整理成结构化数据用于后续分析。结果刚写好爬虫没几天IP就没法用了,网页还经常改版,调试起来头都大了。想省点事,就开始研究能不能用AI来辅助爬虫开发,再配合个靠谱的代理服务,把这流程跑通。正好发现了一个叫Crawl4AI的框架,它能用大模型自动解析网页内容,加上netnut提供的海量IP,最后再让AI帮我把结果提取成JSON格式。接下来就带大家一步步搭建这套“能跑、能变通、还能提炼”的智能化采集流程,适合像我一样想高效搞定数据抓取的朋友。

https://netnut.cn/?utm_medium=influ&utm_source=yanqianyunhttps://netnut.cn/?utm_medium=influ&utm_source=yanqianyun

准备爬虫

其实我们最开始也考虑过用传统的爬虫框架,比如Scrapy、Selenium、Playwright这些老三样,写起来也都比较灵活。但问题是,现在很多网站的结构变得越来越复杂,页面元素是动态加载的,还会频繁调整 HTML 结构,尤其是新闻类页面,隔三差五改一次版。这就导致你写好的XPath或CSS Selector很容易失效,每次都得重新调试,特别浪费时间。相比之下,Crawl4AI最大的优势是用大模型自动理解页面结构,不需要你手动去扒标签或者写提取规则。它对结构不稳定、样式复杂的页面适应性更强,对于像我们这种只是想抓点数据、不想维护一堆代码的人来说,真的是省心太多了。我们先来安装Crawl4AI。

使用命令pip install crawl4ai,之后耐心等待下载和编译。

由于Crawl4AI使用Playwright框架作为底层,所以我们还需要运行playwright install来下载浏览器内核。完成之后即可开始编写程序。

Crawl4AI的用法十分简单,通过一个异步爬虫,将目标网站交给他,就可以通过LLM自动提取页面元素,然后以Markdown格式输出。这里我们用NBC新闻试一下。

有标题,有简介,有链接,效果还是非常好的。但如果你再运行几次就会发现突然结果变成了验证信息,这是由于我们短时间内访问次数过多,被识别成了网络爬虫。这时就需要使用代理来适时切换IP地址,防止单一IP短时间多次访问。

选购代理

接下来,我们来采购代理。这次我们选用的是netnut,它是一家比较小众的专业IP服务商,产品价廉物美、量大管饱。除了代理业务外,他还提供了网站解锁器、搜索引擎集成API,这些都是适合新手很实用的爬虫工具。登录账号以后,选择旋转住宅代理IP进入采购页面。

旋转住宅代理IP会在设定的时间间隔内自动更换IP地址,大大降低了被检测或封锁的风险,比较适合爬虫使用。这三种套餐只有带宽不同,我们根据自己的并发数选购即可。这里我们选择基本版。

之后按照提示填写自己的账单信息,然后付款即可。

采购成功后,我们会在我的产品中看到选购的产品状态,同时我们会收到一封邮件,里面包括了连接代理所需的IP地址、端口号、用户名。

这里需要注意的是代理连接的密码要在设置中生成,如果遗忘了就只能重置了。

集成代理

复制好自己的IP地址、端口号、用户名密码,按照下图的格式填写,即可开始将它集成到爬虫程序中。这里需要注意我们采用的是HTTP代理。

通过构造BrowserConfig对象,将刚才复制的信息填入对应的位置。然后在运行爬虫对象的时候,通过config参数传入代理对象即可。再运行一下,发现又可以采集到数据了。

接入AI

接下来,我们还需要处理结果,将有用的数据采集出来,并转换为标准数据格式。这个任务也可以交给AI处理,我们先将结果复制下来,复制到任意的AI聊天窗口中,增加提示词:从上面的文本中提取新闻的标题、链接、所属板块、发布时间,将结果编写为一个json文件,格式为[{"title": ???, "time": ???, "topic": ???, "url": ???}, ...],没有提取到的数据保持为空,不要新增数据。

可以看到,提取的效果非常好。那么接下来我们需要将AI工具集成到代码中。

集成AI

首先我们需要安装OpenAI包:pip install openai。通过这个包可以使用OpenAI标准格式与各大AI工具的API接口通讯。接下来我们来构造与API通讯的信息。

首先要通过 API 密钥和接口地址创建一个连接混元的客户端,然后指定要使用的模型版本,把用户的问题打包成消息发过去,并附加一个“增强理解”的参数以提高回答质量。最终,AI的回复会保存在completion变量中,后续可以继续处理或输出。方便起见,我们通过一个函数,调整message中的prompt来向API接口发送消息。这里只需要我们填入自己选择的AI工具和API密钥即可。不过这种方式是不能读取历史对话的,适合爬虫这样的单次任务。

接下来我们在爬虫获取到数据后,将数据拼接上面的提示词发给AI工具。这里我选用的是腾讯浑元,运行一下看看效果。

可以看到结果非常成功。完整代码如下:

import asyncio
from openai import OpenAI
from crawl4ai.async_configs import BrowserConfig
from crawl4ai import AsyncWebCrawler
 
browser_config = BrowserConfig(proxy="xxx") # 填自己的代理
def send2ai(prompt='this is a test.'):
    # 构造 client
    client = OpenAI(
        api_key="xxxx",  # 混元 APIKey
        base_url="https://api.hunyuan.cloud.tencent.com/v1", 
    )
    completion = client.chat.completions.create(
        model="hunyuan-turbos-latest",
        messages=[
            {
                "role": "user",
                "content": prompt
            }
        ],
        extra_body={
            "enable_enhancement": True,  # <- 自定义参数
        },
    )
    return completion.choices[0].message.content
 
async def main():
    async with AsyncWebCrawler(config=browser_config) as crawler:
        result = await crawler.arun(
            url="https://www.nbcnews.com/business",
        )
        print(send2ai(result.markdown + r'从上面的文本中提取新闻的标题、链接、所属板块、发布时间,将结果编写为一个json文件,格式为[{"title": ???, "time": ???, "topic": ???, "url": ???}, ...],没有提取到的数据保持为空,不要新增数据。'))
 
if __name__ == "__main__":
    asyncio.run(main())

总结

这一套从爬虫框架到代理接入、再到AI提取数据的流程,基本能满足大部分“边爬边清洗”的需求了,跑起来也比较稳。不过也还有些地方可以继续优化,比如结果存储这块可以接数据库,AI提取部分也能加个错误容错机制,防止抽风输出;另外多站点并发采集、动态切换IP的策略,也可以搞得更智能些。后面我也会继续折腾这些细节,如果你对这个流程感兴趣、或者想看我怎么把它和可视化、分析模型串起来,记得点个关注,我们一起摸索更省事的数据玩法!最近netnut正在搞国庆限时推广活动,有兴趣的小伙伴不妨借此机会体验一下!

Logo

为武汉地区的开发者提供学习、交流和合作的平台。社区聚集了众多技术爱好者和专业人士,涵盖了多个领域,包括人工智能、大数据、云计算、区块链等。社区定期举办技术分享、培训和活动,为开发者提供更多的学习和交流机会。

更多推荐