成语查询工具 - 数据获取

    我们从这个网站上获取想要的内容,不用考虑太多的板块,直接按照字母检索即可

index.png

    进去每个字母的页面中获取数据以及循环页数,值得注意的是页面中有相当多的重复项,记得进行去重操作

letter.png

1. 页面获取

    常规套路,因为这里需要用到xpath,所以直接返回html字符串,这里因为数据中有大量中文繁体字的原因,选择字符编码为gbk

def get_html(url):
    r = requests.get(url, headers=headers)
    r.encoding = 'gbk'
    return r.text

2. 当前页数据获取

    页面中的成语以及释义都是保存在列表中的,直接对列表遍历获取即可(仅当前页),值得注意的是需要对重复项清洗,这里使用匿名函数lambda z: dict([(x, y) for y, x in z.items()]),对字典的键值执行两次翻转

def get_curr(url):
    html = etree.HTML(get_html(url))
    lis = html.xpath('//li[@class="licontent"]')
    context = {}
    for li in lis:
        if li.xpath('./span[@class="hz"]/a/text()') and li.xpath('./span[@class="js"]/text()'):
            idiom = li.xpath('./span[@class="hz"]/a/text()')[0]
            interpretation = li.xpath('./span[@class="js"]/text()')[0]
            context[idiom] = interpretation
    func = lambda z: dict([(x, y) for y, x in z.items()])
    idiom_dict = func(func(context))
    return idiom_dict

3. 页数循环

    页面底部有页数的标签,包括总页数、当前页、末页、下一页等,但是如果总页面仅1页的就没有任何显示,到达项目尾页时就没有任何页数标签显示了(怪不怪?),我们这里就获取到总页数和当前的字母索引即可,这里的write_dataprint是为了查看一下每个字母索引的数据情况,因为最后的执行会将数据写入一个单独的文件,如果你想要看到每个字母的成语,就可以取消这里的注释查看

def run(url, context):
    html = etree.HTML(get_html(url))
    if html.xpath('//a[contains(text(), "末页")]/@href'):
        text = html.xpath('//a[contains(text(), "末页")]/@href')[0]
        letter = re.search('\w', text).group(0) or url.split('/')[-1][0]
        total = re.search('\d+', text).group(0) or 1
    else:
        letter = url.split('/')[-1][0]
        total = 1
    for num in range(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]))
    return context

4. 数据写入

直接转成json写入文件,可以调整一下格式

def write_data(file, context):
    with open(file, 'w', encoding='utf-8') as f:
        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="content letter"]/li/a/@href')
    for url in urls:
        context.update(run("http://chengyu.kxue.com" + url, {}))
    write_data(file, context)
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,552评论 1 32
  • 概要 64学时 3.5学分 章节安排 电子商务网站概况 HTML5+CSS3 JavaScript Node 电子...
    阿啊阿吖丁阅读 9,704评论 0 3
  • ORA-00001: 违反唯一约束条件 (.) 错误说明:当在唯一索引所对应的列上键入重复值时,会触发此异常。 O...
    我想起个好名字阅读 5,868评论 0 9
  • HTML 5 HTML5概述 因特网上的信息是以网页的形式展示给用户的,因此网页是网络信息传递的载体。网页文件是用...
    阿啊阿吖丁阅读 4,850评论 0 0
  • 小编费力收集:给你想要的面试集合 1.C++或Java中的异常处理机制的简单原理和应用。 当JAVA程序违反了JA...
    八爷君阅读 4,904评论 1 114

友情链接更多精彩内容