LoginSignup
ken100
@ken100

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

Webスクレイピングでエラーが出て困っています

会社名と会社の住所のリストからスクレイピングで会社のウェブサイトのURLとそのウェブサイトの中の問い合わせフォームのURLを抽出してCSVファイルに書き出すというコードを作りました。

検索にはDuckduckgoを使っています。特にこだわりはないので他の検索でいいものがあれば教えてください。

しかし、会社名を検索してもNoneの値がCSVに入っているだけで
会社のウェブサイトのURLの取得すらできていません。

何か間違っている部分はありますでしょうか。

venvの仮想環境で実行しています。
以下は現在実行しているコードになります。

import requests
from bs4 import BeautifulSoup
import pandas as pd
import time
# duckduckgo_searchモジュールをインポートするためには、以下のようにインポート文を追加します
from duckduckgo_search import DDGS
import sys
print(sys.path)
print(sys.executable)
def get_company_url(company_name):
    try:
        with DDGS() as ddgs:
            results = ddgs.text(
                keywords=company_name, 
                region='jp-jp',
                safesearch='moderate',
                time='y',
                max_results=5,
                user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.36'
            )
        
        for result in results:
            if company_name in result:
                return result
        
        return None
    
    except Exception as e:
        print(f"Error occurred while searching for {company_name}")
        return None

def get_contact_url(company_url):
    try:
        response = requests.get(company_url)
        soup = BeautifulSoup(response.text, "html.parser")

        contact_link = soup.find("a", string=["お問い合わせ", "お問い合わせフォーム", "Contact", "contact form"])
        if contact_link:
            contact_url = contact_link.get("href")
            if not contact_url.startswith("http"):
                contact_url = company_url + contact_url
            return contact_url
        else:
            return None
    except Exception as e:
        print(f"Error occurred while scraping {company_url}")
        return None

df = pd.read_csv("company_list.csv")

results = []

for index, row in df.iterrows():
    company_name = row["会社名"]
    company_url = get_company_url(company_name)
    
    print(f"Company URL: {company_url}")
    
    if company_url:
        contact_url = get_contact_url(company_url)
        print(f"Contact URL: {contact_url}")
    else:
        contact_url = None
    
    result = {
        "会社名": company_name,
        "住所": row["住所"],
        "WebサイトURL": company_url,
        "問い合わせフォームURL": contact_url
    }
    results.append(result)
    
    time.sleep(3)  # 各会社の処理の間に3秒の待機時間を設ける

    # 結果をCSVファイルに出力
    df_result = pd.DataFrame(results)
    df_result.to_csv("result.csv", index=False)
0

2Answer

マルチポスト⇒ https://ja.stackoverflow.com/questions/99139/web%e3%82%b9%e3%82%af%e3%83%ac%e3%82%a4%e3%83%94%e3%83%b3%e3%82%b0%e3%81%a7%e3%82%a8%e3%83%a9%e3%83%bc%e3%81%8c%e5%87%ba%e3%81%a6%e5%9b%b0%e3%81%a3%e3%81%a6%e3%81%84%e3%81%be%e3%81%99

スクレイピングは、サイトの管理者に許可を得ているとか、規約に従って専用の API にアクセスしているとかでなければ、迷惑行為になるかもしれないということは認識してますか?

クローラーを作って某図書館サイトにアクセスしたら業務妨害とかで逮捕された事例もありますので、甘く見ない方がいいと思います。

逮捕までいかなくても、被害が深刻な場合は損害賠償の訴訟を受けるかもしれません。

訴訟までいかなくても、アクセス遮断ならWeb サーバーの設定で可能なので、多分に可能性はあると思います。帯域ごと遮断され、あなたのやったことで多数の利用者が巻き添えを喰らうことになるかもしれません。

回答するのは迷惑行為の手助けをすることになるかも。

0

こんにちは。
「エラーが出て困っている」ということですが、エラーの内容が本文に含まれていないようです。
まずはエラーの発生箇所と内容を明確にしていただくといいのかなと思います。

0

Your answer might help someone💌