从维基共享资源搜索中获取所有图片文件名



所以我试图获得维基媒体图像搜索的所有图片文件名,但我只得到10个结果。

作为一个例子,我试着运行:

import json
from io import StringIO
import pandas as pd
import numpy as np
import cv2
import matplotlib.pyplot as plt
import urllib.request
import requests
import time
import shutil
from bs4 import BeautifulSoup
from newspaper import Article
import sys
import html2text
import xmltodict
from xml.etree import ElementTree
import urllib
headers = {'Accept': 'application/json', 'Content-Type': 'application/json', }
plants_df = pd.DataFrame()
pic_searches = ['blue+marble']
df_all = pd.DataFrame()
for pic_search in pic_searches:
url = str(r'https://commons.wikimedia.org/w/api.php?action=query&prop=imageinfo|categories&+   generator=search&gsrsearch=File:') + str(pic_search) + str('&format=jsonfm&origin=*&   +  iiprop=extmetadata&iiextmetadatafilter=ImageDescription|ObjectName') + 
response = urllib.request.urlopen(url).read()
soup = BeautifulSoup(response, 'html.parser')
spans = soup.find_all('span', {'class': 's2'})
lines = [span.get_text() for span in spans]
new_list = [item.replace('"', '') for item in lines]
new_list2 = [x for x in new_list if x.startswith('File')]
new_list3 = [x[5:] for x in new_list2]
new_list4 = [x.replace(' ','_') for x in new_list3]
print(new_list4)

我得到了结果[' blue_marble_2022 .png', 'Blue_Marble_2022.jpg', ' blue_marble_contrast .png', 'Blue_Marble_Eastern_Hemisphere.jpg', 'Blue_Marble_Western_Hemisphere.jpg', 'Blue_Marble_transparent.png', ' the_blue_marble_jpg ', 'The_Blue_Marble_White_Balancing.jpg', 'The_Earth_seen_from_Apollo_17.jpg']。但这只是10个文件名。当我在维基共享图片搜索中输入蓝色大理石时,会出现数百个结果。我怎样才能得到所有的图像文件名?

MediaWiki API查询被分页。这意味着每个API调用将返回最大数量的结果,并且您将需要在后续请求中包含额外的参数,以便检索剩余的结果。

官方文档有一个示例,演示如何提交延续请求。

由于您已经导入了requests,我建议使用该库而不是urllib.request.urlopen。你绝对不应该使用BeautifulSoup来解析这些响应——你可以指定format=json并使用json来代替。

如果您使用字典作为查询参数,而不是手动制作字符串,那么处理延续请求将更容易。

使用请求的例子:

def get_image_names(pic_search):
session = requests.Session()
url = 'https://commons.wikimedia.org/w/api.php'
params = {
'action': 'query',
'prop': 'imageinfo|categories',
'generator': 'search',
'gsrsearch': f'File:{pic_search}',
'format': 'json',
'origin': '*',
'iiprop': 'extmetadata',
'iiextmetadatafilter': 'ImageDescription|ObjectName',
'formatversion': 2,  # only if the target wiki is running mediawiki 1.25 or above
}
resp = session.get(url, params=params).json()
names =  [page['title'] for page in resp['query']['pages']]
continue_params = resp.get('continue')
while continue_params:
params.update(continue_params)
resp = session.get(url, params=params).json()
names.extend(page['title'] for page in resp['query']['pages'])
continue_params = resp.get('continue')
return names

相关内容

  • 没有找到相关文章