برنامه نویسی

چگونه داده های Bing News را با SerpApi و Python استخراج کنیم

مقدمه

در این پست وبلاگ، فرآیند استخراج Bing News را با استفاده از API نتایج موتور خبری Bing و زبان برنامه نویسی پایتون مرور خواهیم کرد. می توانید کد کامل را در IDE آنلاین (Replit) مشاهده کنید.

چه چیزی تراشیده خواهد شد

چرا از API استفاده می کنیم؟

چند دلیل وجود دارد که ممکن است از API استفاده کند، به ویژه دلیل ما:

  • نیازی به ایجاد تجزیه کننده از ابتدا و نگهداری آن نیست.
  • دور زدن بلوک‌های Google: حل کردن CAPTCHA یا حل بلوک‌های IP.
  • برای پروکسی ها و حل کننده های CAPTCHA پرداخت کنید.
  • بخش قانونی خراش دادن داده ها را مشخص کنید.

SerpApi با زمان پاسخگویی سریع زیر 1.5 ثانیه (~1.0 ثانیه با سرعت مسخره) در هر درخواست و بدون اتوماسیون مرورگر، همه چیز را در پشتیبان مدیریت می کند، که بسیار سریعتر می شود. زمان پاسخ و نرخ وضعیت در صفحه وضعیت SerpApi نشان داده شده است.

serpapi-status-all

کد کامل

این کد همه اخبار را با صفحه بندی بازیابی می کند:

from serpapi import BingSearch
import json

params = {
    'api_key': '...',                   # https://serpapi.com/manage-api-key
    'q': 'Coffee',                      # search query
    'engine': 'bing_news',              # search engine
    'cc': 'US',                         # country of the search
    'first': 1,                         # pagination
    'count': 10,                        # number of results per page
    'qft': 'interval="7"'               # news for past 24 hours
}

search = BingSearch(params)             # data extraction on the SerpApi backend
results = search.get_dict()             # JSON -> Python dict

bing_news_results = []

page_count = 0
page_limit = 5

while 'error' not in results and page_count < page_limit:
    bing_news_results.extend(results.get('organic_results', []))

    params['first'] += params['count']
    page_count += 1
    results = search.get_dict()

print(json.dumps(bing_news_results, indent=2, ensure_ascii=False))
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

آماده سازی

نصب کتابخانه:

pip install google-search-results
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

google-search-results یک بسته SerpApi API است.

توضیح کد

واردات کتابخانه ها:

from serpapi import BingSearch
import json
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

کتابخانههدف
BingSearchبرای خراش دادن و تجزیه نتایج Bing با استفاده از کتابخانه scraping وب SerpApi.
jsonبرای تبدیل داده های استخراج شده به یک شی JSON.

پارامترها برای تولید URL تعریف شده اند. اگر می خواهید پارامترهای دیگری را به URL ارسال کنید، می توانید این کار را با استفاده از params فرهنگ لغت:

params = {
    'api_key': '...',                   # https://serpapi.com/manage-api-key
    'q': 'Coffee',                      # search query
    'engine': 'bing_news',              # search engine
    'cc': 'US',                         # country of the search
    'first': 1,                         # pagination
    'count': 10,                        # number of results per page
    'qft': 'interval="7"'               # news for past 24 hours
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

مولفه هایتوضیح
api_keyپارامتر کلید خصوصی SerpApi را برای استفاده تعریف می کند.
qپارامتر عبارت جستجو را مشخص می کند. شما می توانید از هر چیزی که در جستجوی معمولی Bing استفاده می کنید استفاده کنید. (به عنوان مثال، 'query'، NOT، OR، site:، filetype:، near:، ip:، loc:، feed: و غیره.).
engineتنظیم پارامتر به bing_news برای استفاده از موتور Bing News API.
ccپارامتر کشوری را که باید از آن جستجو کنید مشخص می کند. از قالب 2 کاراکتری ISO_3166-1 پیروی می کند. (به عنوان مثال، us برای ایالات متحده، de برای آلمان، gb برای انگلستان و غیره).
firstپارامتر افست نتایج ارگانیک را کنترل می کند. این پارامتر به صورت پیش فرض است 1. (به عنوان مثال، first=10 دهمین نتیجه ارگانیک را به جایگاه اول منتقل می کند).
countپارامتر تعداد نتایج در هر صفحه را کنترل می کند. این پارامتر فقط یک پیشنهاد است و ممکن است نتایج واقعی بازگشتی را منعکس نکند.
qftپارامتر نتایج مرتب شده بر اساس تاریخ را تعریف می کند. اگر پارامتر تنظیم نشود، به‌طور پیش‌فرض به مرتب‌سازی «بهترین تطابق» تبدیل می‌شود. می توان آن را تنظیم کرد: interval="4" – ساعت گذشته interval="7" – 24 ساعت گذشته، interval="8" – 7 روز گذشته، interval="9" – 30 روز گذشته، sortbydate="1" – اخیرا.

📌نکته: همچنین می توانید پارامترهای API دیگری را اضافه کنید.

سپس، یک را ایجاد می کنیم search شیئی که در آن داده ها از باطن SerpApi بازیابی می شوند. در results دیکشنری که داده ها را از JSON دریافت می کنیم:

search = BingSearch(params)         # data extraction on the SerpApi backend
results = search.get_dict()         # JSON -> Python dict
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

قبل از استخراج داده ها، bing_news_results لیستی ایجاد می شود که این داده ها بعداً اضافه می شوند:

bing_news_results = []
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

این page_limit متغیر محدودیت صفحه را مشخص می کند. اگر می خواهید داده ها را از تعداد صفحات متفاوتی استخراج کنید، به سادگی تعداد مورد نیاز را در این متغیر بنویسید.

page_limit = 5
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

برای دریافت همه نتایج، باید صفحه بندی را اعمال کنید. این با بررسی زیر حاصل می شود: در حالی که وجود ندارد error در results و جریان page_count مقدار کمتر از مقدار مشخص شده است page_limit مقدار، داده ها را استخراج می کنیم، مقدار را افزایش می دهیم first پارامتر توسط مقدار count پارامتر برای دریافت نتایج از صفحه بعد و به روز رسانی results شی با داده های صفحه جدید:

page_count = 0

while 'error' not in results and page_count < page_limit:
    # data extraction from current page will be here

    params['first'] += params['count']
    page_count += 1
    results = search.get_dict()
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

گسترش دادن bing_news_results فهرستی با داده های جدید از هر صفحه:

bing_news_results.extend(results.get('organic_results', []))
# title = results['organic_results'][0]['title']
# link = results['organic_results'][0]['link']
# snippet = results['organic_results'][0]['snippet']
# source = results['organic_results'][0]['source']
# date = results['organic_results'][0]['date']
# thumbnail= results['organic_results'][0]['thumbnail']
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

📌توجه: در نظرات بالا نحوه استخراج فیلدهای خاص را نشان دادم. ممکن است متوجه شده باشید results['organic_results'][0]. این شاخص یک نتیجه ارگانیک است، به این معنی که ما در حال استخراج داده ها از اولین نتیجه ارگانیک هستیم. این results['organic_results'][1] از نتیجه آلی دوم و غیره است.

پس از بازیابی همه داده ها، با فرمت JSON خروجی می شود:

print(json.dumps(bing_news_results, indent=2, ensure_ascii=False))
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

خروجی

[
  {
    "title": "Coffee drinkers get more steps but also less sleep, study finds",
    "link": "https://www.cbsnews.com/sacramento/news/coffee-drinkers-get-more-steps-but-also-less-sleep-study-finds/",
    "snippet": "Coffee is one of the most consumed beverages worldwide, but the pendulum has swung back and forth about its benefits and ...",
    "source": "CBS News",
    "date": "5h",
    "thumbnail": "https://serpapi.com/searches/6421c51af26ac67a4930a857/images/85e52d2243238795454091b5f6b3f41e7f9969cd089f02e76ad21147c47e4f69.jpeg"
  },
  {
    "title": "Cedarburg School Board candidate accused of sexually harassing young workers at his former coffee shop",
    "link": "https://www.jsonline.com/story/news/education/2023/03/27/cedarburg-school-board-candidate-accused-of-sexual-harassment-coffee-shop/70039331007/",
    "snippet": "Former employees accused Scott Sidney, a Cedarburg School Board candidate, of inappropriate words and actions at his former ...",
    "source": "Milwaukee Journal Sentinel",
    "date": "5h",
    "thumbnail": "https://serpapi.com/searches/6421c51af26ac67a4930a857/images/85e52d2243238795454091b5f6b3f41e8897032186a0a3603444deba3cdd76a7.jpeg"
  },
  {
    "title": "New development near WoodTrust in Grand Rapids; new merch from local coffee shop | Streetwise",
    "link": "https://news.yahoo.com/development-near-woodtrust-grand-rapids-100428122.html",
    "snippet": "If you know of a new business, a development or a place that’s closing, send me a note at cshuda@gannett.com. If you have ...",
    "source": "YAHOO!News",
    "date": "6h",
    "thumbnail": "https://serpapi.com/searches/6421c51af26ac67a4930a857/images/85e52d2243238795454091b5f6b3f41e5f1483416a23fbf49adc15101a042c82.jpeg"
  },
  ... other news
]
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

📌توجه: برای یک نمایش زنده و تعاملی به زمین بازی بروید.

به ما بپیوندید در توییتر | یوتیوب

یک درخواست ویژگی💫 یا یک اشکال🐞 اضافه کنید

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

همچنین ببینید
بستن
دکمه بازگشت به بالا