Pythonでやってみよ。記事一覧の取得
やってみた。スケルトンライナー。その1
先日(2025-07-08)、pythonで自分の記事一覧を取得しましたが、ログインして記事一覧のWebページのソースを取得して、という方法でした。
今日は、ログインせずに記事のクリエーター名をクリックして表示されるページからやってみました。
>>> url0=pathlib.Path('~/Downloads/note_codingkiwi/note_codingkiwi.html').expanduser().read_text();rt=BeautifulSoup(url0,'lxml');d_=list(set([x.get('href') for x in rt.find_all('a') if x.get('title')!=None]))[::-1];a_=[BeautifulSoup(requests.get(x).text,'lxml') for x in d_];t_=[x.find('h1',class_='o-noteContentHeader__title').text.strip() for x in a_];t1_=[x.time.text.strip() for x in a_];z_=[subp.run(['w3m','-s','-dump','-cols','2000',x],capture_output=True,encoding='utf-8').stdout for x in d_];ans_=[w+'\t'+datetime.datetime.strptime((x),'%Y年%m月%d日 %H:%M').strftime('%Y%m%d%H%M')+'\t'+y+'\n'+z for w,x,y,z in zip(t_,t1_,d_,z_)];ans_=sorted(ans_,key=lambda x:x.split('\t')[1]);pr_joinn(ans_);exec("for x in ans_:fw(str(pathlib.Path('~/Downloads/note_codingkiwi/').expanduser())+'/notecom_codingkiwi'+'_'+x.split('\t')[0]+'_'+x.split('\t')[1]+'.txt',x.split('\t')[-1]);time.sleep(3)")
うまくできたので、ついでにプライムビデオでみたい番組の一覧ページから、番組名とurlを「visidata」で表示するスケルトンライナーもつくってみようと、やってみたら、できた。
#pythonでBeautifulSoupでprimeの番組一覧取得する方法vv
$ pn -c "$imt;url='https://www.amazon.co.jp/gp/video/browse/ref=atv_tv_hom_c_ob70491c_2_smr?serviceToken=v0_Cl0KJGY3M2I2MWExLTBlYWItNDM1Mi1hYmNmLWMyNzdhYjJjNzM3MBCA7euVgDMaLDR6R2Vsa3lyWVVHSW9CcTNmUlJKK1U4V0c0TWluS0RsbGtXRXdBYmtCMG89IAESBXF1ZXJ5GAEqB2RlZmF1bHQyBmNlbnRlcjoGc2VhcmNoUglPQjcwNDkxY3N6AIIBkAUSKjI6T0IxRTk4M0YyRkU3MzgjI01aUVdHWkxVTVZTRUdZTFNONTJYR1pMTRqwBHFzLW9mZmVyX3R5cGU9MSZxcy1jb3VudHJ5LWNvZGU9SlAmcXMtZW50aXR5X3R5cGU9MiZmaWVsZC13YXlzX3RvX3dhdGNoPTM3NDYzMzAwNTEmcF9uX2VudGl0eV90eXBlPTQxNzQwOTkwNTEmYWR1bHQtcHJvZHVjdD0wJnNlYXJjaC1hbGlhcz1pbnN0YW50LXZpZGVvJmJxPShhbmQgKGFuZCAoYW5kIChhbmQgKG5vdCAob3IgZ2VucmU6J2F2X2dlbnJlX2Vyb3RpYycgYXZfcHJpbWFyeV9nZW5yZTonYXZfZ2VucmVfZXJvdGljJykpIChub3QgKG9yIGdlbnJlOidhdl9nZW5yZV9raWRzJyBhdl9wcmltYXJ5X2dlbnJlOidhdl9nZW5yZV9raWRzJykpKSAoYW5kIChvciBnZW5yZS1iaW46J2F2X2dlbnJlX3N1c3BlbnNlJyBhdl9wcmltYXJ5X2dlbnJlOidhdl9nZW5yZV9zdXNwZW5zZScpIGVudGl0eV90eXBlOidUViBTaG93JykpIChub3QgYXZfa2lkX2luX3RlcnJpdG9yeTonSlAnKSkgKG5vdCBlbnRpdHlfdHlwZTonUHJvbW90aW9ufFRyYWlsZXJ8Qm9udXMgQ29udGVudCcpKSZwdl9icm93c2VfaW50ZXJuYWxfb2ZmZXI9c3ZvZCZwdl9icm93c2VfaW50ZXJuYWxfbGFuZ3VhZ2U9YWxsIinjg5_jgrnjg4bjg6rjg7zjg7vjgrXjgrnjg5rjg7PjgrlUVueVque1hDAAUABwAA%3D%3D&jic=8%7CEgRzdm9k';from selenium import webdriver;from selenium.webdriver.firefox.options import Options;from selenium.webdriver.support.select import Select;from selenium.webdriver.common.by import By;from selenium.webdriver.common.keys import Keys;from selenium.webdriver.common.alert import Alert;from selenium.webdriver.support.ui import WebDriverWait;from selenium.webdriver.support import expected_conditions as EC;from selenium.common.exceptions import TimeoutException;chrome_options=Options();chrome_options.add_argument('--disable-gpu');chrome_options.add_argument('--disable-extensions');chrome_options.add_argument('--proxy-server=\"direct://\"');chrome_options.add_argument('--proxy-bypass-list=*');chrome_options.add_argument('--user-agent=\"Mozilla/5.0 (X11; Linux x86_64; rv:128.0) Gecko/20100101 Firefox/128.0\"');chrome_options.add_argument('--start-maximized');chrome_options.add_argument('--kiosk');chrome_options.headless=True;DRIVER_PATH='/usr/local/bin/geckodriver';chrome_options.binary_location='/usr/bin/firefox';driver=webdriver.Firefox(options=chrome_options);driver.implicitly_wait(30);driver.get(url);time.sleep(10);print('key');html=driver.page_source;rt=BeautifulSoup(html,'html.parser');a_=rt.find_all('ul',class_='K0Kf63 _9kJogN');b_=[x.find_all('a') for x in a_][0];act_=driver.find_element(By.XPATH,'//body');exec(\"for i in range(0,10):act_.send_keys(Keys.PAGE_DOWN);time.sleep(5);html=driver.page_source;rt=BeautifulSoup(html,'html.parser');a_=rt.find_all('ul',class_='K0Kf63 _9kJogN');b_+=[x.find_all('a') for x in a_][0]\");cb.copy('番組\turl\n'+'\n'.join([x.text+'\thttps://www.amazon.co.jp'+x.get('href') for x in set(b_)]));driver.quit();tt_=io.StringIO(cb.paste());df=pd.read_csv(tt_,sep='\t');tt_.close();vvw(vd,df)"
こちらは、Webページを開いてソースをテキストファイルに保存することなく、urlを指定して、「Selenium」で「ヘッドレス」でWebページを開いて、そこから直接取得しています。
ちょっと困ったところは、番組一覧がスクロールごとに読み込まれ、スクロールで見えなくなった部分は、Webページのソースから消えてしまうことでした。
Seleniumでページダウンをするたびにソースを読み込んで、必要な部分をリストに追加して、表示される全部の番組の一覧を取得して解決しました。
最後に「visidata」(vvw(vd,df)の部分)で、番組一覧を表示しています。そのまま一覧を眺めてみたい番組のurlをコピー(z+Y)して、ウェブブラウザに貼り付けて番組のページを開くのもよし、「visidata」で表示中に「Ctrl+s」でタブ区切りのテキストファイル(.tsv)へ保存すれば、あとから、いつでも表示させることができて便利です。
