4 回答
TA贡献2021条经验 获得超8个赞
解决方案1:
我们需要的是:
码头工人 安装在我们的机器里。在此之前,这是一个优于其他解决方案的解决方案,因为它使用的是独立于操作系统的平台。 安装飞溅 按照相应操作系统列出的指令执行。 引用飞溅文件的话: 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: 如何从主机获取码头集装箱的IP地址? ):SPLASH_URL = 'http://localhost:8050'
最后,还需要设置这些值: DUPEFILTER_CLASS = 'scrapy_splash.SplashAwareDupeFilter'HTTPCACHE_STORAGE = 'scrapy_splash.SplashAwareFSCacheStorage'
最后,我们可以使用 SplashRequest
:在普通的蜘蛛中,您可以使用请求对象来打开URL。如果要打开的页面包含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:
此解决方案适用于Python版本3.6
这个库旨在使解析HTML(例如,抓取Web)尽可能简单和直观。
安装请求-html: pipenv install requests-html
向页面的网址发出请求: from requests_html import HTMLSessionsession = HTMLSession()r = session.get(a_page_url)
呈现响应以获取Javascript生成的比特: r.html.render()
r.html
添加回答
举报