WEBスクレイピングができない

投稿者: Anonymous PythonでWEBページをスクレイピングし、あるサイトから店名と住所情報を取得したいと考えています。 コラボラトリー環境で以下のコードを試してみたのですが、情報を取得できません。 コードのどこがいけないのかスクレイピングに詳しい方教えていただけませんでしょうか? !pip install geocoder import requests import pandas as pd from bs4 import BeautifulSoup from google.colab import files import os import geocoder from time import sleep from google.colab import files url1 = "https://www.aeon.com/store/list/%E7%B7%8F%E5%90%88%E3%82%B9%E3%83%BC%E3%83%91%E3%83%BC/%E3%82%A4%E3%82%AA%E3%83%B3%E3%83%BB%E3%82%A4%E3%82%AA%E3%83%B3%E3%82%B9%E3%82%BF%E3%82%A4%E3%83%AB/p_" url2 = "/?q=aeoncom" cols = [‘store_name’,’address’,’latlon’] df = pd.DataFrame(index=[],columns=cols) for i in range(1,22): response = requests.get(url1 + str(i)…(Continue Reading)

青空文庫(https://www.aozora.gr.jp)における全作品のテキストデータと初版発行年の取得

投稿者: Anonymous 現在私は青空文庫というページにあるデータを入力とする機械学習モデルを作ろうと考えています。 そのモデルの入力として青空文庫(https://www.aozora.gr.jp) にある作品のテキストデータとその作品の初版発行年が必要なのですが、これらのデータを抽出する方法がわからず困っています。 青空文庫には様々な作家による小説が保存されていて、ブラウザで直接個別の作品にアクセスできます。 例えば、青空文庫のトップページから以下のように「ああ華族様だよ と私は嘘を吐くのであった」という作品のページに飛ぶとテキストデータをダウンロードでき、その末尾の底本情報に以下のように初版出版年などが書かれています。 最初はスクレイピングでデータ抽出することを考えたのですが、githubで青空文庫のデータを一括ダウンロード(https://github.com/aozorabunko/aozorabunko) できることや野良APIであるPubserver(https://qiita.com/ksato9700/items/48fd0eba67316d58b9d6) を利用することができることも知りました。ただ、やはり青空文庫の全ての作品に対してテキストデータと初版発行年を抽出し、後で機械学習にかける入力として作品ごとのテキストデータと初版発行年の組をそれぞれ区別して保存する方法がわからずに混乱しています。 例えば、上にあげたgithubからデータをダウンロードする場合、cardsに入っている各ファイルの中にあるfilesからテキストデータと初版発行年が埋め込まれたzipファイルを全ての作品についてparseするのが良いのでしょうか? 初心者的な質問で申し訳ないのですが、アドバイスをいただけると大変助かります。 解決 青空文庫テキストへのアクセスについては 公開中 作家別作品一覧拡充版:全て(CSV形式、UTF-8、zip圧縮) を元に、GitHubからクローンしたローカルリポジトリー内のzipファイルのURLをスクリプト内で、URL→ローカルファイルパス変換(”https://www.aozora.gr.jp/“をローカルリポジトリーへのパスに置換する)事でトラフィックを押さえられると思います。 また 圧縮ファイルの文字コードはいわゆるShift-JISなので、文字コード変換を事前にしておくと良い 圧縮ファイルの中身のファイル名は圧縮ファイルのファイル名と異なるので、リネームしてzipファイルと同じにしておいた方が良い などの問題もありますので、ご注意下さい。 (この辺、プログラムから利用する側にとことん優しくないシステムになっており、プログラムから使いやすい構成になるように、もう少し口出し出来れば良かったと後悔しています) ファイルへの書き込みは別質問にされるようですのでここでは割愛させていただきます 回答者: Anonymous

seleniumを使って、見出しからタイトルを全てスクレイピングしたい

投稿者: Anonymous C#言語にてseleniumを用いたWebスクレイピングを行ってみているのですが、少し詰まってしまった事があるので質問させていただきます。 例としてlivedoorニュース http://news.livedoor.com/topics/category/main/ にて、上から見出しごとに記事が並んでいます。 これらの記事タイトルを抜き出したいのですが、一番上のものは Chrome.FindElement(By.XPath(“//*[@id=’main’]/div/section/div[1]/ul/li[1]/a/div/h3”)).Text(); などでおそらく取得できるのですが、それより下のものを取得していく方法がわかりません。 どうか教えてください。 解決 IWebDriver.FindElementのかわりにFindElementsメソッドを使用します。 回答者: Anonymous

BeautifulSoupで要素内の要素を取得したい

投稿者: Anonymous PythonでBeautifulSoupを使って、findを使って特定のclassのテキストを取得しようと思ったのですが、違うクラスの中の特定のクラスも取得してしまうので、二回findを使おうと思ったのですが、エラーが出てきてしまいました。 ソースコード <div class=”hoge”> <div class=”piyo”></div> </div> <div class=”hogehoge”> <div class=”piyo”></div> </div> これのhogeの中のpiyoだけを取得したいのですが、 soup.find_all(‘div’, ‘hoge’).find(‘div’, ‘piyo’) と ex = soup.find_all(‘div’, ‘hoge’) ex.find_all(‘div’, ‘piyo’) を試したのですがうまくいきませんでした。 何か良い方法はありませんか? 初心者ですみません。 追記 エラーはこのように出ました。 AttributeError: ResultSet object has no attribute ‘find_all’. You’re probably treating a list of elements like a single element. Did you call find_all() when you meant…(Continue Reading)

Python スクレイピング テーブル取得不可

投稿者: Anonymous URLの取扱銘柄一覧(テーブル)をスクレイピングをしたいのですが、 google colab取得ができません。どのように改善したらいいでしょうか。 import csv import urllib.request from bs4 import BeautifulSoup import pandas as pd urls = [‘https://mxp1.monex.co.jp/mst/servlet/ITS/ucu/UsSymbolListGST?etf=0′] for url in urls: html = urllib.request.urlopen(url) bsObj = BeautifulSoup(html, “html.parser”) table = bsObj.findAll(“table”, {“class”:”table-block”})[0] tables = table.findAll(“tr”) print(tables) with open(“america.csv”, “w”, encoding=’utf-8’) as file: writer = csv.writer(file) for row in tables: csvRow = []…(Continue Reading)

webページのソースに貼られたリンク先のhtmlファイルを取得する

投稿者: Anonymous やりたいことはリンクHP(下のpythonコードのurlと同じです)の背景がグレーの部分のデータをDataframeに格納することです. 背景がグレーの部分はリンク先のページに埋め込まれたhtmlファイルとなっていまして,リンクHPのソースを見ると html </TABLE> <IFRAME src=”/html/frm/DamFreeData2018071116325029223.html” scrolling=”AUTO” width=”840″ height=”65%” align=”center” frameborder=”0″ style=”border-width : 0px 0px 0px 0px;”></IFRAME> </CENTER> の「/html/frm/DamFreeData2018071116325029223.html」にデータのリンクが張られています.直接pandas.read_html(/html/frm/DamFreeData2018071116325029223.html)するのも1つの解決策なのですが,事情により最初に冒頭のHPに接続して,ソースのhtmlから’/html/frm/DamFreeData2018071116325029223.html’を取得したいのです. 現状は #!/usr/bin/python import pandas as pd import numpy as np url=’http://163.49.30.82/cgi-bin/DspDamData.exeKIND=1&ID=609061289920060&BGNDATE=20120701&ENDDATE=20120731&KAWABOU=NO’ dfs = pd.read_html(url) #dfs = pd.read_html(url, header=0,index_col=0)#htmlを読み込む print(dfs) とするとほしいデータの部分がNaNと表示されてしまいます.どなたか解決策を教えていただけないでしょうか? 解決 以下の段階にわけて処理する必要があると思います。 任意期間ダム諸量検索結果 ページへのアクセス iframeのsrc取得 iframeのsrcからデータ読み込み python scrapingをキーワードに見付けた、以下の記事を参考に記載しています。 PythonでWebスクレイピングする時の知見をまとめておく 事前インストール $ pip install requests…(Continue Reading)

scheduleで実行時間を自動化し、スクレイピング

投稿者: Anonymous 毎日一定の時刻に、特定のURLからjsonを取得しDataframeに保存する、ということがやりたいです。 テストとして1分置きでの取得条件で書いてみたのですが、実行すると以下のエラーが表示されてしまいます。 TypeError: get_all_reviews() missing 1 required positional argument: ‘url’ スクリプト(schedule部分のスクリプトを削除すると、正常に実行されます) def get_all_reviews(url): rvw_list_text = [] i = 1 while True: print(i,’searching’) i += 1 res = requests.get(url) res_json = json.loads(res.text) data = res_json.get(‘data’) for d in data: rvw_list_text.append(d) #dataが殻でなければ if data !=[]: paging = dict(res_json.get(‘paging’)) next_page = str(paging[‘next’]) url = next_page else:…(Continue Reading)

スクレイピング結果の複数行表示を1行表示にする方法

投稿者: Anonymous Pythonにてスクレイピングをしたいのですが、ファイル書き込みにおいて以下困っております。 ■目的 ・webページ(複数)テーブルタグ内のtd要素をcsvファイルとして書き込みしたい。 ■困っていること webページからtd要素を抜き出して以下のようにファイルを作成したいのですが、 1行目(URL1):要素1,要素2,要素3,,,, 2行目(URL2):要素1′,要素2′,要素3′,,,, ファイルを確認すると以下のように改行されてしまい、後からの整理が困難となってしまいます。 要素1 要素2 要素3 要素1′ 要素2′ 要素3′ . . . うまく出力する方法をご教示いただけないでしょうか? コードは以下です。 table = bsObj.findAll(“table”)[0] rows = table.findAll(“tr”) with open(“ebooks.csv”, “a”, encoding=’utf-8′) as file: writer = csv.writer(file) for row in rows: csvRow = [] for cell in row.findAll([‘td’]): csvRow.append(cell.get_text().replace(‘ ‘, ”).replace(‘n’, ”).replace(‘r’, ”)) writer.writerow(csvRow) 解決 元々のHTMLの構造が良く分からないので、ソースコードと出てきた結果から推測すると、各要素は1行に1つだけのようですね。…(Continue Reading)

Capybara, poltergeistでTimed out waiting for response toエラーが出る。

投稿者: Anonymous http://ja.aliexpress.com/wholesale?catId=0&initiative_id=AS_20151205231131&SearchText=bag+mens を起点に、商品ページのURLリストを取得し、その数を出力します。 たまに、期待した出力である6が出力されるのですが、 下記のようなエラーが出てしまう時があります。エラー8割、正常2割くらいの割合です。 何が原因かがわからず、途方に暮れています。 何かヒントをいただけませんか? require ‘open-uri’ require ‘nokogiri’ require ‘pstore’ require ‘anemone’ require ‘open_uri_redirections’ require ‘openssl’ require ‘selenium-webdriver’ require ‘capybara’ require ‘capybara/poltergeist’ #require ‘phantomjs’ class Crawl def get_html_obj(url) Capybara.run_server = false Capybara.register_driver :poltergeist do |app| Capybara::Poltergeist::Driver.new(app, {js_errors: false}) end session = Capybara::Session.new(:poltergeist) session.visit(url) return Nokogiri::HTML.parse(session.html) end def get_page_list(url) url_list = Array.new…(Continue Reading)

動的にDOMが生成されるサイトのスクレイピングについて

投稿者: Anonymous ウェブスクレイピングをしてツイッターのアカウントを収集しているのですが、 あるウェブサイトがどうしてもスクレイピングできなくて、困っています。 以前、ツイフィール(※1)というサイトをウェブスクレイピングしたことがありました。 このウェブサイトをスクレイピングする際は、 http://twpf.jp/search/profile?page=2 のpage=2の部分を3、4、5・・・とforループを回して変更していき、 情報を収集することができていました。 今回はツイフィールではなくて、ツイプロ(※2)というウェブサイトをスクレイピングしたいと考えています。 しかし、ウェブスクレイピングできない部分があって困っております。 例えば、ツイプロでデザイナのカテゴリに登録されているアカウントを収集したいとき(※3)、 最初は1ページに20件しか表示されていなく、「もっと見る」ボタンを押すことで更に20件読み込むことができます。 しかし、「もっと見る」ボタンを押す前と、押した後で、ウェブのURLは変わっていません。 ですので、ツイフィールのときに利用したような手法は使えないと考えています。 このように、ページングした時にウェブのURLが変わらないタイプのサイトは、 どのような手法でウェブスクレイピングすればいいのでしょうか? 言語はpythonで、スクレピングのライブラリはbeautifulsoupを使っています。 ※1 http://twpf.jp/ ※2 https://twpro.jp/ ※3 https://twpro.jp/j/0104 解決 BeautifulSoup: 1つのURLで「承認」ボタンを押した後のみ表示されるHTMLをスクレイピングしたい(意訳) のように、本家SOに類似の質問が見つかります。 その回答によると、seleniumなどを併用しないとイベントの発火はできないようです。 このようなサイトをスクレイピングする場合は、BeautifulSoupだけでは限界があると認識しています。 ただし※3のサイトのソースを確認したところ、URLの末尾に/{数値}を追加すれば目的の情報は得られそうですが…。 回答者: Anonymous

はてなでブックマークした記事のURLとタイトルを全部pythonでスクレイピングしたい。

投稿者: Anonymous はてなブックマークで自分でブックマークした記事をpythonでスクレイピングしたいのですが、どのようにアプローチしてrequestとbeatifulsoupを使って行ったら良いのかわかりません。353件全て取得したいです。 出来るだけseleniumは使用したくありません。 もしくはAPIが提供されているみたいなのですが、自分のブックマークを取得するものが見当たりません。 問題 まず課題として2つあります。 ログイン 最初のidとパスワード javascriptによる無限ロードページですが、ページ数が書いてあるボタンが下部にあったのでそれが使えるかもしれません。 どなたか詳しいエンジニアの方お力をお貸し頂けると幸いです。 よろしくお願いします。 解決 はてなブックマークの場合は、requestsとbeatifulsoupを使ってスクレピングが可能です。課題については、次のようにして対応できると思います 課題1 ログイン 最初のidとパスワード はてなブックマークのログインページに行き、ログインフォームのパラメータを調べる。しかし、ガードが掛かっているので、requestsではログインできませんでした。 課題2 javascriptによる無限ロードページですが、ページ数が書いてあるボタンが下部にあったのでそれが使えるかもしれません。 はてなブックマークのページは、基本はGETで取得できるので、それを使います。また、下部のページ数が書いてある場所を利用してページの情報を取得します。はてなブックマークのページは、公開されているブックマークは誰でも取得できるのでログインは必要ありません。 以下にコードのサンプルを書いておきます。 from bs4 import BeautifulSoup import requests from time import sleep user = ‘user’ url = ‘http://b.hatena.ne.jp/’ + user + ‘/bookmark’ r = requests.get(url) page = 1 while True: soup = BeautifulSoup(r.text, ‘html.parser’) # ブックマークを取得するコードを書く…(Continue Reading)

Pythonのbs4とrequestsを用いたスクレイピングでsrcsetに対応したい

投稿者: Anonymous BeautifulSoup4とRequestsでスクレイピングを行いたいのですが、 srcで検索をしてURLを取得してしまうと、想定よりも小さいサイズの画像ファイルがダウンロードされます。 これはHTMLのimgタグにあるsrcsetの影響です。 おそらく、自身がウィンドウサイズを指定できていないのが原因と考えています。 以上の点を踏まえて、ヘッダーにウィンドウサイズの情報を追記する必要があると考えたのですが、その方法があればご教授ください。 説明が乏しく例示した方がわかりやすいと感じたら、コメントをいただければ追記いたします。 解決 srcsetを検索する手法を試しました。 foo = soup.findAll(‘img’, attrs = {‘srcset’ : True}) 以上で、fooにはそれらのリストが格納されます。 ※soupはBeautifulSoupを用いてlxml形式へと変換させてものです。 ここからウェブサイトの記述規則などを判断し、splitを用いて画像のURLを特定することができます。 この際、先頭にある空白などに留意することでコードチェックをスムーズにできます。 URLさえ割り出せれば問題なくスクレイピングが可能でした。 なお、画像のサイズの順序はウェブサイト側に合わせるしかなく、柔軟に対応するためには、wxの値を評価することで最も大きいものを選ぶよう実装しました。 回答者: Anonymous

PythonのSeleniumで表示されているのにnot visibleな要素がクリックできない

投稿者: Anonymous このページの勤務地ボタンを押すとモーダルが表示されます。 モーダルの左メニューの地方をクリックするところまでは行けるのですが、例えば関西をクリック→大阪をクリックとしたい場合、大阪のチェックボックス(input要素)がnot visibleのためクリックできません。 当初はXpathでinput要素を取得していましたが、コードの方針を少し変えて、すべてのインプット要素をまず取得し、カスタム属性の値で特定のチェックボックスを見つけるようにしました。 チェックボックスは都道府県ごとにカスタム属性valueの値がことなるのでそのようにしました。 例:  北海道地方を選択している状態では、北海道のチェックボックスのvalue属性の値はP01になっています。大阪府はP27です。 ですが、関西ボタンをクリックしたあとでも、value属性の値がP27になっている要素は見つからず、P01、つまり関西ボタンをクリックする前の北海道の状態のまま変わっていないということになります。 しかし、自動操作中のブラウザ画面ではちゃんと関西の画面に遷移しています。 def condition_specification(self, start_url): “”” 条件を指定したページを表示させる “”” self.browser.get(start_url) self.browser.find_element_by_xpath(“/html/body/div[1]/div[3]/div/form/div/section[1]/div/table/tbody/tr[2]/td/div[2]/div[1]/a”).click() # 地方ボタンをクリック (self.areaは地方ボタンの属性のバリューが入っている) area_buttons = self.browser.find_elements_by_class_name(“modalChoice__item”) for area_button in area_buttons: attr = area_button.get_attribute(“data-large-cd”) if attr == self.area: area_button.click() # 大阪府のチェックボックスをクリックする処理 checkboxes = self.browser.find_elements_by_name(“srPrefectureCdList”) for checkbox in checkboxes: attr = checkbox.get_attribute(“value”) if attr == “P27”: # P27は大阪府のチェックボックス要素…(Continue Reading)

Python スクレイピング 同じ項目は同じ列に記載、異なる項目は新しく列を追加して記載する方法

投稿者: Anonymous 当方初心者であり、申し訳ないのですが皆様のお知恵を拝借したいです。 いろいろ検索したのですが、良い方法(どこから手をつけるべきか)がわからず、 困っております。アドバイスいただけますと幸いです。 ページをスクレイピングして、CSVに下記のようなデータを書き出すプログラムを作りました。 a,b,d,x,テスト 3354,test,あいうえ,いろはに,12345 この時、複数のページをスクレイピングして同様の情報を取得するプログラムを実行し、 行を追加して値を記載していくプログラムを作りたいと考えています。 ただ、ページ毎にカラム名が同じ場合もあれば、異なる場合もあります。 もし、スクレイピングした2ページ目がこのような値の場合は、 a,b,d,y,テスト 3399,TEST,あいうえ,ほへと,12345 CSVに書き出す場合は下記のように記載したいと考えています。 a,b,d,x,テスト,y 3354,test,あいうえ,いろはに,12345 3399,TEST,あいうえ,,12345,ほへと ※基本的には順に行追加で値が記載されていき、  新しい項目の場合は一番右側に列が追加されそこに記載されていく、、という流れです。 複数ページに順にアクセスして、それぞれのページの情報を取得するコードはできたのですが、各項目に希望通りにCSVに書き出す部分が不明です。 この場合、どのようなプログラムが適切でしょうか? 何か参考になる具体的なコード、サイトなどありましたら、 教えて頂けませんでしょうか。。。。。 【追記】 質問を頂きありがとうございます。 カラムにある記載を事前に予想できないことがネックとなります。 取得する情報は1ページ毎に商品のスペック情報のようなものです。 Aという商品にはa,b,c,dというスペックの項目があり(上記で言うカラムにある記載)、 それぞれに対して、あ,い,う,えという値が取得できます。 Bという商品を取得すると、Aという商品と同じスペック項目はあるケースもありますが(ただし値は異なる)、Bにしかないスペック項目もあります。 毎度取得する情報はスペック項目と値のセットとなりますので、 a,b,d,x,テスト,y 3354,test,あいうえ,いろはに,12345 3399,TEST,あいうえ,,12345,ほへと 取得する毎に上記のように行が追加され、且つ以前取得したスペック項目が無い場合は、 新しく追加されていくことが理想です。 【追記2】 現在のコードは下記のようにしておりまして、 ページを読み込む→データを取得→CSVに書き込むというのをfor文で作成しています。 for num in range(1,xxx): urlclick = driver.find_element_by_xpath(‘xxxxxxxxxxx’.format(num)) urlclick.click() driver.window_handles driver.switch_to.window(driver.window_handles[1]) currentURL = driver.current_url html =…(Continue Reading)

Python 平日土日を分けてcsvに出力したい

投稿者: Anonymous 「食べログ」から営業時間を取得し、それを平日と土日に分けて 平日開始時刻, 平日終了時刻, 土日祝開始時刻, 土日祝日終了時刻, 定休日 というようにcsvに出力したいです。 今のところpandasを使ってcsvに出力をしようと考えています。 どうやれば上手く平日土日を判別して、またそれを区切って出力できるかがわかりません。 宜しくお願いします。 <kunifさんより> # -*- coding: utf-8 -*- import requests from bs4 import BeautifulSoup import re newlines = re.compile(r’n{2,}’) def scrape_info(soup_table): “”” 基本情報の抽出 “”” global newlines soup_telnum = soup_table.find(“strong”, class_=”rstinfo-table__tel-num”) soup_address = soup_table.find(“p”, class_=”rstinfo-table__address”) soup_tr_list = soup_table.find_all(“tr”) for soup_tr in soup_tr_list: if soup_tr.th.string in {“店名”,…(Continue Reading)

rvestを用いたスクレイピング

投稿者: Anonymous R言語のrvestパッケージを利用して気象庁のページhttp://www.data.jma.go.jp/obd/stats/etrn/view/daily_s1.php?prec_no=44&block_no=47662&year=2016&month=7&day=&view= からデータをデータフレームに収納したいと考えております。 ですが、カラムの構造が複雑になっているからかうまく行きません。 自分のソースコードは以下のとおりです。 詳しい方教えて下さい。もし全部のデータを取るのが難しければ平均気温だけで構いません。よろしくお願い致します。 library(rvest) html <- read_html(“http://www.data.jma.go.jp/obd/stats/etrn/view/daily_s1.php?prec_no=44&block_no=47662&year=2016&month=7&day=&view=”) table <- html_table(html) このコードを実行すると最後の行に以下のエラーが出ます。 table <- html_table(html) Error: Table has inconsistent number of columns. Do you want fill = TRUE? 解決 おそらくそのページにある最大なテーブルがほしいです。 問題は、そのテーブルのヘッダーがややこしいです。例えば、3行にある最大が二つのカラムを挟んでいます。 でもそれに当たる下のHTMLにただ一つのセルがコードしてあります。 したがってhtml_tableにfill = TRUEを与えなければなりません。すると、でてくるdata.frameに、満々じゃない行に適当にNAをいれてあげます。 URL <- paste0(“http://www.data.jma.go.jp/obd/stats/etrn/view/”, “daily_s1.php?prec_no=44&block_no=47662&year=2016”, “&month=7&day=&view=”) DF <- read_html(URL) %>% html_node(xpath=’//*[@id=”tablefix1″]’) %>% html_table(fill = TRUE) head(DF) # 日…(Continue Reading)

取得した文字列の操作及び出力python

投稿者: Anonymous 食べログのサイトから営業時間を取得し、平日/土日祝をそれぞれ開始日時と終了日時に分けてcsvに出力できればと考えています。 今の問題は 取得済みの平日/土日祝で別々のリストに入った文字列からxx:xxという時刻の文字列を取り出し出力すること。今のままだと1800みたくなってしまいます。findallで取得したものの中に”:”や”~”という文字は除外されてしまうみたいです。 ”~”の文字列に反応して開始時刻と終了時刻を別々に区切って出力すること。 18:00~23:00 なら 18:00と23:00を別々のセルに 全角の文字列にも対処できるようにしたい 以上です宜しくお願いします。 import csv import re import requests from bs4 import BeautifulSoup def get_dotwlefts(tablink): response = requests.get(tablink) html = response.content soup = BeautifulSoup(html, “html.parser”) dotwfound = soup.select_one( “#contents-rstdata > div.rstinfo-table > table:nth-child(2) > tbody > tr:nth-child(7) > td > p” ) if dotwfound is not None: dotw…(Continue Reading)

Web上のプレインテキストを大量にスクレイピングするときに形式が異なる文書をどのように処理するべきか

投稿者: Anonymous 実現したいこと 「プロジェクト・グーテンベルク」という著作権の切れた小説が公開されているサイトのテキストを自然言語処理のために、スクレイピングしようとしています。 公開されている形式は、Plain Text UTF-8とhtmlがありますが、プレインテキストでの収集を考えています。 テキストファイルとして出力するのではなく、json形式で情景描写と台詞を分けて取得したいです。 台詞に関しては、話者名が台詞前に書かれている場合は話者別に取得し、以下のようなイメージです。 { “QUEEN”:”Good Hamlet, cast thy nighted colour off, And let thine eye look like a friend on Denmark. Do not for ever with thy vailed lids Seek for thy noble father in the dust. Thou know’st ’tis common, all that lives must die, Passing through nature…(Continue Reading)

BeautifulSoup4をインストールしているのですが、NameErrorが出て利用できません。

投稿者: Anonymous PythonでWebスクレイピングを試みていますが、NameErrorが出ます。 BeautifulSoupはインストールされていると思うのですが、記述方法に問題があるのでしょうか。 【環境】 OS:Win7 32bit Python:3.6.4 IDE:ATOM 環境変数(Pathに追加済み):C:UsersusernameAppDataLocalProgramsPythonPython36-32;C:UsersusernameAppDataLocalProgramsPythonPython36-32Scripts 【パッケージのインストール確認】 C:UsersusernameAppDataLocalProgramsPythonPython36-32Scripts>pip freeze beautifulsoup4==4.6.0 certifi==2017.11.5 chardet==3.0.4 idna==2.6 requests==2.18.4 urllib3==1.22 【コード】 import requests from bs4 import BeautifulSoup url = “http://www.kyodonews.jp/” r = requests.get(url) print(soup.find(“h1”)) 【エラー】 Traceback (most recent call last): File “C:UsersusernameAppDataLocalProgramsPythonPython36-32Scriptscodescraping1.py”, line 7, in <module> print(soup.find(“h1”)) NameError: name ‘soup’ is not defined 解決 エラーメッセージを読むと、soupが定義されていないと書いてありますので、soupを定義する必要があります。 find(“h1”)を使おうとしていることから想像すると、soupはBeautifulSoupのオブジェクトであるべきです。…(Continue Reading)

JSONデータから指定した値を取得するときのエラー

投稿者: Anonymous 問題 言語処理100本ノックの「3章正規表現 29. 国旗画像のURLを取得する」の問題について、回答でどの部分を修正したらいいかわからないです。 Qiita記事「言語処理100本ノックに挑戦 / 第3章: 正規表現」に掲載されていた回答では、「国章のURL」を取得するプログラムになっていたので、国旗のURLに変更しようとしています。 エラー 回答コードの以下の箇所を変更して、プログラムを実行しましたが、 image_name = re.sub(‘[[ファイル:(.*?)|.*]]’,’\1′,match_dct[‘国章画像’]) # ファイル名を抽出 ‘titles’: ‘File:Royal%20Coat%20of%20Arms%20of%20the%20United%20Kingdom.svg’, エラーが出てしまい、他にどこを修正する必要があるのか分かりません。 $ python 29.py Traceback (most recent call last): File “29.py”, line 36, in <module> print(data.get(‘query’).get(‘pages’).get(‘-1’).get(‘imageinfo’)[0].get(‘url’)) AttributeError: ‘NoneType’ object has no attribute ‘get’ 実行プログラム 国旗画像のURLは「https://ja.wikipedia.org/wiki/%E3%82%A4%E3%82%AE%E3%83%AA%E3%82%B9%E3%81%AE%E5%9B%BD%E6%97%97#/media/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB:Flag_of_the_United_Kingdom.svg」だったので、以下のように修正しました。 import gzip, json, re import urllib.request file = ‘jawiki-country.json.gz’ def extract_info(): with…(Continue Reading)

webの要素をスクレイプする際のfindallの使い方

投稿者: Anonymous 下記のHTML構造を持つURLから、td要素のa,b,cを取得して1行に並ぶように以下scriptを作成したのですが、どうしてもdまで取得してしまい、且つ出力されるものが乱れてしまいます。 div要素を限定するのかもしれませんが、理想とする出力を得る方法をご教示いただけないでしょうか。 ■理想とする出力 URLのタイトル(1)、a,b,c,a’,b’,c’,a”,b”,c”,a”’,b”’,c”’,a””,b””,c””,a””’,b””’,c””’ URLのタイトル(2)、a,b,c,a’,b’,c’,a”,b”,c”,a”’,b”’,c”’,a””,b””,c””,a””’,b””’,c””’ 対象のHTML(例) <div> <table width=”100%” cellpadding=”0″ cellspacing=”0″> <tr> <th> <div>A</div><div>B</div> </th> <th> <div>C</div><div>D</div> </th> <th> E </th> </tr> <tr> <td> <div>a</div><div>b</div> </td> <td> <div><span><a id=”123″ href=”xxx.html” class=”yyy”>c</a></span></div> <div>d</div> </td> <td> e </td> </tr> <tr> <td> <div>a'</div><div>b'</div> </td> <td> <div><span><a id=”456″ href=”xxx.html” class=”yyy”>c'</a></span></div> <div>d'</div> </td> <td> e’ </td> </tr> </table>…(Continue Reading)

不特定多数のWebサイトへ対するクローラー頻度について

投稿者: Anonymous 不特定多数のWebサイトへ対してクローラーを実行したいと考えています ・どれぐらいの頻度までなら許容されるでしょうか? ・「業界団体が作成した指針」や「目安となる数値」などはあるでしょうか? ・例えば、検索エンジンはこの件について、何らかの資料を公開していたりするでしょうか? 注意した方が良いこと(あるいは、お作法的なこと)について ・クローラーを実行するに辺り、マナー(あるいは、暗黙の了解)はあるでしょうか? ・サイト管理者が拒否したら、次からはアクセスしない? みたいな (そもそもどうやってクローラー拒否するのかよく分かっていないのですが…) 解決 ウェブ健康診断仕様 http://www.ipa.go.jp/files/000017319.pdf 上記IPAが出してる資料は、サイトを作る側のチェックリストですが、「クローラーへの耐性」というチェック項目があります。この資料に書いてある以上の過剰なアクセスは避けた方が良いでしょう。 そのほかマナー的な点についても記載します。 同一ホストへのアクセスは、最低1秒間くらい間隔をあけてアクセスする 同一ホストへのアクセスは、複数同時アクセスを行ってはいけない robots.txtの内容に従う UserAgent情報を適切に設定する。(サイト管理者があなたへコンタクトできるように) 他参考資料 https://speakerdeck.com/amacbee/pythondezuo-ruwebkuroraru-men 回答者: Anonymous

このfはどういう働きをしてるのでしょうか? → session.get(f’{base_url}?{qs}{page_num}’)

投稿者: Anonymous スクレイピングの勉強で以下のようなコードを書きました。 from requests_html import HTMLSession base_url = ‘https://www.example.com/xxx/yyy’ qs = ‘sort=desc&page=’ for page_num in range(5): session = HTMLSession() resp = session.get(f'{base_url}?{qs}{page_num}’) elems = resp.html.find(‘.product_title’) print([i.text for i in elems]) こちらの8行目で書かれている session.get(f’{base_url}?{qs}{page_num}’) の’f’がどのような働きをしているものなのか、また何と呼ばれているものなのでしょうか…? 大変初歩的な質問で恥ずかしい限りなのですが、ご教授いただきましたら幸いです。 どうぞよろしくお願い申し上げます! 解決 文字列中に変数や式を埋め込むためのもので、「フォーマット済み文字列リテラル(f-strings)」と呼ばれるものです。 Python 3.6 から導入された機能で、str.format() を使うよりも短く記述することがきます。 # 以下は同じ出力が得られます。 # str.format() を使った場合 print(‘{}?{}{}’.format(base_url, qs, page_num)) # f-string を使った場合 print(f'{base_url}?{qs}{page_num}’) 詳しくはリファレンスをご確認ください。…(Continue Reading)

railsのMechanizeでのスクレイピングについて

投稿者: Anonymous <table class =”profile”> <tr> <td class=”title”>ほげ1</td> <td class=”content”ほげ</td> </tr> <tr> <td class=”title”>ほげ2</td> <td class=”content”>ほげ</td> </tr> <tr> <td class=”title”>ほげ3</td> <td class=”content”>ほげ</td> </tr> </table> 上記のようなtext情報をcontentごとのtext情報を一つずつスクレイピングしたいのですが、class名が統一されているためまとまったtext情報が取得されてしまいます。contentごとにDBに保存させたいのですがなにかいい方法はありますでしょうか。 よろしくお願いします。 解決 #!/usr/bin/env ruby require ‘mechanize’ agent = Mechanize.new page = agent.get( ‘http://localhost:8000/test.html’ ) page.search( ‘table.profile tr’ ).each do |tr| p tr.at( ‘td.title’ ).inner_html p tr.at( ‘td.content’ ).inner_html end  こんな感じで個々を取得できると思いますが、どうでしょう?…(Continue Reading)

Google ColabにおけるPhantomJSの使い方

投稿者: Anonymous Google Colabでスクレイピングの練習をしているのですが、以下のコードを動かしても以下のようなエラーが出てしまいます。どのようにPATHを指定すればこの問題は解決するのでしょうか? コードは https://review-of-my-life.blogspot.com/2017/10/python-web-scraping-data-collection-analysis.html にあったものを参照しています。 !pip install selenium     #trendAnalytics.py from selenium import webdriver from pandas import * import time #Access to page browser = webdriver.PhantomJS() エラー usr/local/lib/python3.6/dist-packages/selenium/webdriver/phantomjs/webdriver.py:49: UserWarning: Selenium support for PhantomJS has been deprecated, please use headless versions of Chrome or Firefox instead warnings.warn(‘Selenium support for PhantomJS has been deprecated, please…(Continue Reading)

スクレイピングしたものをcsvに書き出すと余計な ” が属性につく。

投稿者: Anonymous やりたいこと。 csvファイルをつくる コンテンツは、htmlタグ付きのままスクレイピングしたもの。 しかし、余計なクォーテーションがついてしまう。 原因はstr()をつかったことだとおもいます。なぜなら、prettify()ではこのようなことがおこらなかったからです。 csvに書き出すためにどのような型に変換すればいいのでしょうか? for def_el in definition_list: def_list.append(str(def_el)) sections_string = ‘<hr>’.join(def_list) return sections_string このCSVファイルは、あとでHTML形式で表示する単語帳練習アプリにインポートする予定なので、htmlタグが必要です。 これがソースコードです。 read_input = input(‘Read Mode Enter file name e.g.) vocab.csv:’) write_input = input(‘Write Mode Enter name e.g.) appended_vocab.csv:’) with open(read_input, ‘r’, encoding=’utf-8-sig’) as csv_file, open(write_input, ‘w’, encoding=’utf-8′, newline=”) as new_file: csv_reader = csv.reader(csv_file) csv_writer = csv.writer(new_file)…(Continue Reading)

Python3でwebスクレイピングしたいのですが存在するURLが開けません。

投稿者: Anonymous python3でBeautifulSoupを使い、webスクレイピングしたいのですが、 urllib.error.HTTPError: HTTP Error 403: Forbidden と言うエラーが出てしまいます。 これはスクレイパーによるアクセスがサイト側に拒否されているということでしょうか? このエラーが出るということはこのサイトではスクレイピングできないということでしょうか?回避する方法はありますか? 以下がコードです。 def RichestSchool(): “””get 100 richest school names “”” html = urlopen(“http://www.thebestschools.org/features/richest-universities-endowments-generosity-research/”) bsObj = BeautifulSoup(html, “lxml”) for rich in bsObj.findAll(“a”, {“target”:”_blank”}): riches = rich.get_text() print(riches) 解決 metropolisさんのコメント通りユーザエージェントの問題ですね。 下記のようにFirefoxに偽装するとアクセス出来ます。 #!/usr/bin/python3 import urllib.request url = “http://www.thebestschools.org/features/richest-universities-endowments-generosity-research/” headers = { “User-Agent”: “Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:47.0)…(Continue Reading)

Python, Pandasを用いたスクレイピングでno tables foundのエラーが出てしまう。

投稿者: Anonymous 下記のサイトからテーブルデータをPandasでスクレイピングしようとしています。 No tables foundのエラーが出てしまいます。 Google Chromeでの要素の検証ではちゃんとテーブルの要素が表示されているのですが、ページのソースを表示するとテーブルらしいソースが見当たりません。 このテーブルのソースが別のところにあるとは思うのですが、ソースのリンクからはたどり着けませんでした。 ご教授お願いいたします。 http://www.fehd.gov.hk/english/licensing/ecsvread_online_permit.html?page=1&subType=undefined&licenseType=Prepackaged%20Sushi%20and%2For%20Sashimi%20Permit&lang=en-us # coding: UTF-8 import sys sys.path.append(“/home/users////////”) import pandas as pd import List2016 as R l_page = R.List df = pd.DataFrame([]) base_url = ‘http://www.fehd.gov.hk/english/licensing/ecsvread_food.html?page=’ suffix_url = ‘&subType=Approved%20to%20Sell%20Oyster%20to%20be%20Eaten%20in%20Raw%20State&licenseType=List%20of%20Licensed%20General%20Restaurants%20Approved%20to%20Sell%20Oyster%20to%20Be%20Eaten%20in%20Raw%20State%20for%20Consumption%20on%20the%20Premises&lang=en-us’ for i in range(len(l_page)): url = base_url + str([i]) + suffix_url print(url) #try: fetched_dataframes = pd.read_html(url) print(fetched_dataframes) date…(Continue Reading)

python スクレイピング 営業時間の取得

投稿者: Anonymous 某有名グルメサイトのスクレイピングをpythonで試みていますが上手くいきません。 TAB LOG URL毎に ・店名 ・電話番号 ・住所 ・営業時間 を取得する予定です。 当初場所をCSSセレクターで指定していたものの、ページによって位置が若干変わってしまうようです。 おそらく文字列(”営業時間”)を含むタグを探して、その中身を出力?のようなことでできる気がするのですが、いくら調べてもやり方がわかりません。 以下は参考までに、現時点での営業時間を取得する部分のコードですが、気にしないで貰ってかまわないです。 平日と休日を分けて出力するのを意図しています。 tablinkにURLを入れます ご教授宜しくお願いします import csv import re import requests import pandas as pd from bs4 import BeautifulSoup def left(text, n): return text[:n] def right(text, n): return text[n:] def get_dotwlefts(tablink): response = requests.get(tablink) html = response.content soup = BeautifulSoup(html,”html.parser”) dotwfound = soup.select_one(“#contents-rstdata…(Continue Reading)

画像をスクレイピングしてまとめて表示させたい

投稿者: Anonymous Pythonを使ってとあるサイトの情報をスクレイピングしようと考えています。 取得したいデータとして、aタグのリンク、img要素の画像と一部テキストです。 (リンク、画像、テキストで1セットで、それを複数回スクレイピングします。) また、取得したリンク、画像、テキストを全て一覧化して一つの場所表示したいです。 (コンソールに画像も表示できれば一番いいですが、そういう方法があるのか分からないため、コンソールじゃない場所でもOKです。) 質問としまして、 ・上記(特に複数画像のまとめて表示)は実現可能でしょうか。 ・どのライブラリを使うのが良さそうでしょうか。 どういうライブラリで、どうこうしたらいいんじゃないかな〜 的なことをザックリ聞きたかったので質問させていただきました。 ご回答のほど、よろしくおねがいいたします。 解決 Pythonでやる方法 取得 標準のurllibでも可能ですが、Requestsというライブラリが非常に使いやすいです。 Requests: HTTP for Humans™ — Requests 2.21.0 documentation スクレイピング BeautifulSoup4というライブラリが一般に使われています。 Beautiful Soup Documentation — Beautiful Soup 4.4.0 documentation 画像の表示 取得したリンク、画像、テキストを全て一覧化して一つの場所表示したい というのはちょっとよくわからないのですが、それぞれファイルとして保存して一つのディレクトリにまとめておけばよいのではないでしょうか。 ちなみに、コンソールへの画像の表示はPython製ではありませんがcatimgやtimgというツールが有名です。 posva/catimg: Insanely fast image printing in your terminal hzeller/timg: A terminal image viewer Pythonを使わない方法 質問内容を読むに、必要なのはPythonでスクレイピングするよりもWebサイトをダウンロードすることのように見受けられます。その場合、新しくツールを作成するよりも既存のツールを利用するほうが近道になります。 もしその場合、以下のようなツールが有用です。…(Continue Reading)