谢乾坤 | Kingname

给时光以生命。

假设你正在写后端代码,其中一个函数的功能是传入文章id,返回文章详情。因为项目比较大,因此在定义函数时,把类型标注加上,标明了参数的类型和返回的类型。例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
from typing import List
from dataclasses import dataclass


@dataclass
class ArticleDetail:
id: int
title: str
content: str
tag: List[str]


def query_article_detail(article_id: int) -> ArticleDetail:
detail = ArticleDetail(
id=article_id,
title='文章标题',
content='文章内容',
tag=['tag1', 'tag2']
)
return detail


def test_query_article_detail():
detail = query_article_detail(123)
print(detail.content)

阅读全文 »

我们知道,在写Python时,使用IDE的自动补全功能,可以大大提高代码的开发效率。使用类型标注功能,可以让IDE知道应该怎么做自动补全。

当我们没有类型标注时,IDE并不知道函数的某个参数是什么东西,没有办法做补全,如下图所示。

但当我们把类型标注加上以后,IDE就能正常补全了,如下图所示:

这样做,需要从另一个文件中,把这个参数对应的类导入到当前文件里面,然后把类作为类型填写到函数参数后面。咋看起来没有什么问题,并且我,还有很多看文章的同学,应该经常这样写类型标注的代码,从而提高代码的开发效率。

阅读全文 »

当我们使用大模型生成JSON,或者爬虫抓取数据时,可能会遇到一些有异常的JSON,例如:

  • 括号不闭合
    1
    {"profile": {"name": "xx", "age": 20}
  • 没有引号
    1
    {name: 青南, age: 20, salary: "99999999, }
  • 反斜杠异常
    1
    {"name": "青南", "age": 20, "salary: "\"very big\\""}

Python的json模块解析这些有问题的JSON时就会报错。这个时候,可以使用一个叫做json-repair的第三方库来解决问题。

使用pip就可以安装json-repair。导入以后,就可以像json.loads一样使用了,
运行效果如下图所示:

对于双引号异常和反斜杠异常,也能正常解析:

字符串型的Python字典,也能正常解析,如下图所示:

使用这个模块,在很大程度上就能避免JSON解析不对的问题了。

在文章一日一技:图文结合,大模型自动抓取列表页中,我提到可以使用大模型实现一个全自动爬虫。只需要输入起始URL加上需求,就可以借助模拟浏览器自动完成所有的抓取任务。

在实现的过程中,我发现涉及到的知识点可能一篇文章讲不完,因此拆分成了多篇文章。

爬虫演示

今天是第一部分,我们暂时不依赖模拟浏览器,而是使用httpx(你也可以使用requests)实现全自动爬虫,传入我博客文章列表页,爬虫会自动抓取前三页所有博客文章的标题、正文、作者、发布时间。

爬取结果如下图所示:

运行过程如下图所示:


爬虫首先会进入起始列表页,抓取上面的所有文章。然后进入列表页第二页,再抓取所有文章,最后进入第三页,再抓取所有文章。整个过程都是全自动的。不需要写任何XPath,也不需要告诉爬虫哪里是翻页按钮,文章的标题在哪里,发布时间在哪里,正文在哪里。

阅读全文 »

熟悉我的同学都知道,GNE可以自动化提取任意文章页面的正文,专业版GnePro的准确率更是在13万个网站中达到了90%。

但GNE一直不支持列表页的自动抓取。这是因为列表页的列表位置很难定义。例如下面这张图片:

对人来说,要找到文章列表很简单,红色方框框住的部分就是我们需要的文章列表。但如果让程序自动根据HTML格式相似的规律来寻找列表页,它可能会提取出蓝色方框的位置、绿色方框的位置、灰色方框的位置,甚至导航栏。

之前我也试过使用ChatGPT来提取文章列表,但效果并不理想。因为传给大模型HTML以后,他也不能知道这里面某个元素在浏览器打开以后,会出现什么位置。因此它本质上还是通过HTML找元素相似的规律来提取列表项目。那么其实没有解决我的根本问题,上图中的蓝色、绿色、灰色位置还是经常会提取到。

前两天使用GLM-4V识别验证码以后,我对智谱的大模型在爬虫领域的应用充满了期待。正好这两天智谱上线了视频/图片理解的旗舰模型GLM-4V-Plus。于是我突然有了一个大胆的想法,能不能结合图片识别加上HTML,让大模型找到真正的文章列表位置呢?

阅读全文 »

前两天,有同学在微信群里面问怎么识别下图所示的验证码:

一般爬虫验证码我会使用ddddocr来解析,在大模型出来之前,这个工具基本上是Python下面效果最好的免费验证码识别工具了。但是这次它翻车了。

这个提问的同学也试过了很多个大模型,发现都提取不出来。


甚至连GPT-4o也失败了:

GPT-4o都失败了,还能怎么办呢?难道要使用付费的商业方案了?这个时候,突然有个同学发出来了一张截图:


ChatGLM,也就是智谱AI,竟然识别对了!这个同学接着又发了一张图,另一个验证码识别又对了!

甚至连四则运算验证码都能识别:

这下整个群里面做爬虫的人都热闹了起来:

于是就有了今天这篇文章。

阅读全文 »

去年我写过一篇文章《一日一技:如何对Python代码进行混淆》介绍过一个混淆Python代码的工具,叫做pyminifier,这个东西混淆出来的代码,咋看起来有模有样,但仔细一看,本质上就是变量名替换而已,只要耐下心来就能看懂,如下图所示:

而我今天要介绍另一个工具,叫做pyarmorpyminifier跟它比起来,就跟玩具一样。

阅读全文 »

在之前的文章《一次性数据抓取的万能方法,半自动抓取任意异步加载网站》中,我讲到一个万能的爬虫开发方法。从浏览器保存HAR文件,然后写Python代码解析HAR文件来抓取数据。

但可能有同学连Python代码都不想写,他觉得还要学习haralyzer太累了,有没有什么办法,只需要说自然语言,就能解析HAR文件?

最近我在测试open-interpreter,发现借助它,基本上已经可以实现自然语言编程的效果了。今天我们用小红书为例来介绍这个方法。

阅读全文 »

我们有时候临时需要抓取一批数据,数据不多,可能就几页,几百条数据。手动复制粘贴太麻烦,但目标网站又有比较强的反爬虫,请求有防重放的验证,写代码抓取也不方便。用模拟浏览器又觉得没必要,只用一次的爬虫,写起来很麻烦。

阅读全文 »

我经常逛Github Trend,看看每天有没有什么高级的开源项目出来。有时候发现一个项目非常好,想跟开发者交流。

一般情况下,开发者会在Github主页留下自己的联系邮箱,如下图所示,这是我的Github个人主页:

但有的开发者却不会留邮箱,如下图所示:

这种情况下,怎么联系上这个开发者呢?你可以直接发Issue,但是这样其他人就能看到你发的消息。其实还有一个更简单隐蔽的方法,可以直接拿到这个开发者的邮箱。

首先,在这个开发者的Repo中,随便找一条Commit记录,如下图所示:

这个Commit对应的URL是:https://github.com/didi/xiaoju-survey/commit/3dc15aeb688f04dfdf69f0f46b0f66902303f92d

现在,只需要在这个URL的末尾加上.patch,变成https://github.com/didi/xiaoju-survey/commit/3dc15aeb688f04dfdf69f0f46b0f66902303f92d.patch,就可以看到纯文本形式的Commit记录。而开发者的邮箱地址就在上面,如下图所示:

0%