Webサイトから毎日の日の出/日の入り時刻を取得したいです。 PythonでWebコンテンツをスクレイピングすることは可能ですか?使用されているモジュールは何ですか?利用可能なチュートリアルはありますか?
Urllib2を華麗な BeautifulSoup ライブラリと組み合わせて使用します。
import urllib2
from BeautifulSoup import BeautifulSoup
# or if you're using BeautifulSoup4:
# from bs4 import BeautifulSoup
soup = BeautifulSoup(urllib2.urlopen('http://example.com').read())
for row in soup('table', {'class': 'spad'})[0].tbody('tr'):
tds = row('td')
print tds[0].string, tds[1].string
# will print date and sunrise
私は本当にスクレイピーをお勧めします。
削除された回答からの引用:
- スクレイピークロールは、(Twistedに加えて)非同期操作を使用するため、mechanizeよりも高速です。
- Scrapyは、libxml2の上で(x)htmlを解析するためのより良い最速のサポートを持っています。
- Scrapyは完全なUnicodeを備えた成熟したフレームワークであり、リダイレクト、gzip圧縮された応答、奇妙なエンコーディング、統合されたhttpキャッシュなどを処理します。
- Scrapyを使用すると、5分以内にクモを記述して画像をダウンロードし、サムネイルを作成して、抽出したデータを直接csvまたはjsonにエクスポートできます。
Webスクレイピング作業のスクリプトをまとめて、この bit-bucket library に集めました。
ケースのスクリプト例:
from webscraping import download, xpath
D = download.Download()
html = D.get('http://example.com')
for row in xpath.search(html, '//table[@class="spad"]/tbody/tr'):
cols = xpath.search(row, '/td')
print 'Sunrise: %s, Sunset: %s' % (cols[1], cols[2])
出力:
Sunrise: 08:39, Sunset: 16:08
Sunrise: 08:39, Sunset: 16:09
Sunrise: 08:39, Sunset: 16:10
Sunrise: 08:40, Sunset: 16:10
Sunrise: 08:40, Sunset: 16:11
Sunrise: 08:40, Sunset: 16:12
Sunrise: 08:40, Sunset: 16:13
pyquery をチェックアウトすることを強くお勧めします。それはjqueryのような(別名cssのような)構文を使用して、その背景から来た人にとって物事を本当に簡単にします。
あなたの場合、それは次のようなものになります:
from pyquery import *
html = PyQuery(url='http://www.example.com/')
trs = html('table.spad tbody tr')
for tr in trs:
tds = tr.getchildren()
print tds[1].text, tds[2].text
出力:
5:16 AM 9:28 PM
5:15 AM 9:30 PM
5:13 AM 9:31 PM
5:12 AM 9:33 PM
5:11 AM 9:34 PM
5:10 AM 9:35 PM
5:09 AM 9:37 PM
rllib2 を使用してHTTPリクエストを作成すると、Webコンテンツが得られます。
次のように取得できます。
import urllib2
response = urllib2.urlopen('http://example.com')
html = response.read()
Beautiful Soup は、スクリーンスクレイピングに適したpython HTMLパーサーです。
特に、 here はHTMLドキュメントの解析に関するチュートリアルです。
がんばろう!
Scrapemark (URLを見つける-py2)と httlib2 (イメージをダウンロードする-py2 + 3)の組み合わせを使用します。 scrapemark.pyには500行のコードがありますが、正規表現を使用しているため、それほど高速ではない可能性があり、テストしませんでした。
ウェブサイトをスクレイピングする例:
import sys
from pprint import pprint
from scrapemark import scrape
pprint(scrape("""
<table class="spad">
<tbody>
{*
<tr>
<td>{{[].day}}</td>
<td>{{[].sunrise}}</td>
<td>{{[].sunset}}</td>
{# ... #}
</tr>
*}
</tbody>
</table>
""", url=sys.argv[1] ))
使用法:
python2 sunscraper.py http://www.example.com/
結果:
[{'day': u'1. Dez 2012', 'sunrise': u'08:18', 'sunset': u'16:10'},
{'day': u'2. Dez 2012', 'sunrise': u'08:19', 'sunset': u'16:10'},
{'day': u'3. Dez 2012', 'sunrise': u'08:21', 'sunset': u'16:09'},
{'day': u'4. Dez 2012', 'sunrise': u'08:22', 'sunset': u'16:09'},
{'day': u'5. Dez 2012', 'sunrise': u'08:23', 'sunset': u'16:08'},
{'day': u'6. Dez 2012', 'sunrise': u'08:25', 'sunset': u'16:08'},
{'day': u'7. Dez 2012', 'sunrise': u'08:26', 'sunset': u'16:07'}]
Pycoder's Weekly で RoboBrowser を見ました。
RequestsとBeautifulSoupに基づいて構築されたWebスクレイピング用のライブラリ。 Mechanizeに似ていますが、テスト、ドキュメント、Pythonインターフェイスを備えています。
Scrapyオープンソースフレームワークは、PythonでのWebスクラップに役立ちます。このオープンソースおよびコラボレーションフレームワークは、Webサイトから必要なデータを抽出します。
Webスクレイピングは、ボットまたはWebクローラーを使用してWeb上の情報にインデックスを付けるWebインデックス作成と密接に関連しており、ほとんどの検索エンジンで採用されている普遍的な手法です。
CSS Selectors
を使用して生活を楽にします
私はパーティーに遅刻したことは知っていますが、あなたにいい提案があります。
BeautifulSoup
の使用は既に提案されているので、HTML内のデータをスクレイピングするためにCSS Selectors
を使用することをお勧めします
import urllib2
from bs4 import BeautifulSoup
main_url = "http://www.example.com"
main_page_html = tryAgain(main_url)
main_page_soup = BeautifulSoup(main_page_html)
# Scrape all TDs from TRs inside Table
for tr in main_page_soup.select("table.class_of_table"):
for td in tr.select("td#id"):
print(td.text)
# For acnhors inside TD
print(td.select("a")[0].text)
# Value of Href attribute
print(td.select("a")[0]["href"])
# This is method that scrape URL and if it doesnt get scraped, waits for 20 seconds and then tries again. (I use it because my internet connection sometimes get disconnects)
def tryAgain(passed_url):
try:
page = requests.get(passed_url,headers = random.choice(header), timeout = timeout_time).text
return page
except Exception:
while 1:
print("Trying again the URL:")
print(passed_url)
try:
page = requests.get(passed_url,headers = random.choice(header), timeout = timeout_time).text
print("-------------------------------------")
print("---- URL was successfully scraped ---")
print("-------------------------------------")
return page
except Exception:
time.sleep(20)
continue
この質問に対する新しい回答。 lxml は、PythonでWebスクレイピングを行うための好ましい方法として浮上しています。スクレイピーとは異なり、Twistedに依存していません。 Pythonへのヒッチハイカーのガイド によっても承認されています。
これは単純なWebクローラーです。BeautifulSoupを使用し、クラス名が_3NFO0dであるすべてのリンク(アンカー)を検索します。私はFlipkar.comを使用しました。これはオンライン小売店です。
import requests
from bs4 import BeautifulSoup
def crawl_flipkart():
url = 'https://www.flipkart.com/'
source_code = requests.get(url)
plain_text = source_code.text
soup = BeautifulSoup(plain_text, "lxml")
for link in soup.findAll('a', {'class': '_3NFO0d'}):
href = link.get('href')
print(href)
crawl_flipkart()
特定のカテゴリからアイテムの名前を取得することを考えている場合は、CSSセレクターを使用してそのカテゴリのクラス名を指定することでそれを行うことができます。
import requests ; from bs4 import BeautifulSoup
soup = BeautifulSoup(requests.get('https://www.flipkart.com/').text, "lxml")
for link in soup.select('div._2kSfQ4'):
print(link.text)
これは部分的な検索結果です。
Puma, USPA, Adidas & moreUp to 70% OffMen's Shoes
Shirts, T-Shirts...Under ₹599For Men
Nike, UCB, Adidas & moreUnder ₹999Men's Sandals, Slippers
Philips & moreStarting ₹99LED Bulbs & Emergency Lights
Pythonには、Webをスクレイプするための優れたオプションがあります。フレームワークで最適なのは scrapy です。初心者には少し注意が必要な場合があるので、ここで少し助けてください。
1。 pythonを3.5より上にインストールします(2.7までは下のものが機能します)。
2。 condaで環境を作成します(これを行いました)。
3。場所にスクレイピーをインストールし、そこから実行します。
4。 Scrapy Shell
は、コードをテストするためのインタラクティブなインターフェースを提供します。
5。 Scrapy startproject projectname
はフレームワークを作成します。
6。 Scrapy genspider spidername
はスパイダーを作成します。必要な数のクモを作成できます。これを行う間、プロジェクトディレクトリ内にいることを確認してください。
より簡単な方法は、 requests および beautiful soup を使用することです。開始する前に、1時間かけてドキュメントを確認することで、ほとんどの疑問を解決できます。 BS4は、選択できる幅広いパーサーを提供します。 user-agent
およびsleep
を使用して、スクレイピングを簡単にします。 BS4はbs.tagを返すため、variable[0]
を使用します。 jsが実行されている場合、リクエストとbs4を直接使用してスクレイピングすることはできません。 APIリンクを取得し、JSONを解析して必要な情報を取得するか、Selenium
を試してください。