Skip to content

osslab-pku/github-scraper

Repository files navigation

使用CloudFlare Workers的网页爬虫

声明

仅供科研用途,我恕不承担由于使用这一项目造成的一切后果。

为什么要把爬虫放在CloudFlare Workers上?本地爬虫/GitHub API不好用吗?

  1. GitHub API 的每小时5000次 Rate Limit 在构建数据集时可能不够用
  2. Cloudflare workers 到 GitHub的网络快
  3. Cloudflare 自带IP池, 爬虫不容易被封

要怎么用?

Python

  1. 安装两个依赖:aiohttptqdm (您可能需要python>=3.7 以及 tqdm >= 4.62.0)
  2. example/github_client.py中有一个简单的python异步客户端实现,您可以把github_client.py复制到自己的项目中。

example文件夹中有两个示例: example/dependents_csv.py(将项目依赖导出为csv) 和 example/issues_mongo(将项目issue保存到mongodb)。 示例用法如下:

# 创建一个客户端
scraper = GithubScraperClient(
    baseurl="https://scraper.12f23eddde.workers.dev/github", auth="OSSLab@PKU"
)

# 构造请求列表 {name: str, owner: str, id: int}
queries = [{"name": "pygithub", "owner": "pygithub", "id": 1}]

# 回调函数(python没法写多行lambda,所以这样实现)
# results 是所有请求结果的列表,params 是请求参数
def callback(results: list, params: dict) -> None:
    if len(results) == 0:
        return
    # 打印结果
    print(params["name"], results[-1])

# 获取pr body
scraper.get_pulls_with_callback(queries, callback)
# 获取项目的issue
scraper.get_issue_lists_with_callback(name_with_owner, callback)

以下代码可以把结果保存到mongodb:

client = MongoClient(mongo_url)
db_proj = client.dependabot_projects

# 保存到mongodb
def callback(results: list, params: dict) -> None:
    if len(results) == 0:
        return
    for result in results:
        db_proj.pull_request_body.insert_one({
            **result,
            "name_with_owner": params["owner"] + "/" + params["name"],
            "id": params["id"]
        })

使用有限制吗?

当前爬虫使用了Cloudflare付费计划,每月有1000万次请求额度,没有频率限制。超出限制的每百万次请求收费0.5美元。 如果您想自己部署这个项目,可以先尝试Cloudflare免费计划,每天有10万次请求额度,频率限制为1000次每分钟。

怎么实现其他的爬虫?

请参考src/common, src/githubCloudflare文档.

About

GH Scraper with cloudflare workers (only for educational purposes)

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published