为了账号安全,请及时绑定邮箱和手机立即绑定

Web-用Python抓取JavaScript页面

Web-用Python抓取JavaScript页面

哔哔one 2019-06-03 13:33:46
Web-用Python抓取JavaScript页面我试着开发一个简单的网络刮刀。我想提取没有HTML代码的文本。事实上,我实现了这个目标,但我已经看到,在一些加载JavaScript的页面中,我没有取得好的结果。例如,如果一些JavaScript代码添加了一些文本,我就看不到它,因为当我调用response = urllib2.urlopen(request)我得到的原始文本没有添加的文本(因为JavaScript是在客户机中执行的)。所以,我在寻找一些解决这个问题的方法。
查看完整描述

4 回答

?
宝慕林4294392

TA贡献2021条经验 获得超8个赞

我们没有得到正确的结果,因为任何javascript生成的内容都需要在DOM上呈现。当我们获取一个HTML页面时,我们获取初始的、未经javascript修改的DOM。

因此,我们需要在抓取页面之前呈现javascript内容。

由于在这个线程中已经多次提到Selenium(有时还提到了它的速度),我将列出另外两个可能的解决方案。


解决方案1:这是一个非常好的教程如何使用Scrapy爬行javascript生成的内容我们将遵循这一点。

我们需要的是:

  1. 码头工人安装在我们的机器里。在此之前,这是一个优于其他解决方案的解决方案,因为它使用的是独立于操作系统的平台。

  2. 安装飞溅按照相应操作系统列出的指令执行。
    引用飞溅文件的话:

    Splash是一个javascript呈现服务。它是一个带有HTTPAPI的轻量级Web浏览器,使用Twisted和QT5在Python 3中实现。

    本质上,我们将使用Splash来呈现Javascript生成的内容。

  3. 运行Splash服务器:sudo docker run -p 8050:8050 scrapinghub/splash.

  4. 安装刮溅插件:pip install scrapy-splash

  5. 假设我们已经创建了一个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'
  6. 最后,我们可以使用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:我们现在称之为实验(2018年5月).
此解决方案适用于Python版本3.6只是(目前)。

你知道请求模块(谁不知道)?
现在它有了一个爬行的小兄弟:请求-HTML:

这个库旨在使解析HTML(例如,抓取Web)尽可能简单和直观。

  1. 安装请求-html:pipenv install requests-html

  2. 向页面的网址发出请求:

    from requests_html import HTMLSessionsession = HTMLSession()r = session.get(a_page_url)
  3. 呈现响应以获取Javascript生成的比特:

    r.html.render()

最后,模块似乎提供了刮擦能力.
或者,我们也可以尝试记录在案的方法。使用美丽汤带着r.html我们刚刚呈现的对象。


查看完整回答
反对 回复 2019-06-03
  • 4 回答
  • 0 关注
  • 1339 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信