基于 Python 的开源网络爬虫框架 WebCollector-Python

GPLv3
Python 查看源码»
跨平台
2019-02-11
CrawlScript

WebCollector-Python

WebCollector-Python 是一个无须配置、便于二次开发的 Python 爬虫框架(内核),它提供精简的的 API,只需少量代码即可实现一个功能强大的爬虫。

WebCollector Java版本

WebCollector Java版相比WebCollector-Python具有更高的效率: https://github.com/CrawlScript/WebCollector

安装

pip安装命令

pip install https://github.com/CrawlScript/WebCollector-Python/archive/master.zip

示例

Basic

快速入门

自动探测URL

demo_auto_news_crawler.py:

# coding=utf-8
import webcollector as wc


class NewsCrawler(wc.RamCrawler):
    def __init__(self):
        super().__init__(auto_detect=True)
        self.num_threads = 10
        self.add_seed("https://github.blog/")
        self.add_regex("+https://github.blog/[0-9]+.*")
        self.add_regex("-.*#.*")  # do not detect urls that contain "#"

    def visit(self, page, detected):
        if page.match_url("https://github.blog/[0-9]+.*"):
            title = page.select("h1.lh-condensed")[0].text.strip()
            content = page.select("div.markdown-body")[0].text.replace("\n", " ").strip()
            print("\nURL: ", page.url)
            print("TITLE: ", title)
            print("CONTENT: ", content[:50], "...")


crawler = NewsCrawler()
crawler.start(10)

手动探测URL

demo_manual_news_crawler.py:

# coding=utf-8
import webcollector as wc


class NewsCrawler(wc.RamCrawler):
    def __init__(self):
        super().__init__(auto_detect=False)
        self.num_threads = 10
        self.add_seed("https://github.blog/")

    def visit(self, page, detected):

        detected.extend(page.links("https://github.blog/[0-9]+.*"))

        if page.match_url("https://github.blog/[0-9]+.*"):
            title = page.select("h1.lh-condensed")[0].text.strip()
            content = page.select("div.markdown-body")[0].text.replace("\n", " ").strip()
            print("\nURL: ", page.url)
            print("TITLE: ", title)
            print("CONTENT: ", content[:50], "...")


crawler = NewsCrawler()
crawler.start(10)

用detected_filter插件过滤探测到的URL

demo_detected_filter.py:

# coding=utf-8
import webcollector as wc
from webcollector.filter import Filter
import re


class RegexDetectedFilter(Filter):
    def filter(self, crawl_datum):
        if re.fullmatch("https://github.blog/2019-02.*", crawl_datum.url):
            return crawl_datum
        else:
            print("filtered by detected_filter: {}".format(crawl_datum.brief_info()))
            return None


class NewsCrawler(wc.RamCrawler):
    def __init__(self):
        super().__init__(auto_detect=True, detected_filter=RegexDetectedFilter())
        self.num_threads = 10
        self.add_seed("https://github.blog/")

    def visit(self, page, detected):

        detected.extend(page.links("https://github.blog/[0-9]+.*"))

        if page.match_url("https://github.blog/[0-9]+.*"):
            title = page.select("h1.lh-condensed")[0].text.strip()
            content = page.select("div.markdown-body")[0].text.replace("\n", " ").strip()
            print("\nURL: ", page.url)
            print("TITLE: ", title)
            print("CONTENT: ", content[:50], "...")


crawler = NewsCrawler()
crawler.start(10)

用RedisCrawler进行可断点的采集(可在关闭后恢复)

demo_redis_crawler.py:

# coding=utf-8
from redis import StrictRedis
import webcollector as wc


class NewsCrawler(wc.RedisCrawler):

    def __init__(self):
        super().__init__(redis_client=StrictRedis("127.0.0.1"),
                         db_prefix="news",
                         auto_detect=True)
        self.num_threads = 10
        self.resumable = True # you can resume crawling after shutdown
        self.add_seed("https://github.blog/")
        self.add_regex("+https://github.blog/[0-9]+.*")
        self.add_regex("-.*#.*")  # do not detect urls that contain "#"

    def visit(self, page, detected):
        if page.match_url("https://github.blog/[0-9]+.*"):
            title = page.select("h1.lh-condensed")[0].text.strip()
            content = page.select("div.markdown-body")[0].text.replace("\n", " ").strip()
            print("\nURL: ", page.url)
            print("TITLE: ", title)
            print("CONTENT: ", content[:50], "...")


crawler = NewsCrawler()
crawler.start(10)
的码云指数为
超过 的项目
加载中

评论(9)

HEQUAN123
HEQUAN123

引用来自“笑笑小兵”的评论

有golang版本不?

引用来自“CrawlScript”的评论

可以考虑以后出golang版
期待+1
一枚假程序猿
一枚假程序猿
求golang版本
CrawlScript
CrawlScript 软件作者

引用来自“科技范麒麟才子”的评论

还是喜欢用 java版
Java版的确效率高、稳定还有强类型保障。 但是有一些场景有Python需求,比如科研人员如果用TensorFlow/PyTorch做机器学习的话,前面数据采集直接用Python会自然一些。😃
笑笑小兵
笑笑小兵

引用来自“笑笑小兵”的评论

有golang版本不?

引用来自“CrawlScript”的评论

可以考虑以后出golang版
期待!
科技范麒麟才子
科技范麒麟才子
还是喜欢用 java版
CrawlScript
CrawlScript 软件作者

引用来自“笑笑小兵”的评论

有golang版本不?
可以考虑以后出golang版
笑笑小兵
笑笑小兵
有golang版本不?
CrawlScript
CrawlScript 软件作者

引用来自“zhaohengchao”的评论

相比于scrapy有何优势?
简单粗暴
zhaohengchao
zhaohengchao
相比于scrapy有何优势?

暂无资讯

暂无问答

JAVA爬虫-区块链快讯爬虫实践

题图: Stan Lee playing Spider-Man on Atari 2600, 1982. 需求: 需要将目标的几个站点的快讯内容做定时爬取,并根据内容做重复过滤。 技术评审: 站点的内容抓取刚开始是想用python,但在...

2018/07/05 18:07
128
0
开发网络爬虫应该怎样选择爬虫框架

有些人问,开发网络爬虫应该选择Nutch、Crawler4j、WebMagic、scrapy、WebCollector还是其他的?这里按照我的经验随便扯淡一下: 上面说的爬虫,基本可以分3类: 1.分布式爬虫:Nutch 2.JAVA单...

2015/11/12 16:17
95
0
开发网络爬虫应该怎样选择爬虫框架?

有些人问,开发网络爬虫应该选择Nutch、Crawler4j、WebMagic、scrapy、WebCollector还是其他的?这里按照我的经验随便扯淡一下: 上面说的爬虫,基本可以分3类: 1.分布式爬虫:Nutch 2.JAV...

2015/11/03 20:11
287
0
开发网络爬虫应该怎样选择爬虫框架

有些人问,开发网络爬虫应该选择Nutch、Crawler4j、WebMagic、scrapy、WebCollector还是其他的?这里按照我的经验随便扯淡一下: 上面说的爬虫,基本可以分3类: 1.分布式爬虫:Nutch 2.JAVA单...

2015/11/12 16:33
326
1
网络爬虫(2)-- Java爬虫框架

Nutch Nutch属于分布式爬虫,爬虫使用分布式,主要是解决两个问题:1)海量URL管理;2)网速。如果要做搜索引擎,Nutch1.x是一个非常好的选择。Nutch1.x和solr或者es配合,就可以构成一套非常强...

2017/04/27 16:01
201
0
java后端系统架构,解决方案合集

前言碎语 本文主要记录了博主从业以来在系统架构及相关解决方案方面的选型项目,会不定期更新,同时也欢迎大家补充 缓存框架: spring cache:http://spring.io/guides/gs/caching/ jetcach...

2018/05/02 19:33
394
0

没有更多内容

加载失败,请刷新页面

返回顶部
顶部