Python html-requests render()不会渲染JavaScript元素。
Python的`html-requests`库的`render()`方法并不会渲染JavaScript元素。这可能导致在爬取网页时无法获取到完整的页面内容,因为有些网页的内容是通过JavaScript动态加载的。为了解决这个问题,可以使用`selenium`库来实现。
`Selenium`是一个自动化测试工具,它可以模拟用户在浏览器中的操作。通过使用`selenium`库,我们可以实现网页的完整渲染,包括JavaScript元素的加载。
下面是使用`selenium`库的示例代码:
from selenium import webdriver import time driver = webdriver.Firefox() driver.get(url) time.sleep(5) htmlSource = driver.page_source
上述代码中,我们首先导入了`selenium`库,并实例化了一个`webdriver`对象。然后使用`get()`方法来打开指定的URL,等待5秒钟以确保页面完全加载。最后,使用`page_source`属性来获取完整的页面源代码。
然而,使用`selenium`库可能会导致性能问题,因为它相对较重,并且需要浏览器的支持。如果不想使用PhantomJS(一个无界面浏览器),可以将其他标准浏览器设置为无头模式来运行。
下面是使用Chrome浏览器的无头模式的示例代码:
from selenium import webdriver options = webdriver.ChromeOptions() options.add_argument('--headless') driver = webdriver.Chrome(options=options)
上述代码中,我们创建了一个`webdriver`对象,并通过`ChromeOptions`类的`add_argument()`方法将浏览器设置为无头模式。这样就可以在不打开浏览器窗口的情况下运行代码。
总之,如果要渲染JavaScript元素并获取完整的页面内容,可以使用`selenium`库来实现。但是需要注意,使用`selenium`可能会带来一些性能问题,所以可以考虑使用无头模式来运行标准浏览器。
Python的html-requests render()函数不能渲染JavaScript元素的问题原因是因为dryscape库不再维护,dryscape开发人员推荐的库只支持Python 2。解决方法是使用Selenium的Python库与Phantom JS作为Web驱动程序,这样可以快速完成工作。安装Phantom JS后,确保当前路径中有phantomjs可执行文件。示例中给出了一个包含JavaScript代码的HTML页面,演示了如何在没有JavaScript支持和有JavaScript支持的情况下进行爬取。使用requests和BeautifulSoup可以在没有JavaScript支持的情况下进行爬取,使用Selenium和Phantom JS可以在有JavaScript支持的情况下进行爬取。另外,还可以使用dryscrape库进行爬取,但是它不支持Windows系统。对于在Windows系统下编程的人来说,可以考虑使用PhantomJS或者Chrome和Firefox的无头模式。最后,PhantomJS已经停止维护,建议使用Chrome或Firefox的无头模式。
Python的html-requests render()方法在爬取网页时无法渲染JavaScript生成的元素,导致无法获取正确的结果。解决这个问题的方法有两种:
解决方法一:
1. 安装Docker,这是一个跨平台的操作系统独立平台。
2. 安装Splash,这是一个基于Python 3、使用Twisted和QT5实现的JavaScript渲染服务。
3. 运行Splash服务器:sudo docker run -p 8050:8050 scrapinghub/splash。
4. 安装scrapy-splash插件:pip install scrapy-splash。
5. 在Scrapy项目的settings.py文件中设置中间件和URL:
DOWNLOADER_MIDDLEWARES = { 'scrapy_splash.SplashCookiesMiddleware': 723, 'scrapy_splash.SplashMiddleware': 725, 'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810, } SPLASH_URL = 'http://localhost:8050' DUPEFILTER_CLASS = 'scrapy_splash.SplashAwareDupeFilter' HTTPCACHE_STORAGE = 'scrapy_splash.SplashAwareFSCacheStorage'
6. 使用SplashRequest来渲染JavaScript生成的内容,例如:
class MySpider(scrapy.Spider): name = "jsscraper" start_urls = ["http://quotes.toscrape.com/js/"] def start_requests(self): for url in self.start_urls: yield SplashRequest( url=url, callback=self.parse, endpoint='render.html' ) def parse(self, response): for q in response.css("div.quote"): quote = QuoteItem() quote["author"] = q.css(".author::text").extract_first() quote["quote"] = q.css(".text::text").extract_first() yield quote
解决方法二:
1. 安装requests-html库:pipenv install requests-html。
2. 使用requests-html发送请求并获取响应:
from requests_html import HTMLSession session = HTMLSession() r = session.get(a_page_url)
3. 使用r.html.render()方法渲染响应中的JavaScript生成的内容:
r.html.render()
4. 可以使用r.html对象来进行网页解析,或者尝试使用BeautifulSoup库来解析r.html对象。
以上是解决Python html-requests render()无法渲染JavaScript元素的两种方法。如果还有其他问题,请在Stack Overflow上提问。