前提
Pythonで複数のURLが記載されたCSVファイルから
順番にURLを取得してaタグからURL、h1タグからタイトルなどをスクレイピングしたいです。
csvに書かれた複数のURLを順番に。というのがうまくできずアドバイスいただきたいです。
csvの最後に書かれたURLのみだけをスクレイピングしている状況です。
実現したいこと
- 複数のURLが書かれたcsvを読み込む
- 読み込んだURLにアクセスする
- アクセスしたページのタイトルを取得する
- 同じくアクセスしたページのaタグからURLを取得する
- 上記で取得したURLがリンク切れ(ステータスコード200以外)の場合のみ該当URLを新規csvに書き込む
発生している問題・エラーメッセージ
Traceback (most recent call last): File "csv_processing.py", line 39, in <module> resp = requests.get(url) File "C:\Users\PC002\AppData\Roaming\Python\Python38\site-packages\requests\api.py", line 75, in get return request('get', url, params=params, **kwargs) File "C:\Users\PC002\AppData\Roaming\Python\Python38\site-packages\requests\api.py", line 61, in request return session.request(method=method, url=url, **kwargs) File "C:\Users\PC002\AppData\Roaming\Python\Python38\site-packages\requests\sessions.py", line 515, in request prep = self.prepare_request(req) File "C:\Users\PC002\AppData\Roaming\Python\Python38\site-packages\requests\sessions.py", line 443, in prepare_request p.prepare( File "C:\Users\PC002\AppData\Roaming\Python\Python38\site-packages\requests\models.py", line 318, in prepare self.prepare_url(url, params) File "C:\Users\PC002\AppData\Roaming\Python\Python38\site-packages\requests\models.py", line 392, in prepare_url raise MissingSchema(error) requests.exceptions.MissingSchema: Invalid URL '/': No scheme supplied. Perhaps you meant http:///?
該当のソースコード
Python
1import csv 2from csv import reader 3import time 4from concurrent.futures import ThreadPoolExecutor 5import requests 6from bs4 import BeautifulSoup 7 8 9# ----------------------------------- 10# リンクチェック 11# ----------------------------------- 12 13# CSVを読み込む 14# as fw:で、開いたファイルをfwというオブジェクトに置き換えて利用できるように 15with open("cat_url.csv") as fw: 16 17 # fwというオブジェクトをCSVモジュールのreaderメソッドを利用して読み込み 18 csv.reader(fw) 19 # csv.reader(fw)で読み込んだ内容を1行単位でcar_url_listというオブジェクトに代入 20 for car_url_list in csv.reader(fw): 21 22 # アクセスするURL 23 resp = requests.get(car_url_list[0]) 24 print(resp) 25 # BeauttifulSoupを使用してHTML整形 26 soup = BeautifulSoup(resp.text, 'html.parser') 27 # タイトルを取得 28 title = soup.find("h1").get_text() 29 30 # aタグからURLを取得し、HTTPリクエストを送る 31 for link in soup.find_all('a'): 32 33 # URLを取得し、HTTPリクエスト 34 url = link.get('href') 35 if url is None: 36 continue 37 elif url == '#': 38 continue 39 resp = requests.get(url) 40 41 # 条件分岐(リンク切れの場合のみcsvに書き出し) 42 if resp.status_code == 200: 43 print("NG URL : " + url) 44 45 # 結果をCSVに出力する 46 file = open('a_href.csv','a') 47 file.write(str(resp.status_code) + ',' + url + '\n') 48 file.close()
試したこと
URLが記載されたcat_url.csv(URLが1列に縦に並んでいます)があります。
この時、下記部分にcat_url.csvからURLを順に取得していけばよいのかなと考えているのですが、
resp = requests.get(URL)
cat_url.csvの最後に記載されたURLのみだけが取得されて処理が終わってしまいます。
見落としている視点はありますか?
アドバイスいただけますと幸いです。
補足情報
Windows11
anaconda navigator 2.3.1
python 3.8.13
scrapy 2.4.1
requests 2.28.1
vscode 1.72.0

回答2件
あなたの回答
tips
プレビュー