techiall / Blog

🍋 [My Blog] See discussions
https://github.com/techiall/Blog/discussions
MIT License
8 stars 1 forks source link

GitHub | 将 issues 保存到本地 #34

Open techiall opened 5 years ago

techiall commented 5 years ago

利用 GitHub 的 api 接口,我们可以调用这个接口,访问所有人的 issue,返回的格式为 JSON。

https://api.github.com/repos/<your github name>/<your repositories>/issues

爬取代码

方式1

import requests
import json
import re

def new_name(file_name: str) -> str:
    """
    将 [ \ / : * ? " < > | ] 替换成 [ - ]

    :param file_name: str
    :return: str
    """
    return re.sub(r"[\/\\\:\*\?\"\<\>\|]", "-", file_name)

if __name__ == '__main__':
    # https://api.github.com/repos/<your github name>/<your repositories>/issues
    r = requests.get(
        url='https://api.github.com/repos/techial1042/blog/issues',
    )
    data = json.loads(r.text)
    for i in data:
        print(i['title'])
        with open(
            '%s.md' % new_name(file_name=i['title']),
            'w',
            encoding='utf-8'
        ) as f:
            f.write(i['body'])

方式二

import requests
import json
import re

if __name__ == '__main__':
    # https://api.github.com/repos/<your github name>/<your repositories>/issues
    r = requests.get(url='https://api.github.com/repos/techial1042/blog/issues')
    data = json.loads(r.text)
    title = map(
        lambda file_name: re.sub(r"[\/\\\:\*\?\"\<\>\|]", "-", file_name),
        map(lambda this: this['title'], data)
    )
    body = map(lambda this: this['body'], data)
    for (t, d) in zip(title, body):
        with open('{}.md'.format(t), 'w', encoding='utf-8') as f:
            f.write(d)
ChangXiaoning commented 4 years ago

我实际运行了一下博主大大的代码,似乎只能抓取到issue列表里最新的一个issue?

techiall commented 4 years ago

我实际运行了一下博主大大的代码,似乎只能抓取到issue列表里最新的一个issue?

@ChangXiaoning Hi,我也本地测试了,是可以获取「最新」的 30 篇 issue,方式一,方式二都是没问题的。

ChangXiaoning commented 4 years ago

啊哦,不好意思,我代码写的有问题,耽误大大时间啦

ChangXiaoning commented 4 years ago

@techial1042 不过还想打扰一下,请问怎么能突破30篇issues的限制呢🙈

techiall commented 4 years ago

@techial1042 不过还想打扰一下,请问怎么能突破30篇issues的限制呢🙈

@ChangXiaoning Hi,你可以在 URL 后面加个查询参数 page=1,递增 page,等到 page 返回的数据为 empty,即为全部的 issues。

如果你需要有其他的查询需求,你可以看下 GitHub 官方 API 文档 https://docs.github.com/en/rest/reference/issues

ChangXiaoning commented 4 years ago

好嘞,谢谢☺️