亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 1380 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號