2016-02-27 129 views
0

我能夠刮這個網站表沒有問題;但是,要訪問我自定義的表我需要先登錄然後刮,因爲如果我不我得到一個默認輸出。我覺得我很接近,但我對python比較陌生。期待更多地瞭解機械化和BeautifulSoup。Python網頁刮美麗的湯

它似乎是正確登錄,因爲我得到一個「不正確的密碼」錯誤,如果我故意輸入一個錯誤的密碼下面,但我如何連接登錄到url我想刮?

from bs4 import BeautifulSoup 
import urllib 
import csv 
import mechanize 
import cookielib 

cj = cookielib.CookieJar() 
br = mechanize.Browser() 
br.set_cookiejar(cj) 
br.open("http://www.barchart.com/login.php") 

br.select_form(nr=0) 
br.form['email'] = 'username' 
br.form['password'] = 'password' 
br.submit() 

#print br.response().read() 

r = urllib.urlopen("http://www.barchart.com/stocks/sp500.php?view=49530&_dtp1=0").read() 

soup = BeautifulSoup(r, "html.parser") 

tables = soup.find("table", attrs={"class" : "datatable ajax"}) 

headers = [header.text for header in tables.find_all('th')] 

rows = [] 

for row in tables.find_all('tr'): 
    rows.append([val.text.encode('utf8') for val in row.find_all('td')]) 


with open('snp.csv', 'wb') as f: 
    writer = csv.writer(f) 
    writer.writerow(headers) 
    writer.writerows(row for row in rows if row) 

#from pymongo import MongoClient 
#import datetime 
#client = MongoClient('localhost', 27017) 

print soup.table.get_text() 

回答

2

我不確定您是否確實需要登錄才能檢索問題中的網址;無論是否登錄,我都會得到相同的結果。

但是,如果您確實需要登錄才能訪問其他數據,則問題在於您使用mechanize登錄,但使用urllib.urlopen()訪問該頁面。兩者之間沒有連接,因此mechanize收集的任何會話數據在發出請求時都不可用於urlopen

在這種情況下,你不需要使用urlopen()因爲你可以mechanize打開URL並訪問HTML:

r = br.open("http://www.barchart.com/stocks/sp500.php?view=49530&_dtp1=0") 
soup = BeautifulSoup(r.read(), "html.parser") 
+0

感謝您的答覆。該網址仍然可以訪問,而無需登錄;然而,問題是,當你從瀏覽器或python訪問url而沒有這樣做時,它會向你發送默認的表格設置。一旦你登錄它,然後顯示我需要的正確表。我嘗試了你的建議,但它仍然給我默認的標題。我認爲我的機械設置可能有問題? –

+0

你知道我忘記了我用FB登錄並且它連接到我的賬戶,當我設置它時代碼實際上沒有識別密碼。我添加了一個密碼,我現在得到了我登錄時建立的自定義表。謝謝! –