Python学习教程:成语查询工具 - 数据获取
Python学习教程:成语查询工具 - 数据获取
我们从这个网站上获取想要的内容,不用考虑太多的板块,直接按照字母检索即可
进去每个字母的页面中获取数据以及循环页数,值得注意的是页面中有相当多的重复项,记得进行去重操作
1. 页面获取常规套路,因为这里需要用到xpath,所以直接返回html字符串,这里因为数据中有大量中文繁体字的原因,选择字符编码为gbk
defget_html(url):r=requests.get(url,headers=headers)r.encoding='gbk'returnr.text2. 当前页数据获取
页面中的成语以及释义都是保存在列表中的,直接对列表遍历获取即可(仅当前页),值得注意的是需要对重复项清洗,这里使用匿名函数lambda z: dict([(x, y) for y, x in z.items()]),对字典的键值执行两次翻转
defget_curr(url):html=etree.HTML(get_html(url))lis=html.xpath('//li[@class="licontent"]')context={}forliinlis:ifli.xpath('./span[@class="hz"]/a/text()')andli.xpath('./span[@class="js"]/text()'):idiom=li.xpath('./span[@class="hz"]/a/text()')[0]interpretation=li.xpath('./span[@class="js"]/text()')[0]context[idiom]=interpretationfunc=lambdaz:dict([(x,y)fory,xinz.items()])idiom_dict=func(func(context))returnidiom_dict3. 页数循环
页面底部有页数的标签,包括总页数、当前页、末页、下一页等,但是如果总页面仅1页的就没有任何显示,到达项目尾页时就没有任何页数标签显示了(怪不怪?),我们这里就获取到总页数和当前的字母索引即可,这里的write_data和print是为了查看一下每个字母索引的数据情况,因为最后的执行会将数据写入一个单独的文件,如果你想要看到每个字母的成语,就可以取消这里的注释查看
defrun(url,context):html=etree.HTML(get_html(url))ifhtml.xpath('//a[contains(text(),"末页")]/@href'):text=html.xpath('//a[contains(text(),"末页")]/@href')[0]letter=re.search('\w',text).group(0)orurl.split('/')[-1][0]total=re.search('\d+',text).group(0)or1else:letter=url.split('/')[-1][0]total=1fornuminrange(1,int(total)+1):page_context=get_curr('http://chengyu.kxue.com/pinyin/'+letter+'_'+str(num)+'.html')context.update(page_context)print("完成{}的添加,共{}".format(letter+'_'+str(num),total))#write_data('grandSon/'+url.split('/')[-1][0]+'.json',context)#print("完成{}的写入".format(url.split('/')[-1][0]))returncontext4. 数据写入
直接转成json写入文件,可以调整一下格式
defwrite_data(file,context):withopen(file,'w',encoding='utf-8')asf:f.write(json.dumps(context,indent=2,ensure_ascii=False))5. 遍历所有字母
去网页主页遍历所有字母的链接,然后对每个链接调用以上方法即可
url="http://chengyu.kxue.com/"html=etree.HTML(get_html(url))file='idiom.json'context={}urls=html.xpath('//div[@class="contentletter"]/li/a/@href')forurlinurls:context.update(run("http://chengyu.kxue.com"+url,{}))write_data(file,context)
伙伴们有不清楚的地方,可以留言,更多的关于Python实战和学习教程也会继续为大家更新!
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。