Web scraping 使用pywikibot的维基百科修订历史记录
我想一次收集所有修订历史数据。 Pywikibot page.revisions()没有用于获取已更改字节数的参数。 它提供了我需要的所有数据,除了更改的字节数 如何更改字节数 例如: 对于文章主页,修订历史记录为: 我当前的代码:Web scraping 使用pywikibot的维基百科修订历史记录,web-scraping,mediawiki,wikipedia-api,pywikibot,Web Scraping,Mediawiki,Wikipedia Api,Pywikibot,我想一次收集所有修订历史数据。 Pywikibot page.revisions()没有用于获取已更改字节数的参数。 它提供了我需要的所有数据,除了更改的字节数 如何更改字节数 例如: 对于文章主页,修订历史记录为: 我当前的代码: import pywikibot site = pywikibot.Site("en", "wikipedia") page = pywikibot.Page(site, "Main_Page") re
import pywikibot
site = pywikibot.Site("en", "wikipedia")
page = pywikibot.Page(site, "Main_Page")
revs = page.revisions()
仅显示1个输出:
first entry: {'revid': 969106986, '_text': None, 'timestamp': Timestamp(2020, 7, 23, 12, 44, 21), 'user': 'The Blade of the Northern Lights', 'anon': False, 'comment': 'OK, there we go.', 'minor': False, 'rollbacktoken': None, '_parent_id': 969106918, '_content_model': None, '_sha1': 'eb9e0167aabe4145be44305b3775837a37683119', 'slots': {'main': {'contentmodel': 'wikitext'}}}
我需要更改的字节数,在修订历史链接中显示为{+1,-1,+1,-2},也可以在上面的历史截图中看到。Pywikibot使用
API不提供修订版的更改大小
API为rvprop
参数提供了size
选项,而不是更改大小。人们可以很容易地用它来计算尺寸变化
不幸的是,pywikibot无法获取修订版的size
你可以
可以直接使用PropertyGenerator
类获得具有所需属性的修订:
from pywikibot import Site, Page
from pywikibot.data.api import PropertyGenerator
site = Site("en", "wikipedia")
revs = next(iter(PropertyGenerator('revisions', site=site, parameters={
'titles': 'Main Page',
'rvprop': 'timestamp|size',
})))['revisions']
print(len(revs))
for rev in revs[:5]:
print(rev)
上述代码将打印:
4239
{'timestamp': '2020-07-23T12:44:21Z', 'size': 3500}
{'timestamp': '2020-07-23T12:43:46Z', 'size': 3499}
{'timestamp': '2020-07-23T12:43:31Z', 'size': 3500}
{'timestamp': '2020-06-30T07:05:28Z', 'size': 3499}
{'timestamp': '2020-06-22T13:37:29Z', 'size': 3501}
{'timestamp': '2020-07-23T12:44:21Z', 'size': 3500}
{'timestamp': '2020-07-23T12:43:46Z', 'size': 3499}
{'timestamp': '2020-07-23T12:43:31Z', 'size': 3500}
{'timestamp': '2020-06-30T07:05:28Z', 'size': 3499}
{'timestamp': '2020-06-22T13:37:29Z', 'size': 3501}
旧答案:如评论中所述,此方法不处理API延续,因此,如果需要对页面进行所有修订,则不建议使用此方法
import pywikibot
from pywikibot.data.api import Request
site = pywikibot.Site("en", "wikipedia")
r = Request(site, parameters={
'action': 'query',
'titles': 'Main Page',
'prop': 'revisions',
'rvprop': 'timestamp|size',
'rvlimit': 5,
}).submit()
pages = r['query']['pages']
for page_id, page_info in pages.items():
for rev in page_info['revisions']:
print(rev)
上述代码将打印:
4239
{'timestamp': '2020-07-23T12:44:21Z', 'size': 3500}
{'timestamp': '2020-07-23T12:43:46Z', 'size': 3499}
{'timestamp': '2020-07-23T12:43:31Z', 'size': 3500}
{'timestamp': '2020-06-30T07:05:28Z', 'size': 3499}
{'timestamp': '2020-06-22T13:37:29Z', 'size': 3501}
{'timestamp': '2020-07-23T12:44:21Z', 'size': 3500}
{'timestamp': '2020-07-23T12:43:46Z', 'size': 3499}
{'timestamp': '2020-07-23T12:43:31Z', 'size': 3500}
{'timestamp': '2020-06-30T07:05:28Z', 'size': 3499}
{'timestamp': '2020-06-22T13:37:29Z', 'size': 3501}
Pywikibot使用
API不提供修订版的更改大小
API为rvprop
参数提供了size
选项,而不是更改大小。人们可以很容易地用它来计算尺寸变化
不幸的是,pywikibot无法获取修订版的size
你可以
可以直接使用PropertyGenerator
类获得具有所需属性的修订:
from pywikibot import Site, Page
from pywikibot.data.api import PropertyGenerator
site = Site("en", "wikipedia")
revs = next(iter(PropertyGenerator('revisions', site=site, parameters={
'titles': 'Main Page',
'rvprop': 'timestamp|size',
})))['revisions']
print(len(revs))
for rev in revs[:5]:
print(rev)
上述代码将打印:
4239
{'timestamp': '2020-07-23T12:44:21Z', 'size': 3500}
{'timestamp': '2020-07-23T12:43:46Z', 'size': 3499}
{'timestamp': '2020-07-23T12:43:31Z', 'size': 3500}
{'timestamp': '2020-06-30T07:05:28Z', 'size': 3499}
{'timestamp': '2020-06-22T13:37:29Z', 'size': 3501}
{'timestamp': '2020-07-23T12:44:21Z', 'size': 3500}
{'timestamp': '2020-07-23T12:43:46Z', 'size': 3499}
{'timestamp': '2020-07-23T12:43:31Z', 'size': 3500}
{'timestamp': '2020-06-30T07:05:28Z', 'size': 3499}
{'timestamp': '2020-06-22T13:37:29Z', 'size': 3501}
旧答案:如评论中所述,此方法不处理API延续,因此,如果需要对页面进行所有修订,则不建议使用此方法
import pywikibot
from pywikibot.data.api import Request
site = pywikibot.Site("en", "wikipedia")
r = Request(site, parameters={
'action': 'query',
'titles': 'Main Page',
'prop': 'revisions',
'rvprop': 'timestamp|size',
'rvlimit': 5,
}).submit()
pages = r['query']['pages']
for page_id, page_info in pages.items():
for rev in page_info['revisions']:
print(rev)
上述代码将打印:
4239
{'timestamp': '2020-07-23T12:44:21Z', 'size': 3500}
{'timestamp': '2020-07-23T12:43:46Z', 'size': 3499}
{'timestamp': '2020-07-23T12:43:31Z', 'size': 3500}
{'timestamp': '2020-06-30T07:05:28Z', 'size': 3499}
{'timestamp': '2020-06-22T13:37:29Z', 'size': 3501}
{'timestamp': '2020-07-23T12:44:21Z', 'size': 3500}
{'timestamp': '2020-07-23T12:43:46Z', 'size': 3499}
{'timestamp': '2020-07-23T12:43:31Z', 'size': 3500}
{'timestamp': '2020-06-30T07:05:28Z', 'size': 3499}
{'timestamp': '2020-06-22T13:37:29Z', 'size': 3501}
看
该修补程序已合并到主分支,并将通过pypi在5.2.0版中部署。请参阅
该修补程序已合并到master branch,并将通过pypi在5.2.0版中部署。有一种更好的方法可以实现AXO的建议:
import pywikibot
site = pywikibot.Site('wikipedia:en')
page = pywikibot.Page(site, 'Main Page')
for rev in page.revisions(total=5):
# do whatever you want with Revision Collection rev
print(dict(timestamp=str(rev.timestamp), size=rev.size))
代码将按预期打印:
{'timestamp': '2021-02-03T11:11:30Z', 'size': 3508}
{'timestamp': '2021-02-03T11:03:39Z', 'size': 3480}
{'timestamp': '2020-11-10T08:18:07Z', 'size': 3508}
{'timestamp': '2020-11-10T02:32:23Z', 'size': 4890}
{'timestamp': '2020-11-10T00:46:58Z', 'size': 4880}
有一个更好的方法来实现AXO的建议:
import pywikibot
site = pywikibot.Site('wikipedia:en')
page = pywikibot.Page(site, 'Main Page')
for rev in page.revisions(total=5):
# do whatever you want with Revision Collection rev
print(dict(timestamp=str(rev.timestamp), size=rev.size))
代码将按预期打印:
{'timestamp': '2021-02-03T11:11:30Z', 'size': 3508}
{'timestamp': '2021-02-03T11:03:39Z', 'size': 3480}
{'timestamp': '2020-11-10T08:18:07Z', 'size': 3508}
{'timestamp': '2020-11-10T02:32:23Z', 'size': 4890}
{'timestamp': '2020-11-10T00:46:58Z', 'size': 4880}
挑战在于我们一次只能获取500个条目。挑战在于我们一次只能获取500个条目。谢谢xqt。是我把它作为一个功能添加的。我一直在关注你的更新。谢谢你。是我把它作为一个功能添加的。我一直在关注你所做的更新。