2017-01-03 2 views
3

PythonでWebからデータを抽出するのが初めてです。他の投稿とこのwebpageのおかげで、私はmechanizeというモジュールを使ってフォームにデータを送信する方法を考え出しました。Python:機械化されたフォームにデータを送信した後の.csv結果の抽出

今、私は結果を抽出する方法を見つけることに立ち往生しています。フォームを送信するときにはさまざまな結果がありますが、完全であると思われるCSVファイルにアクセスできるかどうかはわかります。私はあなたがモジュールreを使用しなければならないと仮定しますが、Python経由でどのように結果をダウンロードしますか?

ジョブを実行した後、csvファイルはここにあります:要約=>結果=>重連鎖テーブルをダウンロードします(「ロードサンプル」をクリックすると、Webページの仕組みを見ることができます)。

import re 
import mechanize 

br = mechanize.Browser() 
br.set_handle_robots(False) # ignore robots 
br.set_handle_refresh(False) # can sometimes hang without this 

url = 'http://circe.med.uniroma1.it/proABC/index.php' 
response = br.open(url) 

br.form = list(br.forms())[1] 

# Controls can be found by name 
control1 = br.form.find_control("light") 

# Text controls can be set as a string 
br["light"] = "DIQMTQSPASLSASVGETVTITCRASGNIHNYLAWYQQKQGKSPQLLVYYTTTLADGVPSRFSGSGSGTQYSLKINSLQPEDFGSYYCQHFWSTPRTFGGGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC" 
br["heavy"] = "QVQLKESGPGLVAPSQSLSITCTVSGFSLTGYGVNWVRQPPGKGLEWLGMIWGDGNTDYNSALKSRLSISKDNSKSQVFLKMNSLHTDDTARYYCARERDYRLDYWGQGTTLTVSSASTTPPSVFPLAPGSAAQTNSMVTLGCLVKGYFPEPVTVTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVPSSPRPSETVTCNVAHPASSTKVDKKIVPRDC" 

# To submit form 
response = br.submit() 
content = response.read() 
# print content 

result = re.findall(r"Prob_Heavy.csv", content) 
print result 

contentを印刷するとき、私のような興味ルックスだライン:

<h2>Results</h2><br> 
Predictions for Heavy Chain: 
<a href='u17003I9f1/Prob_Heavy.csv'>Download Heavy Chain Table</a><br> 
Predictions for Light Chain: 
<a href='u17003I9f1/Prob_Light.csv'>Download Light Chain Table</a><br> 

は、そこで質問です:どのように私はhref='u17003I9f1/Prob_Heavy.csv'へのアクセスを取得/ダウンロードするのですか?どちらかそれが最高/ファッショナブルなソリューションですが、その後、私はwgetを使用したい場合

result=re.findall("<a href='([^']*)'>",contents) 

わからない:フォーマットは仕事ができるよう、常に同じであれば、それは、正規表現でHTMLを解析するハックだ場合でも

答えて

1

BeautifulSouprequestsを使用すると、正規表現を使用してHTMLを解析するのを避けることができます。 pipがあり、まだBeautifulSoupがインストールされていない場合はsudo pip install bs4です。 REPLでスクリプト実行

import re 
import mechanize 
from bs4 import BeautifulSoup as bs 
import requests 
import time 


br = mechanize.Browser() 
br.set_handle_robots(False) # ignore robots 
br.set_handle_refresh(False) # can sometimes hang without this 

url_base = "http://circe.med.uniroma1.it/proABC/" 
url_index = url_base + "index.php" 

response = br.open(url_index) 

br.form = list(br.forms())[1] 

# Controls can be found by name 
control1 = br.form.find_control("light") 

# Text controls can be set as a string 
br["light"] = "DIQMTQSPASLSASVGETVTITCRASGNIHNYLAWYQQKQGKSPQLLVYYTTTLADGVPSRFSGSGSGTQYSLKINSLQPEDFGSYYCQHFWSTPRTFGGGTKLEIKRADAAPTVSIFPPSSEQLTSGGASVVCFLNNFYPKDINVKWKIDGSERQNGVLNSWTDQDSKDSTYSMSSTLTLTKDEYERHNSYTCEATHKTSTSPIVKSFNRNEC" 
br["heavy"] = "QVQLKESGPGLVAPSQSLSITCTVSGFSLTGYGVNWVRQPPGKGLEWLGMIWGDGNTDYNSALKSRLSISKDNSKSQVFLKMNSLHTDDTARYYCARERDYRLDYWGQGTTLTVSSASTTPPSVFPLAPGSAAQTNSMVTLGCLVKGYFPEPVTVTWNSGSLSSGVHTFPAVLQSDLYTLSSSVTVPSSPRPSETVTCNVAHPASSTKVDKKIVPRDC" 

# To submit form 
response = br.submit() 
content = response.read() 
# print content 

soup = bs(content) 
urls_csv = [x.get("href") for x in soup.findAll("a") if ".csv" in x.get("href")] 
for file_path in urls_csv: 
    status_code = 404 
    retries = 0 
    url_csv = url_base + file_path 
    file_name = url_csv.split("/")[-1] 
    while status_code == 404 and retries < 10: 
     print "{} not ready yet".format(file_name) 
     req = requests.get(url_csv) 
     status_code = req.status_code 
     time.sleep(5) 
    print "{} ready. Saving.".format(file_name) 
    with open(file_name, "wb") as f: 
     f.write(req.content) 

Prob_Heavy.csv not ready yet 
Prob_Heavy.csv not ready yet 
Prob_Heavy.csv not ready yet 
Prob_Heavy.csv ready. Saving. 
Prob_Light.csv not ready yet 
Prob_Light.csv ready. Saving. 
>>> 
>>> 
1

あなたが使用しているように見えるファイル

Python2では
import wget 
for r in result: 
    # compute full url 
    csv_file = url.rpartition("/")[0]+"/"+r 
    print("downloading {}".format(csv_file)) 
    # downloads and saves the .csv file in the current directory 
    # "flattening" the path replacing slashes by underscores 
    wget.download(csv_file,out=r.replace("/","_")) 
+0

おかげで多くのことを、これは、これまでの回答からではないように見えますが、問題は、取得したファイルが空です。どうすればこの問題を解決できますか?結果はウェブに保存されていないようです。 – Natha

+0

これは残念です。ファイルが見つからなければwgetがクラッシュすることは確かです。だから多分空であるかもしれないし、多分私の答えをChristopherの答え(Python 3の 'urllib 'を使って)と組み合わせて、それが違いを生むかどうかを調べることもできます。 –

+0

それはまさに私がやろうとしていることです。あなたの2つの答えを混ぜると、良い選択肢のように思えます。 – Natha

1

を、ダウンロードするには、urllib2を使用しています。

>>> import urllib2 
>>> URL = "http://circe.med.uniroma1.it/proABC/u17003I9f1/Prob_Heavy.csv" 
>>> urllib2.urlopen(URL).read() 

それとも、動的にhrefに基づいて、それにしようとしている場合は、あなたが行うことができます:

>>> import urllib2 
>>> href='u17003I9f1/Prob_Heavy.csv' 
>>> URL = 'http://circe.med.uniroma1.it/proABC/' + href 
>>> urllib2.urlopen(URL).read() 
0

先例の回答の両方が正常に動作... Webページが存在するかどうか。ただし、ジョブが実行されているときは、プログラムはその時間がかかります(約30秒)。だから私はtimeモジュールで一時停止にプログラムを置くことによって答えが見つかりました:

from urllib2 import urlopen 
import time 

print "Job running..." 
time.sleep(60) 

csv_files = [] 

for href in result: 
    URL = "http://circe.med.uniroma1.it/proABC/" + href + ".csv"  
    csv_files.append(urlopen(URL).read()) 
    print("downloading {}".format(URL)) 

print "Job finished" 
print csv_files 

私は、これは、よりエレガントな解決策であるか分からないが、私はこのケースで作業を行います。

関連する問題