我一直试图从cnet页面抓取用户评论。用户的利弊评论信息。 (http://www.cnet.com/products/samsung-galaxy-s7/user-reviews/)
我已经使用selenium来动态加载页面,但html源和inspect元素源仍然不同。我也使用了获取源代码的请求。我不确定两者之间的区别。
你能告诉我一个解决方法吗?用于硒的代码:
driver.get("http://www.cnet.com/products/samsung-galaxy-s7/user-reviews/")
driver.wait = WebDriverWait(driver, 2)
soup= BeautifulSoup(driver.page_source,"html.parser")
请求代码:
try:
r = requests.get("http://www.cnet.com/products/samsung-galaxy-s7/user-reviews/", timeout = 10)
except Exception,e:
print("borken")
data = r.text
soup = BeautifulSoup(data)
PS:我在堆栈溢出和谷歌搜索,但我找不到合适的答案。如果有人能给我一个链接也会有所帮助。
答案 0 :(得分:0)
该页面有相当多的JavaScript,所以我认为使用selenium是加载所有内容的最佳选择。在您当前的代码中,您只等待2秒,这可能不够。我建议使用在注释部分元素完全加载时返回的显式等待。
这里有一个很好的解释和示例:http://selenium-python.readthedocs.io/waits.html
看起来每个评论块的格式为
<article class= "fyre-comment-article fyre-comment-source-0"..../>
所以你可以从上面的链接修改示例开始:(我没有能力在我当前的机器上实际运行这个代码所以只是用它作为修改代码的方法的一个例子链接。请阅读此处了解更多查找元素的方法:http://selenium-python.readthedocs.io/locating-elements.html)
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
driver = <yourdriver>
driver.get("http://www.cnet.com/products/samsung-galaxy-s7/user-reviews/")
try:
element = WebDriverWait(driver, 10).until(
EC.presence_of_all_elements_located((By.XPATH,
'//article[class="fyre-comment-article fyre-comment-source-0"]'))
)
finally:
driver.quit()