前提・実現したいこと
pythonを使ってGoogleスプレッドシートにスクレイピング結果を書き込むスクリプトを実行しようとしたのですが以下のようなエラーメッセージが表示されてしまいます。
原因や解決策があればご教授いただけますでしょうか。
他にも原因特定に必要な情報がありましたら追記しますのでお教えてください。
発生している問題・エラーメッセージ
raceback (most recent call last): File "/Users/test_user/.pyenv/versions/3.9.4/lib/python3.9/site-packages/urllib3/response.py", line 401, in _decode data = self._decoder.decompress(data) File "/Users/test_user/.pyenv/versions/3.9.4/lib/python3.9/site-packages/urllib3/response.py", line 88, in decompress ret += self._obj.decompress(data) zlib.error: Error -3 while decompressing data: incorrect data check During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/Users/test_user/.pyenv/versions/3.9.4/lib/python3.9/site-packages/requests/models.py", line 753, in generate for chunk in self.raw.stream(chunk_size, decode_content=True): File "/Users/test_user/.pyenv/versions/3.9.4/lib/python3.9/site-packages/urllib3/response.py", line 572, in stream for line in self.read_chunked(amt, decode_content=decode_content): File "/Users/test_user/.pyenv/versions/3.9.4/lib/python3.9/site-packages/urllib3/response.py", line 768, in read_chunked decoded = self._decode( File "/Users/test_user/.pyenv/versions/3.9.4/lib/python3.9/site-packages/urllib3/response.py", line 404, in _decode raise DecodeError( urllib3.exceptions.DecodeError: ('Received response with content-encoding: gzip, but failed to decode it.', error('Error -3 while decompressing data: incorrect data check')) During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/Users/test_user/copy_test.py", line 21, in <module> response = requests.get(url) File "/Users/test_user/.pyenv/versions/3.9.4/lib/python3.9/site-packages/requests/api.py", line 76, in get return request('get', url, params=params, **kwargs) File "/Users/test_user/.pyenv/versions/3.9.4/lib/python3.9/site-packages/requests/api.py", line 61, in request return session.request(method=method, url=url, **kwargs) File "/Users/test_user/.pyenv/versions/3.9.4/lib/python3.9/site-packages/requests/sessions.py", line 542, in request resp = self.send(prep, **send_kwargs) File "/Users/test_user/.pyenv/versions/3.9.4/lib/python3.9/site-packages/requests/sessions.py", line 697, in send r.content File "/Users/test_user/.pyenv/versions/3.9.4/lib/python3.9/site-packages/requests/models.py", line 831, in content self._content = b''.join(self.iter_content(CONTENT_CHUNK_SIZE)) or b'' File "/Users/test_user/.pyenv/versions/3.9.4/lib/python3.9/site-packages/requests/models.py", line 758, in generate raise ContentDecodingError(e) requests.exceptions.ContentDecodingError: ('Received response with content-encoding: gzip, but failed to decode it.', error('Error -3 while decompressing data: incorrect data check'))
該当のソースコード
具体的なサイトURLや秘密鍵などは伏せ字にしています。
import requests from bs4 import BeautifulSoup import re import gspread from oauth2client.service_account import ServiceAccountCredentials from datetime import datetime import sys from time import sleep def get_gspread_book(secret_key, book_name): scope = ['https://www.googleapis.com/auth/spreadsheets', 'https://www.googleapis.com/auth/drive'] #jsonファイルで認証情報設定 credentials = ServiceAccountCredentials.from_json_keyfile_name(secret_key, scope) gc = gspread.authorize(credentials) #認証情報を使用してGoogleAPIにログイン book = gc.open(book_name) #ファイル名を指定してGoogleスプレッドシートを開く return book #開いたGoogleスプレッドシートを戻り値に指定 #requestsを利用してWEBサイトの情報をダウンロード url = 'https://****.jp/' response = requests.get(url) #BeautifulSoup()に取得したWEBサイトの情報とパーサー"html.parser"を渡す soup = BeautifulSoup(response.text, "html.parser") #href属性の中で"***/pickup"が含まれているもののみ全て抽出 elems = soup.find_all(href = re.compile("***/pickup"),limit=8) #jsonファイルとbook名でspreadsheetをopenする secret_key = '/Users/test_user/modular-******.json' book_name = 'test_sheet' sheet_name = 'シート1' sheet = get_gspread_book(secret_key, book_name).worksheet(sheet_name) #spreadsheetの最終行を取得 values1 = sheet.col_values(1) #列の情報をまとめてlistに取得 lastrow1 = len(values1) #listの長さ=行数 #soup結果listをspreadsheetに反映する #写真付きの最後の1要素はエラーとなるのでエラ〜ハンドリングを行う for elem in elems: lastrow1 += 1 try: sheet.update_acell('B' + str(lastrow1), elem.contents[0]) except: print('エラーが発生しました') print(elem.attrs['href']) else: datetimestr = datetime.now().strftime("%Y/%m/%d %H:%M:%S") sheet.update_acell('A' + str(lastrow1), datetimestr) sheet.update_acell('B' + str(lastrow1), elem.contents[0]) sheet.update_acell('C' + str(lastrow1), elem.attrs['href']) sleep(2) print(datetimestr,'スクレイピングを終了しました。')
補足情報(FW/ツールのバージョンなど)
パッケージなどのバージョンは以下のとおりです
Python 3.9.4
Package Version -------------------- --------- beautifulsoup4 4.9.3 cachetools 4.2.1 certifi 2020.12.5 chardet 4.0.0 google-auth 1.28.0 google-auth-oauthlib 0.4.4 gspread 3.7.0 httplib2 0.19.1 idna 2.10 oauth2client 4.1.3 oauthlib 3.1.0 pip 20.2.3 pyasn1 0.4.8 pyasn1-modules 0.2.8 pyparsing 2.4.7 requests 2.25.1 requests-oauthlib 1.3.0 rsa 4.7.2 setuptools 49.2.1 six 1.15.0 soupsieve 2.2.1 urllib3 1.26.4
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2021/04/06 06:44
2021/04/06 07:32
退会済みユーザー
2021/04/06 10:00
2021/04/06 10:06
2021/04/06 10:08
退会済みユーザー
2021/04/07 03:07