1. ホーム
  2. python

[解決済み] PythonでBingの検索結果を取得する

2022-02-09 07:13:37

質問

Pythonを使って、Bingの検索結果を取得できるチャットボットを作ろうとしています。いろいろなサイトを試しましたが、どれも古いPython 2のコードかGoogleを使っています。私は現在中国におり、YouTube、Google、その他Googleに関連するものにアクセスできません(AzureとMicrosoft Docsも使えません)。私は結果がこのようになることを望んでいます。

This is the title
https://this-is-the-link.com

This is the second title
https://this-is-the-second-link.com

コード

import requests
import bs4
import re
import urllib.request
from bs4 import BeautifulSoup
page = urllib.request.urlopen("https://www.bing.com/search?q=programming")
soup = BeautifulSoup(page.read())
links = soup.findAll("a")
for link in links:
    print(link["href"])

そして、それは私に

/?FORM=Z9FD1
javascript:void(0);
javascript:void(0);
/rewards/dashboard
/rewards/dashboard
javascript:void(0);
/?scope=web&FORM=HDRSC1
/images/search?q=programming&FORM=HDRSC2
/videos/search?q=programming&FORM=HDRSC3
/maps?q=programming&FORM=HDRSC4
/news/search?q=programming&FORM=HDRSC6
/shop?q=programming&FORM=SHOPTB
http://go.microsoft.com/fwlink/?LinkId=521839
http://go.microsoft.com/fwlink/?LinkID=246338
https://go.microsoft.com/fwlink/?linkid=868922
http://go.microsoft.com/fwlink/?LinkID=286759
https://go.microsoft.com/fwlink/?LinkID=617297

どのようなヘルプも非常に感謝されます(私はUbuntu上のPython 3.6.9を使用しています)。

どのように解決するのですか?

実は、あなたが書いたコードは正常に動作しているのですが、問題はHTTPリクエストヘッダにあるのです。デフォルトでは urllib 使用 Python-urllib/{version} として User-Agent ヘッダーの値を変更すると、ウェブサイトはあなたのリクエストが自動生成されたものであると簡単に認識します。これを避けるには、カスタム値を使用する必要があります。 Request オブジェクトの最初のパラメータとして urlopen() :

from urllib.parse import urlencode, urlunparse
from urllib.request import urlopen, Request
from bs4 import BeautifulSoup

query = "programming"
url = urlunparse(("https", "www.bing.com", "/search", "", urlencode({"q": query}), ""))
custom_user_agent = "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0"
req = Request(url, headers={"User-Agent": custom_user_agent})
page = urlopen(req)
# Further code I've left unmodified
soup = BeautifulSoup(page.read())
links = soup.findAll("a")
for link in links:
    print(link["href"])

追伸:ご質問の下にある @edd さんのコメントをご覧ください。