ویکی‌پدیا:سیاست ربات‌رانی/درخواست مجوز/HujiBot/وظیفه ۱۳/کد

جزئیات استخراج داده را برای مصرف آیندگان در زیر آورده‌ام.

ابتدا تمام صفحه‌های مرتبط با قنات‌ها را بارگیری و در پرونده‌هایی ذخیره می‌کنیم:

#!/bin/bash
for i in {1..32697}
do
    url="http://www.iranhydrology.net/qanat/qanatlist.asp?key=$i"
    page="$i.htm"
    curl $url > $page
done

حال این پرونده‌ها را یکی یکی باز می‌کنیم، اطلاعات مربوط به قنات را از جدول اچ‌تی‌ام‌ال استخراج می‌کنیم و نتیجه را به صورت سی‌اس‌وی بیرون می‌دهیم. در انتهای این پروسه یک پروندهٔ سی‌اس‌وی خواهیم داشت که اطلاعات تمام قنات‌ها در آن موجود است و می‌تواند به راحتی توسط هر رباتی به کار گرفته شود.

#!/usr/bin/python
# -*- coding: utf-8 -*-
from __future__ import absolute_import, unicode_literals
import re
import sys


def persian_numbers(text):
    pattern = '\d+(\.\d+)?'
    digits = u'۰۱۲۳۴۵۶۷۸۹'
    out = u''

    for line in text.split('\n'):
        if re.search(pattern, line):
            for i in range(10):
                line = line.replace(str(i), digits[i])
            line = line.replace('.', '٫')
        out += line + '\n'
    return out.strip('\n')


def process(text):
    startPattern = '<table[^>]+bgcolor[^>]+>'
    startPos = re.search(startPattern, text).end()
    text = text[startPos:]
    endPattern = '</table>'
    endPos = re.search(endPattern, text).start()
    table = text[:endPos]

    table = table.replace('\n', '').replace('\r', '')
    table = re.sub('<\/?(b|span|font)[^>]*>', '', table)
    table = re.sub('<td[^>]+>', '<td>', table)
    table = re.sub('&nbsp;', ' ', table)
    table = table.replace('<tr>', '').replace('</tr>', '\n')

    pattern = '<td>[^<]+</td><td>([^<]+)</td>'
    table = re.sub(pattern, '\\1', table)
    table = table.strip('\n')

    table = persian_numbers(table)

    out = u'"'
    out += table.replace('\n', '", "')
    out += u'"'

    return out


def main():
    out = u'نام قنات, استان, موقعیت, بخش, روستا, مالکین, اراضی تحت کشت, ' + \
                u'طول قنات, عمق مادر چاه, تعداد میله چاه, ' + \
                u'فاصله مظهر تا محل, دبی قنات\n'
    for i in range(1, 32697):
        fh = open('%s.htm' % i, 'r')
        text = fh.read()
        fh.close()
        out += process(text) + '\n'
    print out


reload(sys)
sys.setdefaultencoding('utf8')
main()

خروجی سی‌اس‌وی، یک پرونده با حجم تقریبی ۵ مگابایت خواهد بود. این پرونده را برای ساختن جدول‌های مربوط به قنات‌های هر «شهرستان» (که در پرونده، با نام «موقعیت» شناخته شده) استفاده می‌کنیم. قبلش به صورت دستی مشکلات پرونده را (نظیر استفاده از ی و ک عربی، نام‌های اشتباه تقسیمات جغرافیایی، اصلاح بخش‌هایی که شهرستان شده‌اند و غیره) رفع می‌کنیم.

#!/usr/bin/python
# -*- coding: utf-8 -*-
"""
Qanat Bot

This bot moves the contents of articles about non-notable Qanats to a page that
lists all Qanats for the corresponding county.

It takes one parameter, which is the name of a category for the Qanats of a
certian county.
"""
#
# (C) Pywikibot team, 2006-2017
# (C) Huji, 2017
#
# Distributed under the terms of the MIT license.
#
from __future__ import absolute_import, unicode_literals

#

import pywikibot
import re
import pandas
import string
from pywikibot import pagegenerators
import sys

from pywikibot.tools import issue_deprecation_warning

# This is required for the text that is shown when you run this script
# with the parameter -help.
docuReplacements = {
    '&params;': pagegenerators.parameterHelp
}


class QanatBot:

    def __init__(self):
        """
        Constructor.
        """
        self.summary = u'ربات: ایجاد فهرست قنات‌های شهرستان'
        self.site = pywikibot.Site('fa')
        self.intro = u'جدول زیر براساس آمار وزارت جهاد کشاورزی تهیه شده‌است.' + \
                     u'''<ref>{{یادکرد وب
|نویسنده =
|نشانی=http://www.iranhydrology.com/qanat/qanatlist.asp
|عنوان=بانک اطلاعاتی قنات‌های کشور
| ناشر = وزارت جهاد کشاورزی ایران
|تاریخ =
|تاریخ بازبینی=۴ تیر ۱۳۹۱
| پیوند بایگانی =http://www.webcitation.org/68eh0vxzx
| تاریخ بایگانی = ۴ تیر ۱۳۹۱
}}</ref> '''

    def run(self):
        colnames = ['name', 'province', 'county', 'area', 'village', 'owerns',
                    'distribution', 'length', 'depth', 'pipes', 'distance',
                    'discharge']
        data = pandas.read_csv('/home/huji/bot/scripts/qanat.csv',
                               names=colnames, quotechar='"', skiprows=1)
        provinces = list(set(data.province.tolist()))
        counties = list(set(data.county.tolist()))

        for c in counties:
            if c != u'درگز':
                continue

            sec = data[data['county'] == c]
            sec = sec.sort_values(['name'])
            p = sec.province.tolist()[0]
            
            cat = pywikibot.Category(self.site, u'قنات‌های شهرستان %s' % c)
            if cat.exists():
              articles = set(cat.articles())

            out = self.intro
            out += u'فهرست زیر قنات‌های [[شهرستان ' + \
                   u'%s]] در [[استان %s]] را نشان می‌دهد.\n' \
                   % (c, p)
            out += '{| class="wikitable sortable"\n'
            out += u'! نام قنات !! موقعیت !! نزدیک‌ترین روستا !! طول قنات (متر) !! ' + \
                   u'تعداد میله چاه !! عمق مادر چاه !! ' + \
                   u'دبی (لیتر بر ثانیه) !! سطح زیر کشت (هکتار)'

            for idx, row in sec.iterrows():
                out += '\n|-\n'
                out += '|' + row['name'] + \
                       '\n|[[' + \
                       u'بخش ' + row['area'] + \
                       u' شهرستان ' + row['county'] + \
                       ']]\n|' + row['village'] + \
                       '\n|' + row['length'] + \
                       '\n|' + row['pipes'] + \
                       '\n|' + row['depth'] + \
                       '\n|' + row['discharge'] + \
                       '\n|' + row['distribution']

            out += '\n|}\n== منابع ==\n{{پانویس}}\n'
            out += u'[[رده:قنات‌های شهرستان %s]]' % c
            page = pywikibot.Page(self.site,
                                  u'فهرست قنات‌های شهرستان %s' % c)
            pywikibot.output('Saving page ...')
            page.put(out, self.summary)

            if cat.exists():
              for article in articles:
                if article.title() != u'فهرست قنات‌های شهرستان %s' % c:
                  out = u'#تغییرمسیر[[فهرست قنات‌های شهرستان %s]]' % c
                  article.put(out, self.summary)
            else:
                pywikibot.output('Creating county qanats category ...')
                out = u'[[رده:قنات‌های استان %s]]' % p
                cat.put(out, self.summary)

            cat = pywikibot.Category(self.site, u'قنات‌های استان %s' % p)
            if not cat.exists():
                pywikibot.output('Creating province qanats category ...')
                out = u'[[رده:قنات‌های ایران بر پایه استان]]'
                cat.put(out, self.summary)


def main():
    reload(sys)
    sys.setdefaultencoding("utf-8")

    bot = QanatBot()
    bot.run()  # guess what it does
    return True

if __name__ == '__main__':
    main()