最近我一直在用Python和靓汤学习网页刮刮乐。然而,当我试图刮下下面的页面时,我遇到了一点麻烦:
http://www.librarything.com/work/3203347
我想从页面上得到的数据是这本书的标签,但我找不到任何方法来获取数据,尽管我花了很多时间在网上拖网。
我试着在网上看了几本指南,但似乎没有一本奏效。我尝试将页面转换为XML和JSON,但仍然找不到数据。
我现在有点手足无措,如果有任何帮助我会很感激的。
多谢了。
在分析HTML和脚本之后,通过AJAX加载标记,请求AJAX url使我们的生活变得容易。下面是python脚本。
import requests
from bs4 import BeautifulSoup
content = requests.get("http://www.librarything.com/ajax_work_makeworkCloud.php?work=3203347&check=2801929225").text
soup = BeautifulSoup(content)
for tag in soup.find_all('a'):
print(tag)
我不确定要从页面中删除哪些数据。但如果选中,页面将通过一个javascript加载动态“标记”,该javascript将在页面加载后启动。如果您的刮板只加载DOM控制器并在后台解析网页,而没有在浏览器中加载,那么页面中的任何动态数据都很可能不会加载。
一个可能的解决方案是使用selenium完全加载页面,然后将其刮除。
没有BS的可能实现:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException
my_url = 'http://www.librarything.com/work/3203347'
driver = webdriver.Chrome()
driver.get(my_url)
delay = 5 # seconds
try:
WebDriverWait(driver, delay).until(EC.presence_of_element_located((By.CSS_SELECTOR, 'span.tag')))
print("Page is ready!")
for element in driver.find_elements_by_css_selector('span.tag'):
print(element.text)
except TimeoutException:
print("Couldn't load page")
finally:
driver.quit()
执行来源:
等待直到由其css标识的元素存在
用硒定位元素