چگونه داده های Bing News را با SerpApi و Python استخراج کنیم
مقدمه
در این پست وبلاگ، فرآیند استخراج Bing News را با استفاده از API نتایج موتور خبری Bing و زبان برنامه نویسی پایتون مرور خواهیم کرد. می توانید کد کامل را در IDE آنلاین (Replit) مشاهده کنید.
چه چیزی تراشیده خواهد شد
چرا از API استفاده می کنیم؟
چند دلیل وجود دارد که ممکن است از API استفاده کند، به ویژه دلیل ما:
- نیازی به ایجاد تجزیه کننده از ابتدا و نگهداری آن نیست.
- دور زدن بلوکهای Google: حل کردن CAPTCHA یا حل بلوکهای IP.
- برای پروکسی ها و حل کننده های CAPTCHA پرداخت کنید.
- بخش قانونی خراش دادن داده ها را مشخص کنید.
SerpApi با زمان پاسخگویی سریع زیر 1.5 ثانیه (~1.0 ثانیه با سرعت مسخره) در هر درخواست و بدون اتوماسیون مرورگر، همه چیز را در پشتیبان مدیریت می کند، که بسیار سریعتر می شود. زمان پاسخ و نرخ وضعیت در صفحه وضعیت SerpApi نشان داده شده است.
کد کامل
این کد همه اخبار را با صفحه بندی بازیابی می کند:
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
]
📌توجه: برای یک نمایش زنده و تعاملی به زمین بازی بروید.
پیوندها
به ما بپیوندید در توییتر | یوتیوب
یک درخواست ویژگی💫 یا یک اشکال🐞 اضافه کنید