js抓取网页内容(Python中的HTML生成内容内容介绍及解析)
优采云 发布时间: 2021-09-11 23:05js抓取网页内容(Python中的HTML生成内容内容介绍及解析)
我们没有得到正确的结果,因为 javascript 生成的任何内容都需要在 DOM 上呈现。当我们得到一个 HTML 页面时,我们得到的是初始的、未修改的 DOM。
因此,我们需要在抓取页面之前呈现 javascript 内容。
由于在这个线程中多次提到 Selenium(有时是它的速度),我将列出另外两种可能的解决方案。
解决方案 1:这是一个非常好的教程,我们将遵循这个教程。
我们需要的是:
Docker 安装在我们的机器上。在此之前,这是比其他解决方案更好的解决方案,因为它使用独立于操作系统的平台。
按照相应操作系统中列出的说明安装 Splash。
引用启动文件:
Splash 是一种 JavaScript 渲染服务。它是一个带有 HTTPAPI 的轻量级 Web 浏览器,使用 Twisted 和 QT5 在 Python 3 中实现。
本质上,我们将使用 Splash 来呈现由 Javascript 生成的内容。
运行 Splash 服务器:sudo docker run -p 8050:8050 scrapinghub/splash。
安装插件:pip install scrapy-splash
假设我们已经创建了一个 Scrapy 项目(如果没有),我们将根据指南更新 settings.py:
然后转到您的项目 settings.py 并设置这些中间工具:
DOWNLOADER_MIDDLEWARES = {
'scrapy_splash.SplashCookiesMiddleware': 723,
'scrapy_splash.SplashMiddleware': 725,
'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810,}
Splash 服务器的 URL(如果使用 Win 或 OSX)。这应该是对接计算机的URL:如何从主机获取docker容器的IP地址? ):
SPLASH_URL = 'http://localhost:8050'
最后,您还需要设置这些值:
DUPEFILTER_CLASS = 'scrapy_splash.SplashAwareDupeFilter'HTTPCACHE_STORAGE = 'scrapy_splash.SplashAwareFSCacheStorage'
最后,我们可以使用:
在普通蜘蛛中,可以使用请求对象来打开网址。如果要打开的页面收录JS生成的数据,则必须使用SplashRequest(或SplashFormRequest)来渲染页面。这是一个简单的例子:
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
SplashRequest 将 URL 呈现为 html 并返回您可以在回调(解析)方法中使用的响应。
解决方案 2:我们现在称之为实验(2018 年 5 月)。
此解决方案仅适用于 Python 版本 3.6(目前)。
你知道请求模块吗(谁不知道)?
现在有了爬虫小哥:request-HTML:
这个库旨在使解析 HTML(例如,爬网)尽可能简单和直观。
安装 requests-html:pipenv install requests-html
向页面的 URL 发出请求:
from requests_html import HTMLSessionsession = HTMLSession()r = session.get(a_page_url)
呈现响应以获取 Javascript 生成的位:
r.html.render()
最后好像提供了模块。
或者,我们也可以试试记录的方法。使用美利糖和 r.html 刚刚呈现的对象。