我,用一年时间打造了一个百度爬虫

12
回复
124
查看
[复制链接]

微信扫一扫 分享朋友圈

5

主题

10

帖子

20

积分

新手上路

Rank: 1

积分
20
发表于 2023-4-10 09:04:46 | 显示全部楼层 |阅读模式
大家好,我是samzhangjy。
我不知道大家还记不记得我打造的百度爬虫BaiduSpider:
是的,你没猜错。我又花了一年时间来维护、来打造这个项目的v1.0版本:更强大、更人性化。
然后,我做出来了。
先打个广告吧。BaiduSpider是一个能够爬取百度搜索结果的爬虫,支持多达8种搜索类别,例如网页搜索、图片搜索、文库搜索、经验搜索、知道搜索等。项目地址:https://github.com/BaiduSpider/BaiduSpider/  文档:https://baiduspider.github.io/
欢迎star和fork!
接下来,我会分几个部分来讲这个项目的新功能、开发历程、基本原理还有最后的感慨。
这篇文章可能会有一点长,但是我还是建议你完整地看完,获取一些干货内容。
话不多说,我们直接开始!
v1.0的新功能

不夸张的讲,我几乎把整个项目重写、重构了一遍。但是……你以为这就完了?No no no……这才是一小部分!
类型注释&结果类
啊,这可能跟v0.x的BaiduSpider有那么亿点点的不同。首先,我们先来说说类型注释
类型注释从某种意义上来说,并不会对项目本身有什么实质性的用途。但是,对于开发者而言,可就是十分重要的。
Python自带的类型注释typing所起到的更多是文档的作用。虽然我们也有自己的文档,但是很显然,对于开发者来说,能够不离开编辑器才是最好的开发体验。
例如,下面是BaiduSpider的search_web搜索函数的声明部分:
def search_web(
        self,
        query: str,
        pn: int = 1,
        exclude: list = [],
        time: Union[tuple, str, None] = None,
        proxies: dict = None,
    ) -> WebResult:
        # ...可以看到,我们使用了Python 3.6的新语法来做到整个类型注释。
然后就是返回结果类啦。
其实,这个部分很肝。简单的来讲,返回结果类就是将原先的字典形式的返回结果重新构建为以Python中的类作为结果。这个类中也大量使用了类型注释以更好地使现代编辑器补全。
当然,大部分结果类中也包含它的子返回类,就跟俄罗斯套娃一样……
但是,这个功能的效果却十分显著。在没有返回类的情况下,单单使用字典返回结果一没有补全,二没有详尽说明,开发速度明显缓慢。但是,使用结果类的情况下,开发者可以直接通过补全中的人性化名称来了解该变量的作用:



自动补全

目前,所有的BaiduSpider搜索函数都已经支持此功能。
使用Cookie延缓百度封禁
终于,在我的艰辛努力下,终于找到了延缓百度封禁的方法:通过设置并更改Cookie。
目前,此功能仅支持百度网页搜索,并且需要在用户已经登录百度账号的情况下才能正常使用。百度文库搜索也需要传入同样的cookie来使用部分筛选功能。
基于我的个人测试,目前可以达到单个IP爬取~500次而不被封禁。尚未测试500+的情况。
你只需要在初始化BaiduSpider对象的时候传入你的cookie,例如:
from baiduspider import BaiduSpider
from pprint import pprint

spider = BaiduSpider(cookie="你的cookie")国际惯例,不要使用BaiduSpider爬取百度大量数据,违者后果自负。
移动端网页搜索抓取
这个功能是应一位开发者的请求开发的:m.baidu.com 移动端搜索支持 · Issue #7 · BaiduSpider/BaiduSpider
于是,我就实现了它。目前仅支持网页搜索部分结果和功能的搜索。
它的用法也很简单,跟BaiduSpider类差不多:
from baiduspider.mobile import BaiduMobileSpider  # 导入移动端百度爬虫

spider = BaiduMobileSpider()  # 实例化BaiduMobileSpider
result = spider.search_web("Python")  # 搜索网页代理设置
我们在v1.0中为所有的搜索函数都添加了这个功能。它能够在请求的时候替换IP,转而使用其他非本地IP。用法也很简单,只需要在搜索函数中设置proxies参数即可:
from baiduspider import BaiduSpider

result = BaiduSpider().search_web("Python", proxies={
    "http": "http://xxx.xxx.xxx.xxx",  # HTTP代理
    "https": "https://xxx.xxx.xxx.xxx"  # HTTPS代理
})由于BaiduSpider是使用requests库来实现请求的,所以关于这个参数详细的说明请参考requests文档:
通过总结果数推导出总页数
这同样也是一个网友的意见。有了总结果数,我们可以通过 p = \lfloor \frac{n}{k}\rfloor 来算出总页数。其中, p 为总页数, n 为总结果数, k 为一页上存在的结果数量。
由此,我们就可以不必爬取显示的页码而步步推断了。我们可以一气获得最终的页数。
还有很多很多……
更多新功能请参见这个issue:
开发历程

经历了这一年多的开发,BaiduSpider也成为了一个GitHub标星200+的项目了。虽然这相较于其他项目依旧很少,但是其实对我而言已经很不可思议了。下面我就来记录一下大致的开发过程吧(日期实在记不起来了,就不写了)。
其实开发这个项目最初的野心更大:想要爬取绝大多数搜索引擎。但是,后来想想简直就有点可笑。
然后,我一直在写代码。最终,终于能够正常爬取8种搜索类型。
在这段时间,我认识了另一个维护者: @陈绍坤 。我十分感谢他对这个项目的杰出贡献,没有他根本不可能有今天的BaiduSpider。
期间有三四个月这个项目一直在“搁置”,直到最近才重新恢复开发。
额……这样说不准确。所谓的“搁置”,只不过是我在埋头开发v1.0版本呢。
最后,终于在今天,我发布了BaiduSpider v1.0版本!
好吧,这可能就是我现在能够回忆起来的开发历程了。可能有些简略,以后想到也会补充。
基本原理

这里先给自己挖一个坑,点赞超过20个就更新!
对于这个项目的感慨

其实,我对于这个项目还是比较欣慰的。它(至少目前)没有成为一个新的未完成的side-project。最重要的是,我从这个项目中也学到了很多。它让我从一个懵懂的编程小白(lv.1)走向了一个较有经验的编程小白(lv.1.0000000000000000001),我也受益颇深。
总结

好啦,以上就是今天的全部内容。说实话,BaiduSpider其实是我的第一个算得上开源项目的开源项目。如果你喜欢这篇文章,不要忘记点赞+关注哦~
你的支持是我的源动力!
回复

使用道具 举报

4

主题

7

帖子

13

积分

新手上路

Rank: 1

积分
13
发表于 2023-4-10 09:05:23 | 显示全部楼层
收藏,有时间去给你点个星[思考]
回复

使用道具 举报

3

主题

9

帖子

17

积分

新手上路

Rank: 1

积分
17
发表于 2023-4-10 09:05:45 | 显示全部楼层
看完了大佬的介绍,想请教一下这个spyder的应用场景有哪些呀?方不方便给一些启发?[思考]
回复

使用道具 举报

2

主题

7

帖子

10

积分

新手上路

Rank: 1

积分
10
发表于 2023-4-10 09:06:36 | 显示全部楼层
用处很多鸭,比如人工智能的无监督学习,数据分析,疫情状况分析,新闻情感分析等等…  [超得意]
回复

使用道具 举报

0

主题

4

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2023-4-10 09:07:17 | 显示全部楼层
我的意思是有没有具体的case
回复

使用道具 举报

5

主题

10

帖子

21

积分

新手上路

Rank: 1

积分
21
发表于 2023-4-10 09:07:37 | 显示全部楼层
具体的案例倒不是很多,因为还是个小众项目,但是可以看看社区用这个做了些什么:https://github.com/BaiduSpider/BaiduSpider/network/dependents?package_id=UGFja2FnZS0xNDc5ODgyMDYy
回复

使用道具 举报

2

主题

11

帖子

18

积分

新手上路

Rank: 1

积分
18
发表于 2023-4-10 09:08:37 | 显示全部楼层
大佬怎么跳过的百度搜索的安全验证
回复

使用道具 举报

1

主题

5

帖子

8

积分

新手上路

Rank: 1

积分
8
发表于 2023-4-10 09:09:37 | 显示全部楼层
也不能说是跳过,只是减缓而已
详细的可以去看看源码,大致其实就是设置cookie
回复

使用道具 举报

2

主题

4

帖子

8

积分

新手上路

Rank: 1

积分
8
发表于 2023-4-10 09:09:45 | 显示全部楼层
谢谢
回复

使用道具 举报

3

主题

9

帖子

16

积分

新手上路

Rank: 1

积分
16
发表于 2023-4-10 09:10:36 | 显示全部楼层
可以支持以图搜图吗?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表