2017-07-13 4 views
1

私はウェブサイトからテーブルを引き出し、Excelスプレッドシートに貼り付けるウェブスクレーパーを作ろうとしています。私はPython初心者です(そして一般的にはコーディング) - 文字通り数日前に学習を始めました。Python Web Scraper/Crawler - HTMLテーブルからExcelスプレッドシートへ

このWebスクレーパー/クローラーを作成するにはどうすればよいですか?私が持っているコードは次のとおりです。

import csv 
import requests 
from BeautifulSoup import BeautifulSoup 

url = 'https://www.techpowerup.com/gpudb/?mobile=0&released%5B%5D=y14_c&released%5B%5D=y11_14&generation=&chipname=&interface=&ushaders=&tmus=&rops=&memsize=&memtype=&buswidth=&slots=&powerplugs=&sort=released&q=' 
response = requests.get(url) 
html = response.content 

soup = BeautifulSoup(html) 
table = soup.find('table', attrs={'class': 'processors'}) 

list_of_rows = [] 
for row in table.findAll('tr')[1:]: 
list_of_cells = [] 
for cell in row.findAll('td'): 
    text = cell.text.replace(' ', '') 
    list_of_cells.append(text) 
list_of_rows.append(list_of_cells) 

outfile = open("./GPU.csv", "wb") 
writer = csv.writer(outfile) 
writer.writerow(["Product Name", "GPU Chip", "Released", "Bus", "Memory", "GPU clock", "Memory clock", "Shaders/TMUs/ROPs"]) 
writer.writerows(list_of_rows) 

ここでは、上記のコードにあるWebサイトのプログラムが動作しています。このページ上の複数のテーブルがあることをhttps://www.techpowerup.com/gpudb/2990/radeon-rx-560d

注:

は今、私は、次のWebサイトからテーブルをこすりしたいです。このページでプログラムを動作させるには、何を追加/変更する必要がありますか?私はすべてのテーブルを手に入れようとしていますが、もし誰かが私を助けることができれば、私はそれをとても高く評価します!

+0

あなたが学ぶのを助けるいくつかの非常に素晴らしいチュートリアルやドキュメントがあります! [このようなもの(Web Scraping Workshop)](https://gist.github.com/bradmontgomery/1872970)。 – cosinepenguin

+0

@cosinepenguinリンクありがとう!私はデータテーブルを掻き取ろうとしています。そのようなものをカバーするリンクがありますか、それとも私が言及した2番目のリンクのテーブルの1つを掻き集めるのに役立つ小さなコードがコード内にあるかどうかを知っていますか?手伝ってくれてどうもありがとう! –

+0

私は以下の答えが役立つことを願っています!そうでなければ、BeautifulSoupで*すべて*を行う方法を説明する数多くの素晴らしいチュートリアルがあります!最も徹底的なものの1つはスタンフォードからです:[美味しいスープを使ったWeb Scraping](http://web.stanford。edu /〜zlotnick/TextAsData/Web_Scraping_with_Beautiful_Soup.html)。これはまた、ウェブサイトのDOMモデルとそれらとやりとりする方法を強調表示します。一度これらの基本を習得すれば、それ以外のことは驚くほど簡単です!がんばろう! – cosinepenguin

答えて

0

本質的に、サイトにいくつかのテーブルがあるという事実を説明するために、あなたの質問にあるコードを変更するだけです!

BeautifulSoup(BS)については、本当にきれいな(または、私が言う、美しい)のは、findAllの方法です!これにより、繰り返し処理できるBSオブジェクトが作成されます。

ソースに5つのテーブルがあるとします。 tables = soup.findAll("table")を実行すれば、ソースコード内のすべてのテーブルオブジェクトのリストを返すことができます。その後、そのBSオブジェクトを反復処理して、それぞれのテーブルから情報を取り出すことができます。

あなたのコードは次のようなものを見ることができる:

import csv 
import requests 
import bs4 

url = 'https://www.techpowerup.com/gpudb/2990/radeon-rx-560d' 
response = requests.get(url) 
html = response.content 

soup = bs4.BeautifulSoup(html, "lxml") 

tables = soup.findAll("table") 

tableMatrix = [] 
for table in tables: 
    #Here you can do whatever you want with the data! You can findAll table row headers, etc... 
    list_of_rows = [] 
    for row in table.findAll('tr')[1:]: 
     list_of_cells = [] 
     for cell in row.findAll('td'): 
      text = cell.text.replace(' ', '') 
      list_of_cells.append(text) 
     list_of_rows.append(list_of_cells) 
    tableMatrix.append((list_of_rows, list_of_cells)) 
print(tableMatrix) 

このコードは動作しますが、私は元のコードが持っていたことをフォーマットするCSVファイルのいずれかを追加していないことに注意してくださいでしょうが!しかし、それはあなたのために働くことを再設計する必要があります。しかし、私はあなたがソースの各テーブルのために何をしても絶対に自由を持っている場所でコメントしました。あなたは各テーブルオブジェクトの要素をfindAll("th")に決めて、そのようなCSVファイルを設定するか、セル自体から情報を抽出することができます。今、各テーブルのセルデータをタプルに保存します。これをリストtableMatrixに追加します。

私はこれがあなたのPythonとBeautifulSoupの冒険に役立つことを願っています!

出典:

+0

こんにちは@cosinepenguin!すべてのあなたの助けをありがとう!各要素をExcelスプレッドシート内の独自のセルに配置するためにどのようなコマンドを使用しますか?ガイダンスは高く評価されています! :) –

関連する問題