In a normal spider you have Request objects which you can use to open URLs. If the page you want to open contains JS generated data you have to use SplashRequest(or SplashFormRequest) to render the page. Here’s a simple example:
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 renders the URL as html and returns the response which you can use in the callback(parse) method.
2017年12月30日编辑:这个答案出现在谷歌搜索的最热门结果中,所以我决定更新它。旧的答案还在后面。
dryscape不再维护,dryscape开发人员推荐的库仅为Python2。我发现使用Selenium的python库和Phantom JS作为web驱动程序已经足够快和容易完成工作。
安装Phantom JS后,请确保
phantomjs
二进制文件在当前路径中可用:示例
举个例子,我创建了一个包含以下HTML代码的示例页面。(link):
如果没有javascript,它会说:
No javascript support
,如果有javascript,它会说:Yay! Supports javascript
无JS支持的刮削:
支持JS的刮削:
您还可以使用Python库dryscrape来清理javascript驱动的网站。
支持JS的刮削:
我们没有得到正确的结果,因为任何javascript生成的内容都需要在DOM上呈现。当我们获取一个HTML页面时,我们获取初始的,未被javascript修改的,DOM。
因此,我们需要在抓取页面之前呈现javascript内容。
由于在这个线程中已经多次提到硒(有时还提到硒的速度有多慢),我将列出另外两个可能的解决方案。
解决方案1:这是一个关于how to use Scrapy to crawl javascript generated content的非常好的教程,我们将按照它进行。
我们需要什么:
Docker安装在我们的机器中。到目前为止,这是一个优于其他解决方案的优势,因为它使用了一个独立于操作系统的平台。
Install Splash遵循相应操作系统的说明。
引用splash文档:
实际上,我们将使用Splash来呈现Javascript生成的内容。
运行启动服务器:
sudo docker run -p 8050:8050 scrapinghub/splash
。安装scrapy-splash插件:
pip install scrapy-splash
假设我们已经创建了一个不完整的项目(如果没有,let's make one),我们将遵循指南并更新
settings.py
:最后,我们可以使用^{} :
解决方案2:让我们现在称之为实验(2018年5月)…
此解决方案仅适用于Python的3.6版(目前)。
你知道requests模块吗(谁不知道)?
现在它有一个网络爬行的小兄弟:requests-HTML:
安装请求html:
pipenv install requests-html
请求页面的url:
呈现响应以获取Javascript生成的位:
最后,模块似乎提供了scraping capabilities。
或者,我们也可以尝试使用我们刚刚呈现的
r.html
对象的文档化方法of using BeautifulSoup。或许selenium可以做到。
相关问题 更多 >
编程相关推荐