cool hit counter Python practice for writing a knowledge crawler_Intefrankly

Python practice for writing a knowledge crawler


First delivery at a critical time!

The basic process of crawling

网络爬虫的基本工作流程如下:

首先选取一部分精心挑选的种子 URL

将种子 URL 加入任务队列

从待抓取 URL 队列中取出待抓取的 URL,解析 DNS,并且得到主机的 ip,并将 URL 对应的网页下载下来,存储进已下载网页库中。此外,将这些 URL 放进已抓取 URL 队列。

Analyze the URLs in the crawled URL queue, analyze the other URLs in it, and add the URLs to the pending URL queue to move on to the next loop.

Parse the downloaded web pages to parse out the required data.

数据持久话,保存至数据库中。

爬虫的抓取策略

在爬虫系统中,待抓取 URL 队列是很重要的一部分。待抓取 URL 队列中的 URL 以什么样的顺序排列也是一个很重要的问题,因为这涉及到先抓取那个页面,后抓取哪个页面。而决定这些 URL 排列顺序的方法,叫做抓取策略。下面重点介绍几种常见的抓取策略:

Depth First Strategy (DFS)

深度优先策略是指爬虫从某个 URL 开始,一个链接一个链接的爬取下去,直到处理完了某个链接所在的所有线路,才切换到其它的线路。

此时抓取顺序为:A -> B -> C -> D -> E -> F -> G -> H -> I -> J

广度优先策略(BFS)

The basic idea of the width-first traversal strategy is to insert the links found in the newly downloaded pages directly at the end of the queue of URLs to be crawled. It also means that the web crawler will first crawl all the pages linked in the starting page, then select one of the linked pages and continue to crawl all the pages linked in this page.

此时抓取顺序为:A -> B -> E -> G -> H -> I -> C -> F -> J -> D

了解了爬虫的工作流程和爬取策略后,就可以动手实现一个爬虫了!那么在 python 里怎么实现呢?

技术栈

requests 人性化的请求发送

Bloom Filter 布隆过滤器,用于判重

XPath Parsing HTML Content

murmurhash

Anti crawler strategy 反爬虫策略

MySQL User Data Storage

基本实现

下面是一个伪代码

如果你直接加工一下上面的代码直接运行的话,你需要很长的时间才能爬下整个知乎用户的信息,毕竟知乎有 6000 万月活跃用户。更别说 Google 这样的搜索引擎需要爬下全网的内容了。那么问题出现在哪里?

布隆过滤器

需要爬的网页实在太多太多了,而上面的代码太慢太慢了。设想全网有 N 个网站,那么分析一下判重的复杂度就是 N*log(N),因为所有网页要遍历一次,而每次判重用 set 的话需要 log(N) 的复杂度。OK,我知道 python 的 set 实现是 hash——不过这样还是太慢了,至少内存使用效率不高。

通常的判重做法是怎样呢?Bloom Filter. 简单讲它仍然是一种 hash 的方法,但是它的特点是,它可以使用固定的内存(不随 url 的数量而增长)以 O(1) 的效率判定 url 是否已经在 set 中。可惜天下没有白吃的午餐,它的唯一问题在于,如果这个 url 不在 set 中,BF 可以 100%确定这个 url 没有看过。但是如果这个 url 在 set 中,它会告诉你:这个 url 应该已经出现过,不过我有 2%的不确定性。注意这里的不确定性在你分配的内存足够大的时候,可以变得很小很少。

BF 详细的原理参考我之前写的文章: 布隆过滤器(Bloom Filter) 的原理和实现

建表

Valuable information about the user includes username, profile, industry, college, profession and data about activity on the platform such as number of answers, posts, questions, followers, etc.

用户信息存储的表结构如下:

网页下载后通过 XPath 进行解析,提取用户各个维度的数据,最后保存到数据库中。

反爬虫策略应对-Headers

The average website will be anti-crawler in several dimensions: the Headers requested by the user, the user behavior, the website and the way the data is loaded. Anti-crawling from the Headers of user requests is the most common strategy, and many sites test the User-Agent of Headers, and some sites test the Referer (some resource sites have anti-theft links that test the Referer).

如果遇到了这类反爬虫机制,可以直接在爬虫中添加 Headers,将浏览器的 User-Agent 复制到爬虫的 Headers 中;或者将 Referer 值修改为目标网站域名。对于检测 Headers 的反爬虫,在爬虫中修改或者添加 Headers 就能很好的绕过。

Anti-Crawler Policy Response - Proxy IP Pools

There are also some websites that detect user behavior, such as the same IP visiting the same page multiple times in a short period of time, or the same account performing the same action multiple times in a short period of time.

后续

Use the logging module to record crawl logs and error logs

分布式任务队列和分布式爬虫

爬虫源代码:zhihu-crawler 下载之后通过 pip 安装相关三方包后,运行$ python crawler.py 即可(喜欢的帮忙点个 star 哈,同时也方便看到后续功能的更新)

Screenshots of the run.

作者:程柳锋@Tencent

Python开发整理发布,转载请联系作者获得授权


Recommended>>
1、Vemma completes first overtheair download technology upgrade complete vehicle upgrade next year
2、BG launches car sharing service in Singapore Rio Tinto deploys driverless trucks in Australia
3、Love Cocos popular 24hour teacher share
4、Reverse water cold tens of thousands of queues constantly all servers crowded Wang Sicong spit poor people aside to play
5、python Basic Tutorial 3

    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号