故宫博物院网站内容(故宫博物馆爬虫基础代码get_details这个函数提取上图)
优采云 发布时间: 2022-01-28 21:17故宫博物院网站内容(故宫博物馆爬虫基础代码get_details这个函数提取上图)
故宫博物院爬行动物
基本代码
import requests,re,time
from lxml import etree
url = r'https://img.dpm.org.cn/Public/static/CCP/index.html'
base_url = r'https://img.dpm.org.cn/Public/static/CCP/'
def getHtml(url):#获取网页源代码
header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36'}
html = requests.get(url,headers=header)
return html
def get_titleType_href(html):#获取藏品分类链接
selector = etree.HTML(html.text)
museum_type_href = selector.xpath('//map[@name="Map2"]/area/@href')#获取藏品所有品类
#print(museum_type_href)
return museum_type_href
#这个没用了
def get_collection_details(url):#获取分类列表中的藏品信息
rel_url = base_url+url#拼接url
return rel_url
# print(rel_url)
# html_next = getHtml(rel_url)
# detail_dict = {}
# selector = etree.HTML(html_next.text)
#藏品详情信息取不到
# ddd = selector.xpath('//div[@class="dbody"]/table[@class="dtabcss"]/tbody/tr/td')
# print(len(ddd))
# dd = selector.xpath('//tbody[@id="tabBodyLeft"]/tr')
# print(len(dd))
函数get_采集_details提取出上图所示的馆藏编号、名称、时代等信息,但无法通过xpath定位。爬取的源代码显示类似 document.write("...") 的内容。
"//tbody[@id='tabBodyLeft']" 无法定位,无法完成后续所有数据提取和清理。
跟进
这可能会在js运行后显示在页面上。不,如果不清楚,就乱来。
找出它,单击响应,然后查看其数据:
"rname":"任明峰花集","rnum":"So 00005019-2/12"},{"id":4221760,"rera":"清","rname":"任明峰花集" ,"rnum":"So 00005019-3/12"},{"id":4221761,"rera":"Qing","rname":"任明峰花书","rnum":"So 00005019-4 /12" },{"id":4221762,"rera":"清","rname":"任明峰花书","rnum":"所以00005019-5/12"},{"id": 4221763,"rera":"清","rname":"任明峰花集","rnum":"所以00005019-6/12"},{"id":4221764,"rera":"清", “重名”:“任铭峰花专辑》,《rnum》:《So 00005019-7/12》}]};
这是信息的一部分,就像它没有加载到页面上一样。
然后复制其网址,如:,
显示如上图,汉字编码格式错误,无法正确显示,但里面的属性,id,rera,rname,正好是三个属性,分别对应。所有的工作都解决了,唯一可能存在的就是字体反爬了,必须找到对应的文件才能解决。
分析每个js文件对应页面的六页内容,链接的其他信息是一样的。由此得到链接格式模板,链接微调可以多页爬取。
总码
所有分析都是汇总的,加上部分实现。
import requests,re,time
from lxml import etree
url = r'https://img.dpm.org.cn/Public/static/CCP/index.html'
base_url = r'https://img.dpm.org.cn/Public/static/CCP/'
def getHtml(url):#获取网页源代码
header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36'}
html = requests.get(url,headers=header)
return html
def get_titleType_href(html):#获取藏品分类链接
selector = etree.HTML(html.text)
museum_type_href = selector.xpath('//map[@name="Map2"]/area/@href')#获取藏品所有品类
#print(museum_type_href)
return museum_type_href
#这个没用了
def get_collection_details(url):#获取分类列表中的藏品信息
rel_url = base_url+url#拼接url
return rel_url
# print(rel_url)
# html_next = getHtml(rel_url)
# detail_dict = {}
# selector = etree.HTML(html_next.text)
#藏品详情信息取不到
# ddd = selector.xpath('//div[@class="dbody"]/table[@class="dtabcss"]/tbody/tr/td')
# print(len(ddd))
# dd = selector.xpath('//tbody[@id="tabBodyLeft"]/tr')
# print(len(dd))
if __name__=="__main__":
html = getHtml(url)
type_list = get_titleType_href(html)
collection_urls = []#藏品分类网址列表
new_type_list = []#关键字列表
for item in type_list:
collection_urls.append(get_collection_details(item))
key = item.replace('.html','')
new_type_list.append(key)
js_list = []
for i in new_type_list:
for j in range(1,11):
js_url = base_url+"json/"+i+'/'+i+'_'+str(j)+'.js'#拼接js路径
js_url = js_url.replace(' ','')
js_list.append(js_url)
for i in js_list:
try:
xi = getHtml(i).text
name = re.split('/', i)[-1]
name_1 = name.replace('.js','.txt')
with open(r"C:\Users\86188\Desktop\故宫博物馆藏品信息\%s"%(name_1),'w') as f:
f.write(xi)
print("%s写完了!!!"%name_1)
time.sleep(3)
if '9' in i:
time.sleep(10)
except:
print("这个出错了,继续吧!!!")
因为一个绘画课有500多页,由于一些原因,数据盘点不好用,所以只能写成txt文件,所以没有写完。相当于每个类别爬了60个页面,很多细节都没用。终于有文件夹了。而已!!!