2013-05-17 49 views
12

Tôi đang học cách sử dụng Python Selenium và BeautifulSoup để duyệt web. Hiện tại, tôi đang cố gắng xóa tìm kiếm phổ biến trên các xu hướng tìm kiếm của Google http://www.google.com/trends/hottrends#pn=p5Selenium tải xuống trang đầy đủ html

Đây là mã hiện tại của tôi. Tuy nhiên, tôi nhận ra html đầy đủ không được tải xuống và tôi chỉ có nội dung từ vài ngày gần đây nhất. Tôi có thể làm gì để khắc phục vấn đề này?

from selenium import webdriver 
from bs4 import BeautifulSoup 

googleURL = "http://www.google.com/trends/hottrends#pn=p5" 

browser = webdriver.Firefox() 
browser.get(googleURL) 
content = browser.page_source 

soup = BeautifulSoup(content) 
print soup 
+0

Bất kỳ lý do cụ thể nào khi sử dụng trình chuyển đổi web qua selen cho mục đích này? – Torxed

+0

@Torxed - Tôi nghi ngờ đó là do xử lý nội dung động/javascript ... – root

+0

vâng tôi đã thử urllib2 nhưng nó không hoạt động do nội dung động/javascript – user2392965

Trả lời

5

Người dùng thêm nội dung khác vào trang (từ các ngày trước đó) bằng cách nhấp vào phần tử <div onclick="control.moreData()" id="moreLink">More...</div> ở cuối trang.

Vì vậy, để có được nội dung mong muốn, bạn có thể sử dụng Selenium để nhấp vào thành phần id="moreLink" hoặc thực hiện một số JavaScript để gọi control.moreData(); trong một vòng lặp. Ví dụ, nếu bạn muốn nhận được tất cả nội dung như xa trở lại như thứ Sáu, ngày 15 tháng 2 năm 2013 (có vẻ như một chuỗi định dạng này tồn tại cho mỗi ngày, đối với nội dung được tải) python của bạn có thể trông giống như sau:

content = browser.page_source 
desired_content_is_loaded = false; 
while (desired_content_is_loaded == false): 
    if not "Friday, February 15, 2013" in content: 
      sel.run_script("control.moreData();") 
      content = browser.page_source 
    else: 
      desired_content_is_loaded = true; 

EDIT:

Nếu bạn vô hiệu hóa JavaScript trong trình duyệt của bạn và tải lại trang, bạn sẽ thấy rằng không có "xu hướng" nội dung gì cả. Điều đó cho tôi biết, là các mục đó được nạp tự động. Có nghĩa là, chúng không phải là một phần của tài liệu HTML được tải xuống khi bạn mở trang. Selenium's .get() đợi cho tài liệu HTML tải, nhưng không phải cho tất cả JS để hoàn thành. Không có thông báo nếu async JS sẽ hoàn thành trước hoặc sau bất kỳ sự kiện nào khác. Nó hoàn thành khi nó đã sẵn sàng, và có thể khác nhau mỗi lần. Điều đó sẽ giải thích lý do tại sao đôi khi bạn có thể nhận được tất cả, một số hoặc không có nội dung nào khi bạn gọi browser.page_source vì nó phụ thuộc vào việc async JS hoạt động như thế nào tại thời điểm đó.

Vì vậy, sau khi mở trang, bạn có thể thử chờ một vài giây trước khi nhận nguồn - cung cấp cho JS tải thời gian nội dung hoàn thành.

browser.get(googleURL) 
time.sleep(3) 
content = browser.page_source 
+0

cảm ơn cho câu trả lời. Tuy nhiên, vấn đề là tôi thậm chí không nhận được tất cả các kết quả từ trang đầu tiên, ví dụ:Tôi chỉ nhận được ba bản ghi ngay cả khi có sáu bản trên màn hình ban đầu. Btw, có cách nào để tự động di chuyển xuống thay vì mã hóa cứng ngày Thứ sáu, ngày 15 tháng 2 năm 2013 không? Cảm ơn. – user2392965

+1

thay vì time.sleep tôi sẽ xem xét đến selenium.webdriver.support.ui.WebDriverWait http://stackoverflow.com/questions/9823272/python-selenium-waiting-for-frame-element-lookups – qwwqwwq

+0

Tôi đã chỉnh sửa câu trả lời của mình cho giải thích tại sao bạn có thể chỉ nhận được một số kết quả khi có nhiều kết quả hơn trên màn hình. –

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