Python html-requests render()不会渲染JavaScript元素。

10 浏览
0 Comments

Python html-requests render()不会渲染JavaScript元素。

我正在尝试开发一个简单的网络爬虫。我想提取没有HTML标记的纯文本。我的代码可以处理纯HTML(静态)页面,但无法处理由页面中嵌入的JavaScript生成的内容。

特别是,当我使用urllib2.urlopen(request)来读取页面内容时,它不会显示由JavaScript代码添加的任何内容,因为该代码没有在任何地方执行。通常情况下,它将由Web浏览器运行,但它不是我程序的一部分。

如何从我的Python代码中访问这个动态内容?

0
0 Comments

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`可能会带来一些性能问题,所以可以考虑使用无头模式来运行标准浏览器。

0
0 Comments

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的无头模式。

0
0 Comments

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上提问。

0