Google सर्च JSON को CSV में निर्यात करना विश्लेषण के लिए
Expert Network Defense Engineer
TL;DR:
- एक Google खोज परिणाम CSV को इसके पंक्तियों के बगल में क्वेरी संदर्भ की आवश्यकता होती है। अनुरोध और अवलोकन समय को संरक्षित करें ताकि प्रत्येक परिणाम निर्यात के बाद भी व्याख्यायित रह सके।
- CSV JSON का एक प्रक्षिप्ति है। कच्चे कैप्चर को बनाए रखें, अनुपस्थित और शून्य मानों में अंतर करें, और परिवर्तित कोशिकाओं के अर्थ को रिकॉर्ड करें।
- एक हेडर-केवल फ़ाइल को एक रन रिकॉर्ड की आवश्यकता है। लंबित, विफल, अप्रत mapped, और उपस्थित-खाली कैप्चर विभिन्न कारणों से कोई जैविक पंक्तियाँ उत्पन्न कर सकते हैं।
एक स्प्रेडशीट प्रत्येक शीर्षक को संरक्षित कर सकती है और फिर भी उस खोज का अर्थ खो सकती है जिसने इसे उत्पन्न किया। बिना क्वेरी, प्रस्तुत संदर्भ, और अवलोकन समय के, एक पंक्ति की तुलना करना या उसे ट्रेस करना मुश्किल हो जाता है। एक खाली कोशिका एक और अस्पष्टता उत्पन्न करती है: क्या मान अनुपस्थित था, शून्य था, या परिवर्तन द्वारा अस्वीकृत था?
Scrapeless Google Search API उपधारा संरवित खोज डेटा प्रदान करता है। यह गाइड एक स्थानीय पायथन निर्यातक का उपयोग करके सुरक्षित कैप्चर से एक Google खोज परिणाम CSV बनाता है। CSV उत्पादन, स्प्रेडशीट हैंड्लिंग, और फ़ाइल संग्रह उदाहरण प्रोग्राम के कार्य हैं, यह नहीं कि API सीधे इस निर्यात फ़ॉर्मेट को लौटाता है।
आवश्यकताएँ और कैप्चर लिफाफा
निर्यातक को Python और एक सुरक्षित JSON कैप्चर की आवश्यकता है जिसमें request, http_status, और response शामिल हैं। run_id, requested_at, और received_at को तब शामिल करें जब संग्रहकर्ता उन्हें रिकॉर्ड करे। ये बाहरी फ़ील्ड संग्रह एप्लिकेशन की होती हैं, API की स्वाभाविक प्रतिक्रिया लपेटने वाली नहीं।
Google खोज अनुरोध कार्यप्रवाह HTTP 200 कार्य डेटा को HTTP 201 लंबित कार्य से भिन्न करता है। कुछ भी चपटा करने से पहले HTTP परिणाम को प्रतिक्रिया के साथ संरक्षित करें। लंबित प्रतिक्रिया से अनुपस्थित जैविक फ़ील्ड को पढ़ना और एक खाली सूची को प्रतिस्थापित करना उस भिन्नता को मिटा देगा।
स्थानीय परिवर्तन के लिए कोई API कुंजी या तीसरी-पार्टी पैकेज की आवश्यकता नहीं है। एक खाता कैप्चर उत्पन्न करना एक अलग प्रमाणित कदम है, जो इस लेख के लिए नहीं किया गया था। स्थानीय जांच सिंथेटिक कैप्चर्स का उपयोग करती है ताकि डेटा प्रकार, खाली राज्यों, यूनिकोड, और स्प्रेडशीट-संवेदनशील पाठ का परीक्षण किया जा सके।
JSON मान मॉडल ऐरे, वस्तुओं, शून्यों, और स्ट्रिंग्स को संरक्षित करता है जो सीधे फ्लैट कोशिकाओं में मैप नहीं होते। निर्यात के बाद मूल कैप्चर को उपलब्ध रखें ताकि बाद में विश्लेषक छोड़े गए मॉड्यूल और सटीक मूल मानों को पुनः प्राप्त कर सकें।
तय करें कि कौन से कॉलम संदर्भ और अर्थ ले जाते हैं
प्रत्येक परिणाम पंक्ति पर चलाने वाले पहचानकर्ता, अनुरोध और प्राप्ति समय, उपलब्ध होने पर सटीक क्वेरी, और क्रमांकित अनुरोध को दोहराएँ। पूरी अनुरोध सेटिंग्स को स्थायी सुविधा कॉलम से परे संरक्षित करती है और निर्यात की ऑडिट करने में इसे आसान बनाती है।
Google खोज पैरामीटर में देश और भाषा सेटिंग्स शामिल हैं, लेकिन पूर्ण-URL मोड url के अंदर कॉन्फ़िगरेशन ले जा सकता है। एक खाली q कॉलम इसलिए आवश्यक नहीं है कि यह प्रस्तुत क्वेरी अनुपस्थित है। request_json का निरीक्षण करें; एक खाली सुविधा फ़ील्ड से अनुमान लगाकर एक प्रभावी क्वेरी को पुनर्निर्माण न करें।
जैविक ऐरे क्रम और लौटाई गई स्थिति अलग कॉलम हैं। ordinal वस्तु के शून्य-आधारित स्रोत क्रम को रिकॉर्ड करता है। position केवल तब बनाए रखा जाता है जब यह एक सकारात्मक पूर्णांक हो, जबकि बूलियन्स को स्पष्ट रूप से अस्वीकृत किया जाता है। निर्यातक ऐरे क्रम से एक रैंकिंग नहीं बनाता।
पाठ फ़ील्ड और स्थिति प्रत्येक में एक सहायक स्थिति कॉलम होता है। missing, null, और value सामान्य मामलों की व्याख्या करते हैं। invalid एक अनुपयोगी स्थिति को चिह्नित करता है; unexpected_type एक गैर-स्ट्रिंग टेक्स्ट-फील्ड मूल्य को चिह्नित करता है जो चुपचाप त्यागने के बजाय अनुक्रमित JSON के रूप में बनाए रखा जाता है।
CSV कोटिंग को स्प्रेडशीट व्याख्या से अलग करें
एक CSV लेखक सीमांककों और उद्धृत पाठ को संभालता है; यह यह तय नहीं करता कि स्प्रेडशीट एक कोशिका का मूल्यांकन कैसे करती है। विशेष रूप से स्ट्रिंग्स को मैन्युअल रूप से जोड़ने के बजाय कॉमा, उद्धरण चिह्न और अंतर्निहित नई पंक्तियों के लिए Python का CSV लेखक का उपयोग करें।
प्रोग्राम newline="" और utf-8-sig के साथ अपना आउटपुट खोलता है। पहली सेटिंग CSV मॉड्यूल को रिकॉर्ड सीमाओं का प्रबंधन करने देती है। UTF-8 संकेतक एक स्प्रेडशीट को उच्चारणित या गैर-लैटिन पाठ को पहचानने में मदद कर सकता है, लेकिन गंतव्य एप्लिकेशन के आयात व्यवहार की अभी भी जांच करनी होगी।
एक मान जो एक फ़ॉर्मूला वर्ण के साथ शुरू होता है, स्प्रेडशीट में खोले जाने पर एक अभिव्यक्ति के रूप में व्याख्यायित किया जा सकता है। CSV इंजेक्शन मार्गदर्शन बताता है कि क्यों व्याकरणिक रूप से सही CSV अविश्वसनीय पाठ को निष्क्रिय बनाने के लिए पर्याप्त नहीं है।
यह निर्यातक चयनित फ़ॉर्मूला-नेतृत्व वाले वर्णों के लिए एक अप्रत्यक्ष\’ पूर्वनिर्धारित करता है, जिसमें पूर्ण-चौड़ाई वाले संस्करण शामिल हैं, और अग्रणी टैब या पंक्ति ब्रेक के लिए। यह नीति अनुरोध संदर्भ के साथ-साथ परिणाम पाठ पर लागू होती है। संख्यात्मक स्थान एक अलग मान्यता नियम का उपयोग करते हैं।
Scrapeless के साथ स्क्रैपिंग शुरू करें
Scrapeless के साथ अपने वेब स्क्रैपिंग और ऑटोमेशन वर्कफ़्लो को शक्ति प्रदान करें!
आज ही साइन अप करें और प्राप्त करें $5 का मुफ्त क्रेडिट — क्रेडिट कार्ड की आवश्यकता नहीं।अपने मुफ्त क्रेडिट का दावा करें Scrapeless डैशबोर्ड में।
स्थानीय JSON-से-CSV निर्यातक चलाएँ
प्रोग्राम को serp_csv.py के रूप में सहेजें, फिर python3 serp_csv.py capture.json organic.csv चलाएँ। यह कैप्चर को पढ़ता है और organic.csv और साथी organic.csv.run.json को लिखता है। मौजूदा आउटपुट फ़ाइलें अधिसूचित की जाती हैं; कई संस्करणों को बनाए रखते समय एक समर्पित निर्यात निर्देशिका या अद्वितीय नाम चुनें।
प्रोग्राम उन आउटपुट पथों से इनकार करता है जो इनपुट कैप्चर को अधिसूचित करेंगे। यह मूल JSON को नहीं बदलता, API अनुरोध पेश नहीं करता या लंबित कार्यों को पुनः प्राप्त नहीं करता।
python
import argparse
import csv
import json
from pathlib import Path
FIELDS = ["run_id", "requested_at", "received_at", "q", "request_json", "ordinal",
"position", "position_state", "title", "title_state", "link", "link_state",
"snippet", "snippet_state"]
def spreadsheet_text(value):
text = "" if value is None else str(value)
stripped = text.lstrip()
if (stripped.startswith(("=", "+", "-", "@", "=", "+", "-", "@"))
or text.startswith(("\t", "\r", "\n"))):
return "'" + text
return text
def field(row, name):
if name not in row:
return "", "missing"
value = row[name]
if value is None:
return "", "null"
if name == "position":
return (value, "value") if type(value) is int and value > 0 else ("", "invalid")
if isinstance(value, str):
return spreadsheet_text(value), "value"
return spreadsheet_text(json.dumps(value, ensure_ascii=False)), "unexpected_type"
def export(source, target):
source, target = Path(source), Path(target)
sidecar = target.with_suffix(target.suffix + ".run.json")
if source.resolve() in (target.resolve(), sidecar.resolve()):
raise ValueError("Output paths must differ from input")
record = json.loads(source.read_text(encoding="utf-8"))
request = record.get("request")
if not isinstance(request, dict) or not isinstance(request.get("input"), dict):
raise ValueError("Expected a capture record with request.input")
payload = record.get("response")
rows = payload.get("organic_results") if isinstance(payload, dict) else None
status = record.get("http_status")
if status == 201:
state, rows = "pending", []
elif status != 200:
state, rows = ("transport_error" if status is None else "http_error"), []
elif not isinstance(rows, list) or any(not isinstance(x, dict) for x in rows):
state, rows = "unmapped", []
else:
state = "observed" if rows else "empty"
context = {
"run_id": spreadsheet_text(record.get("run_id")),
"requested_at": spreadsheet_text(record.get("requested_at")),
"received_at": spreadsheet_text(record.get("received_at")),
"q": spreadsheet_text(request["input"].get("q")),
"request_json": spreadsheet_text(json.dumps(request, ensure_ascii=False, sort_keys=True)),
}
with target.open("w", encoding="utf-8-sig", newline="") as handle:
writer = csv.DictWriter(handle, fieldnames=FIELDS)
writer.writeheader()
for ordinal, item in enumerate(rows):
output = dict(context, ordinal=ordinal)
for name in ("position", "title", "link", "snippet"):
output[name], output[name + "_state"] = field(item, name)
writer.writerow(output)
sidecar.write_text(json.dumps({"source": str(source), "run_id": record.get("run_id"),
"state": state, "rows": len(rows), "request": request,
"requested_at": record.get("requested_at"), "received_at": record.get("received_at"),
"export_policy": "spreadsheet_text_prefix_v1; original values remain in source JSON"},
ensure_ascii=False, indent=2), encoding="utf-8")
print(f"Exported {len(rows)} organic rows; state={state}; metadata={sidecar}")
return state, len(rows)
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument("source")
parser.add_argument("target")
args = parser.parse_args()
export(args.source, args.target)
साइडकार संग्रह स्थिति, अपेक्षित पंक्ति संख्या, स्रोत पथ, अनुरोध, टाइमस्टैम्प और निर्यात नीति को रिकॉर्ड करता है। एक हेडर-केवल CSV तब तक समझाया जा सकता है जब तक वह रिकॉर्ड उसके साथ बना रहे। निर्यात किसी अन्य व्यक्ति को सौंपते समय दोनों आउटपुट फ़ाइलों को एक साथ रखें।
नल और गलत थे हुए जैविक डेटा का निरीक्षण करें
एक मौजूद खाली जैविक सरणी state=empty का उत्पादन करती है। HTTP 201 pending का उत्पादन करता है, एक गायब HTTP स्थिति transport_error बन जाती है, और एक अन्य गैर-200 स्थिति इस अनुप्रयोग की स्थिति मॉडल में http_error बन जाती है। ये परिणाम अर्थ साझा किए बिना शून्य पंक्ति संख्या साझा कर सकते हैं।
यदि जैविक क्षेत्र अनुपस्थित है, एक सरणी नहीं है, या एक गैर-ऑब्जेक्ट आइटम содержит करता है, तो संपूर्ण प्रक्षिप्ति unmapped बन जाती है। इस रन के लिए प्रोग्राम कोई जैविक पंक्तियाँ निर्यात नहीं करता है। यह शेष पंक्तियों का वर्णन करते समय गलत आइटम को चुपचाप छोड़ने से बचाता है।
वैकल्पिक फ़ील्ड को अधिक सटीक ढंग से संभाला जाता है। एक गायब स्निप्पेट एक खाली सेल छोड़ता है और एक स्पष्ट फ़ील्ड स्थिति को जैविक आइटम को छोड़ने के बिना। एक अप्रत्याशित जटिल मान JSON पाठ के रूप में प्रस्तुत किया जाता है, इसलिए असामान्य मान अभी भी जांचा जा सकता है।
ये अनुप्रयोग नीतियाँ हैं। इन्हें निर्यात के पास दस्तावेज़ित करें और यदि उपभोक्ता को एक अलग स्कीमा की आवश्यकता हो तो इन्हें जानबूझकर संशोधित करें। एक फ़ील्ड-स्थिति स्तंभ उपयोगी होता है ठीक इस कारण से कि एक अन्य विश्लेषक को कुछ दृश्यमान कोशिकाओं से परिवर्तन का अनुमान नहीं लगाना चाहिए।
स्प्रेडशीट हैंडऑफ़ की पुष्टि करें
आउटपुट को CSV पार्सर के साथ पढ़ें और भौतिक पंक्तियों के बजाय तार्किक रिकॉर्ड की तुलना करें। एक उद्धृत स्निप्पेट एक नई खोज परिणाम बनाए बिना एक नई पंक्ति को शामिल कर सकता है। पुष्टि करें कि साइडकार की संख्या पार्स की गई पंक्तियों के साथ मेल खाती है और प्रत्येक पंक्ति अपने अनुरोध संदर्भ को ले जाती है।
टीम द्वारा वास्तव में उपयोग किए जाने वाले अनुप्रयोग में यूनिकोड और फ़ॉर्मूला-संवेदनशील मानों की जाँच करें। अप्रत्यक्ष नीति जानबूझकर निर्यातित प्रतिनिधित्व को बदलती है और कुछ दर्शकों में दिखाई दे सकती है। यह सभी आयात सेटिंग्स और स्प्रेडशीट अनुप्रयोगों में एक सार्वभौमिक गारंटी नहीं है।
परीक्षा में सहेजें और फिर से खोलने के व्यवहार को शामिल करें। स्प्रेडशीट आयात चर्चा बताती है कि क्यों एस्केप हैंडलिंग को अनुप्रयोग-विशिष्ट समीक्षा की आवश्यकता होती है। संबंधित स्तंभों को पाठ के रूप में आयात करें, और जब भी सटीक स्रोत स्ट्रिंग की आवश्यकता हो तो मूल JSON का उपयोग करें।
एक सफल स्थानीय राउंड ट्रिप इस प्रक्षिप्ति की संगति की पुष्टि करता है। यह यह स्थापित नहीं करता कि अपस्ट्रीम खोज नमूना सर्वसमावेशी, प्रतिनिधि, या रैंकिंग निष्कर्ष के लिए उपयुक्त है बिना आगे के विश्लेषण के।
निष्कर्ष
अनुरोध संदर्भ को परिणामों के साथ निर्यात करें, जहाँ अर्थ छिपाने के लिए रिक्तियाँ हैं, फ़ील्ड राज्य को बनाए रखें, और कच्चा JSON बनाए रखें। एक CSV और एक रन रिकॉर्ड अगले विश्लेषक को काफी जानकारी देता है ताकि वह मापी गई खाली सरणी को उपलब्ध संग्रह से अलग कर सके।
एक SERP सामग्री अनुसंधान कार्यप्रवाह निर्यातित अवलोकनों का उपयोग समीक्षा योग्य पढ़ने की सूची बनाने के लिए कर सकता है इससे पहले कि सामग्री संक्षेप तैयार किया जाए।
अग observations अन्वीक्षण किए जाएँ
पुनः उपयोग करने योग्य Google खोज API](https://docs.scrapeless.com/en/google-search-api/quickstart/introduction/?utm_source=website&utm_medium=blog&utm_campaign=google-search-api&utm_term=google-search-results-csv-analysis) इस कार्यप्रवाह में खोज डेटा के लिए। संग्रह योजना बनाते समय Scrapeless की कीमतें की समीक्षा करें, और अपने कॉन्फ़िगरेशन के बगल में Google खोज पैरामीटर रखें।
समुदाय के साथ अपने कार्यान्वयन पर चर्चा करें Discord या Telegram。
सामान्य प्रश्न
प्रश्न: क्या Google खोज API सीधे यह CSV बनाता है?
नहीं। प्रदर्शित निर्यातक स्थानीय रूप से संग्रहित JSON को परिवर्तित करता है। फ़ाइल निर्माण और साइडकार स्कीमा Python प्रोग्राम का हिस्सा हैं।
प्रश्न: जब प्रश्न में पहले से एक कॉलम है, तो request_json को क्यों रखा जाए?
पूर्ण अनुरोध वैकल्पिक सेटिंग्स और पूर्ण-यूआरएल इनपुट को बनाए रखता है जिसे केवल एक प्रश्न कॉलम नहीं दर्शा सकता।
प्रश्न: क्या CSV उद्धरण सूत्र व्याख्या को रोकते हैं?
नहीं। डिलिमीटर की हैंडलिंग और स्प्रेडशीट मूल्यांकन अलग हैं। एक प्रलेखित टेक्स्ट नीति लागू करें और इच्छित आयात कार्यप्रवाह की पुष्टि करें।
प्रश्न: क्या एक खाली CSV का मतलब है कि खोज ने कोई परिणाम नहीं लौटाए?
नहीं। वर्तमान खाली सरणी और लंबित, असफल, या अप्रकाशित संग्रह के बीच अंतर करने के लिए साइडकार स्थिति की जांच करें।
प्रश्न: क्या मूल मानों को पुनः प्राप्त किया जा सकता है?
हाँ, रखे गए इनपुट कैप्चर से। CSV एक प्रक्षिप्ति है और जानबूझकर कुछ पाठ प्रतिनिधित्व को स्प्रेडशीट उपयोग के लिए परिवर्तित करता है।
स्क्रैपलेस में, हम केवल सार्वजनिक रूप से उपलब्ध डेटा का उपयोग करते हैं, जबकि लागू कानूनों, विनियमों और वेबसाइट गोपनीयता नीतियों का सख्ती से अनुपालन करते हैं। इस ब्लॉग में सामग्री केवल प्रदर्शन उद्देश्यों के लिए है और इसमें कोई अवैध या उल्लंघन करने वाली गतिविधियों को शामिल नहीं किया गया है। हम इस ब्लॉग या तृतीय-पक्ष लिंक से जानकारी के उपयोग के लिए सभी देयता को कोई गारंटी नहीं देते हैं और सभी देयता का खुलासा करते हैं। किसी भी स्क्रैपिंग गतिविधियों में संलग्न होने से पहले, अपने कानूनी सलाहकार से परामर्श करें और लक्ष्य वेबसाइट की सेवा की शर्तों की समीक्षा करें या आवश्यक अनुमतियाँ प्राप्त करें।



