2019年12月5日木曜日

開発環境

退屈なことはPythonにやらせよう ―ノンプログラマーにもできる自動化処理プログラミング (Al Sweigart(著)、相川 愛三(翻訳)、オライリージャパン)の第Ⅱ部(処理の自動化)、11章(Webスクレイピング)、11.10(演習プロジェクト)、11.10.4(リンクの検査)の解答を求めてみる。

コード

#!/usr/bin/env python3
import requests
import bs4
import os
import sys
import re

print('11.10.4')

if len(sys.argv) == 1:
    url = 'https://www.example.com'
else:
    url = sys.argv[1]

try:
    res = requests.get(url)
    res.raise_for_status()
except Exception as err:
    print(err)
    sys.exit(1)

bs = bs4.BeautifulSoup(res.text, 'lxml')
elems = bs.select('a')
dirname = 'downloads'
os.mkdir(dirname)
os.chdir(dirname)
reg = re.compile(r'^\s*$')
urls = {elem.get('href') for elem in elems}
for url0 in urls:
    if not url0.startswith('http'):
        url0 = url + url0
    data = requests.get(url0)
    try:
        data.raise_for_status()
    except Exception as err:
        print(f'{url0}: {err}')
    else:
        filename = os.path.basename(url0)
        if reg.match(filename):
            continue
        with open(filename, 'wb') as f:
            for chunk in data.iter_content(1000000):
                f.write(chunk)

入出力結果(Zsh、cmd.exe(コマンドプロンプト)、Terminal、Jupyter(IPython))

% ./sample18.py 
11.10.4
% ls downloads 
./  ../  example
% rm -rf downloads 
% ./sample18.py a    
11.10.4
Invalid URL 'a': No schema supplied. Perhaps you meant http://a?
% ./sample18.py https://a.com
11.10.4
HTTPSConnectionPool(host='a.com', port=443): Max retries exceeded with url: / (Caused by NewConnectionError('<urllib3.connection.VerifiedHTTPSConnection object at 0x10ea8ee10>: Failed to establish a new connection: [Errno 8] nodename nor servname provided, or not known'))
% ./sample18.py https://www.yahoo.co.jp
11.10.4
https://news.yahoo.co.jp/fc: 502 Server Error: connect failed for url: https://news.yahoo.co.jp/fc
% 

0 コメント:

コメントを投稿