使用python查询javascript查询生成的元素

时间:2017-10-23 21:13:23

标签: javascript python html web-scraping

我正在尝试访问其内容由javascript生成的元素中的文本。例如,从this site获取推特份额的数量。

我尝试使用urllib和pyqt来获取页面的html,但是由于内容需要生成javascript,因此urllib / pyqt的响应中不存在HTML。我目前正在使用硒来完成这项任务,但它的使用时间比我想要的要长。

是否可以在不在浏览器中打开页面的情况下访问此数据?

过去已经提出过这个问题,但我找到的结果是c# specific或提供了自gone dead

之后的解决方案的链接

2 个答案:

答案 0 :(得分:2)

工作示例:

import urllib
import requests
import json

url = "https://daphnecaruanagalizia.com/2017/10/crook-schembri-court-today-pleading-not-crook/"

encoded = urllib.parse.quote_plus(url)
# encoded = urllib.quote_plus(url) # for python 2 replace previous line by this
j = requests.get('https://count-server.sharethis.com/v2.0/get_counts?url=%s' % encoded).text
obj = json.loads(j)
print(obj['clicks']['twitter'] + obj['shares']['twitter'])

# => 5008

说明:

检查网页,您可以看到它对此发出了请求:

https://count-server.sharethis.com/v2.0/get_counts?url=https%3A%2F%2Fdaphnecaruanagalizia.com%2F2017%2F10%2Fcrook-schembri-court-today-pleading-not-crook%2F&cb=stButtons.processCB&wd=true

如果您将其粘贴到浏览器中,您将获得所有答案。然后用url玩一下,你可以看到删除额外的参数会给你一个不错的json。

正如您所看到的,您只需将请求的url参数替换为您想要获取Twitter计数的页面的网址。

答案 1 :(得分:1)

在启动Selenium Web浏览器之后,您可以执行类似以下的操作,然后将driver.page_source传递给BeautifulSoup库(遗憾的是,无法在防火墙处于适当位置时对其进行测试):

soup = BeautifulSoup(driver.page_source, 'html.parser')

shares = soup.find('span', {'class': 'st_twitter_hcount'}).find('span', {'class': 'stBubble_hcount'})