2013-05-07 31 views
7

Đây là liên kết Tôi muốn cạo: http://www.prudential.com.hk/PruServlet?module=fund&purpose=searchHistFund&fundCd=MMFU_UNewbie: Làm thế nào để vượt qua Javascript "onclick" nút để cạo trang web?

Các "English Version" tab nằm ở góc trên bên phải để hiển thị phiên bản tiếng Anh của trang web.

Có một nút tôi phải nhấn để đọc thông tin tiền trên trang web. Nếu không, chế độ xem bị chặn và việc sử dụng vỏ phế liệu luôn dẫn đến kết quả rỗng [].

<div onclick="AgreeClick()" style="width:200px; padding:8px; border:1px black solid; 
background-color:#cccccc; cursor:pointer;">Confirmed</div> 

Và chức năng của AgreeClick là:

function AgreeClick() { 
var cookieKey = "ListFundShowDisclaimer"; 
SetCookie(cookieKey, "true", null); 
Get("disclaimerDiv").style.display = "none"; 
Get("blankDiv").style.display = "none"; 
Get("screenDiv").style.display = "none"; 
//Get("contentTable").style.display = "block"; 
ShowDropDown(); 

Làm thế nào để khắc phục điều này onclick = "AgreeClick()" chức năng để cạo trang web?

Trả lời

4

Bạn không thể chỉ cần nhấp vào liên kết bên trong phế liệu (xem Click a Button in Scrapy).

Trước hết, hãy kiểm tra xem dữ liệu bạn cần đã có ở đó chưa - trong html (nó ở chế độ nền - vì vậy nó ở đó).

lựa chọn khác là selenium:

from selenium import webdriver 
import time 

browser = webdriver.Firefox() 
browser.get("http://www.prudential.com.hk/PruServlet?module=fund&purpose=searchHistFund&fundCd=MMFU_U") 

elem = browser.find_element_by_xpath('//*[@id="disclaimer"]/div/div') 
elem.click() 
time.sleep(0.2) 

elem = browser.find_element_by_xpath("//*") 
print elem.get_attribute("outerHTML") 

Thêm một lựa chọn là sử dụng mechanize. Nó không thể thực thi mã js, nhưng, theo mã nguồn, AgreeClick chỉ cần đặt cookie ListFundShowDisclaimer thành true. Đây là một điểm khởi đầu (không chắc chắn nếu nó hoạt động):

import cookielib 
import mechanize 

br = mechanize.Browser() 

cj = cookielib.CookieJar() 
ck = cookielib.Cookie(version=0, name='ListFundShowDisclaimer', value='true', port=None, port_specified=False, 
         domain='www.prudential.com.hk', domain_specified=False, domain_initial_dot=False, path='/', 
         path_specified=True, secure=False, expires=None, discard=True, comment=None, comment_url=None, 
         rest={'HttpOnly': None}, rfc2109=False) 
cj.set_cookie(ck) 
br.set_cookiejar(cj) 

br.open("http://www.prudential.com.hk/PruServlet?module=fund&purpose=searchHistFund&fundCd=MMFU_U") 
print br.response().read() 

Sau đó, bạn có thể phân tích kết quả với BeautifulSoup hoặc bất cứ điều gì bạn thích.

+0

bạn cũng có giải pháp trong Yêu cầu không? Tôi đang sử dụng Yêu cầu và tôi cần thực hiện việc này. – Shaardool

4

Sử dụng thư viện spynner để Python mô phỏng trình duyệt và thực thi javascript phía máy khách.

import spynner 

browser = spynner.Browser() 
url = "http://www.prudential.com/path/?args=values" 

browser.load(url) 

browser.runjs("AgreeClick();") 

markup = browser._get_html() 

Như bạn có thể thấy, bạn có thể gọi bất kỳ hàm Javascript nào có sẵn trong nguồn của trang theo lập trình.

Nếu bạn cũng cần phải phân tích cú pháp kết quả, tôi đặc biệt khuyên bạn nên BeautifulSoup.

Các vấn đề liên quan