वेब स्क्रैपिंग / क्रॉलिंग एक विशेष Google पुस्तक


2

अपने काम के लिए, मुझे Google पुस्तकें पर एक बड़ी पुस्तक से पाठ को परिमार्जन करने की आवश्यकता है। विचाराधीन पुस्तक बहुत पुरानी पुस्तक है और कॉपीराइट से बाहर है। पुस्तक विश्व का एक गजेटियर है। हम पाठ को एक डेटाबेस में डालेंगे, इसलिए हमें पीडीएफ के बजाय कच्चे पाठ की आवश्यकता होगी।

मैंने पहले से ही उन उपकरणों और तकनीकों पर शोध करने में बहुत समय बिताया है जिनका उपयोग इस कार्य को पूरा करने के लिए किया जा सकता है। मैं अभिभूत महसूस करता हूं और यह नहीं जानता कि कहां से शुरू करना है या रोजगार के लिए सबसे अच्छा / आसान तरीका कौन सा है। मैं एक मृत अंत पर अधिक समय बर्बाद नहीं करना चाहता।

समस्या को दो भागों में विभाजित किया जा सकता है:

  1. पन्नों को रेंगना।
  2. डेटा डाउनलोड करना।

यह वास्तव में भाग (1) है जिस पर मैं सबसे अधिक फंस गया हूं। एक बार मेरे पास डेटा है (भले ही यह केवल कच्चे html पृष्ठों का हो), मुझे यकीन है कि मैं जो चाहता हूं उसे निकालने के लिए एक पार्सर का उपयोग कर सकता हूं।

पृष्ठों को नेविगेट करना जारी या एक तीर पर क्लिक करके किया जाता है। पृष्ठ वृद्धि हमेशा सुसंगत नहीं होती है, यह अलग-अलग हो सकती है क्योंकि कुछ पृष्ठों में एम्बेडेड चित्र होते हैं। इसलिए, मैं आवश्यक रूप से अगले url की भविष्यवाणी नहीं कर सकता। पुस्तक के खंड 1 के लिए प्रारंभिक url है:

http://books.google.co.uk/books?id=grENAAAAQAAJ&pg=PR5&output=text

मैं जावा और जावास्क्रिप्ट में कार्यक्रम कर सकता हूं और मुझे पायथन का बुनियादी ज्ञान है। मैंने कई अन्य चीजों के बीच नोड.जेएस और स्क्रैपी पर विचार किया है। मैंने छूट की कोशिश की, लेकिन एक 401 अनधिकृत पहुंच त्रुटि प्राप्त की। इसके अलावा, मैंने iRobot, GreaseMonkey और FoxySpider की कोशिश की।

जवाबों:


1

यदि मैं Google पर खोज करता download "Gazetteer of the World" dictionary of geographic knowledgeहूं, तो मैं इसे उदाहरणार्थ PDF में उपलब्ध देखता हूं, और फिर PDF2Word kan जैसी किसी चीज का उपयोग पाठ को निकालने के लिए किया जाता है;

जब तक पीडीएफ सभी तस्वीरें नहीं है ;-) तब आप पीडीएफ 2jpg के साथ निकालने की कोशिश कर सकते हैं और छवि फ़ाइलों को फ़ीड कर सकते हैं एक ओसीआर प्रोग्राम को इंट्रो।

आप उन्हें भी खरीद सकते हैं (अमेज़ॅन के पास कई हिट हैं), पृष्ठों को काट लें और इन्हें ऑटोफीड और ओसीआर के साथ स्कैनर के माध्यम से खींचें।

चूंकि यह एक बार का प्रयास है, इसलिए प्रोग्रामिंग मेरा बहुत ही अंतिम उपाय होगा।

यदि आप पहली बार उस प्रारूप की एक सूची बनाते हैं, जिसमें आप (6?) मात्राएँ प्राप्त करने में सक्षम हैं, और इन प्रारूपों को लेने की लागत और कार्य संसाधन की मात्रा का अनुमान लगाने में मदद मिल सकती है।


सुझाव के लिए धन्यवाद। मैंने PDF2Word की कोशिश की, लेकिन यह काम नहीं किया, मुझे विश्वास है क्योंकि फ़ाइल में पाठ एक छवि है। मैंने पीडीएफ फाइल OCRing के बारे में सोचा है, लेकिन यह बहुत अधिक रिज़ॉल्यूशन नहीं है और मुझे लगता है कि इससे जुड़ी समस्याएं होंगी।
user2661243

1

मैंने पाठ को खुरचने के लिए नोड में एक छोटा प्रोग्राम (जिसे अर्क.जेएस कहा जाता है) लिखकर इस समस्या को हल किया। मैंने इस पृष्ठ का उपयोग मेरी मदद करने के लिए किया: http://blog.miguelgrinberg.com/post/easy-web-scraping-with-nodejs

प्रत्येक HTML पृष्ठ में कई पुस्तक पृष्ठ होते हैं। इसलिए अगर हम url में पेज पैरामीटर को केवल 1 से बढ़ाते हैं तो हम डुप्लिकेट बुक पेज को स्क्रैप कर देंगे यदि हम सावधान नहीं हैं (यह वह हिस्सा था जिसे मैं विशेष रूप से अटका रहा था)। मैंने इसके लिए jquery चयनकर्ता का उपयोग करके केवल url में निर्दिष्ट व्यक्तिगत पुस्तक पृष्ठ का चयन किया और html में मौजूद अन्य पुस्तक पृष्ठों की उपेक्षा की। इस तरह मैं क्रम में प्रत्येक एकल पृष्ठ के लिए यूआरएल के साथ स्प्रेडशीट प्रोग्राम का उपयोग करके एक पाठ फ़ाइल का निर्माण कर सकता था (क्योंकि वेतन वृद्धि केवल 1 है)।

अब तक मैंने पहले दो संस्करणों को सफलतापूर्वक समाप्त कर दिया है, पांच और जाने के लिए! कोड नीचे दिया गया है, यह अन्य Google पुस्तकों को स्क्रैप करने के लिए एक उपयोगी स्टार्टर के रूप में काम कर सकता है।

// Usage: node extract.js input output
// where input (mandatory) is the text file containing your list of urls
// and output (optional) is the directory where the output files will be saved

var fs = require('fs');
var request = require('request');
var cheerio = require('cheerio');

// Read the command line parameters
var input = process.argv[2];
var output = process.argv[3];

if (!input) {
  console.log("Missing input parameter");
  return;
}

// Read the url input file, each url is on a new line
var urls = fs.readFileSync(input).toString().split('\n');

// Check for non urls and remove
for (var i = 0; i < urls.length; i++) {
  if (urls[i].slice(0, 4) != 'http') {
    urls.splice(i, 1);
  }
}

// Iterate through the urls
for (var i = 0; i < urls.length; i++) {
  var url = urls[i];

  // request function is asynchronous, hence requirement for self-executing function
  // Cannot guarantee the execution order of the callback for each url, therefore save results to separate files 
  request(url, ( function(url) {
            return function(err, resp, body) {
                if (err)
                    throw err;

                // Extract the pg parameter (book page) from the url
                // We will use this to only extract the text from this book page
                // because a retrieved html page contains multiple book pages
                var pg = url.slice(url.indexOf('pg=') + 3, url.indexOf('&output=text'));

                //
                // Define the filename
                //
                var number = pg.slice(2, pg.length);
                var zeroes = 4 - number.length;

                // Insert leading zeroes
                for (var j = 0; j < zeroes; j++) {
                  number = '0' + number;
                }  

                var filename = pg.slice(0, 2) + number + '.txt';

                // Add path to filename
                if (output) {
                  if (!fs.existsSync(output))
                    fs.mkdirSync(output);

                  filename = output + '/' + filename;
                }

                // Delete the file if it already exists
                if (fs.existsSync(filename))
                  fs.unlinkSync(filename);

                // Make the DOM available to jquery
                $ = cheerio.load(body);

                // Select the book page
                // Pages are contained within 'div' elements (where class='flow'),
                // each of which contains an 'a' element where id is equal to the page
                // Use ^ to match pages because sometimes page ids can have a trailing hyphen and extra characters
            var page = $('div.flow:has(a[id=' + pg + ']), div.flow:has(a[id^=' + pg + '-])');

            //
            // Extract and save the text of the book page to the file
            //

            var hasText = false;

            // Text is in 'gtxt_body', 'gtxt_column' and 'gtxt_footnote'
            page.find('div.gtxt_body, div.gtxt_column, div.gtxt_footnote').each(function() {  
              this.find('p.gtxt_body, p.gtxt_column, p.gtxt_footnote').each(function() {
                hasText = true;

                fs.appendFileSync(filename, this.text());
                fs.appendFileSync(filename, '\n\n');
              });
            });

                // Log progress
                if (hasText) {
                  console.log("Retrieved and saved page: " + pg);
                }
                else {
                  console.log("Skipping page: " + pg);
                }
            }
        } )(url));
}

मुझे कोड को संशोधित करना पड़ सकता है ताकि यह gtxt_body आदि के आदेश को न मानें। मैं अभी एक पृष्ठ पर आया हूँ जहाँ gtxt_footnote gtxt_column के ऊपर है।
user2661243
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.