用于 javascript 生成内容的 Python 网页抓取

Posted

技术标签:

【中文标题】用于 javascript 生成内容的 Python 网页抓取【英文标题】:Python web scraping for javascript generated content 【发布时间】:2015-04-02 02:31:13 【问题描述】:

我正在尝试使用 python3 返回由http://www.doi2bib.org/ 生成的 bibtex 引用。 url 是可预测的,因此脚本可以计算出 url,而无需与网页交互。我曾尝试使用 selenium、bs4 等,但无法在框中获取文本。

url = "http://www.doi2bib.org/#/doi/10.1007/s00425-007-0544-9"
import urllib.request
from bs4 import BeautifulSoup
text = BeautifulSoup(urllib.request.urlopen(url).read())
print(text)

谁能建议一种在 python 中将 bibtex 引用作为字符串(或其他)返回的方法?

【问题讨论】:

获取javascript生成内容的一般问题:scrape html generated by javascript with python - Stack Overflow 【参考方案1】:

这里不需要BeautifulSoup。有一个额外的 XHR 请求发送到服务器以填写 bibtex 引用,模拟它,例如使用requests

import requests

bibtex_id = '10.1007/s00425-007-0544-9'

url = "http://www.doi2bib.org/#/doi/id".format(id=bibtex_id)
xhr_url = 'http://www.doi2bib.org/doi2bib'

with requests.Session() as session:
    session.get(url)

    response = session.get(xhr_url, params='id': bibtex_id)
    print(response.content)

打印:

@articleBurgert_2007,
    doi = 10.1007/s00425-007-0544-9,
    url = http://dx.doi.org/10.1007/s00425-007-0544-9,
    year = 2007,
    month = jun,
    publisher = Springer Science $\mathplus$ Business Media,
    volume = 226,
    number = 4,
    pages = 981--987,
    author = Ingo Burgert and Michaela Eder and Notburga Gierlinger and Peter Fratzl,
    title = Tensile and compressive stresses in tracheids are induced by swelling based on geometrical constraints of the wood cell,
    journal = Planta


您也可以使用selenium 解决它。这里的关键技巧是使用Explicit Wait 等待引用to become visible:

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 = webdriver.Firefox()
driver.get('http://www.doi2bib.org/#/doi/10.1007/s00425-007-0544-9')

element = WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.XPATH, '//pre[@ng-show="bib"]')))
print(element.text)

driver.close()

打印与上述解决方案相同。

【讨论】:

谢谢。您介意告诉我如何查看附加请求已发送至doi2bib.org/doi2bib吗?对此很陌生。 @Nick 当然,打开浏览器开发者工具->网络选项卡。转到网站并查看加载页面时发送到服务器的所有请求。在其他人中,您会看到我提到的那个。希望对您有所帮助。

以上是关于用于 javascript 生成内容的 Python 网页抓取的主要内容,如果未能解决你的问题,请参考以下文章

抓取javascript生成的网页

如果网页内容是由javascript生成的,应该怎么实现爬虫

将 JavaScript 生成的 SVG 转换为文件

用于呈现 HTML 和 javascript 的 Python 库 [关闭]

用于生成表格行的 JavaScript

python 快速和肮脏的查克诺里斯python脚本。用于我们的SVN post commit钩子。如果您没有请求库:yum install pytho