2016-02-27 110 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登录并且它连接到我的账户,当我设置它时代码实际上没有识别密码。我添加了一个密码,我现在得到了我登录时建立的自定义表。谢谢! –