js爬虫和python爬虫 python 爬虫 javascript_js爬虫和python爬虫


我们没有得到正确的结果,因为任何javascript生成的内容都需要在DOM上呈现。当我们获取一个HTML页面时,我们获取初始的、未经javascript修改的DOM。因此,我们需要在抓取页面之前呈现javascript内容。由于在这个线程中已经多次提到Selenium(有时还提到了它的速度),我将列出另外两个可能的解决方案。解决方案1:这是一个非常好的教程如何使用Scrapy爬行javascript生成的内容我们将遵循这一点。我们需要的是:码头工人安装在我们的机器里。在此之前,这是一个优于其他解决方案的解决方案,因为它使用的是独立于操作系统的平台。安装飞溅按照相应操作系统列出的指令执行。引用飞溅文件的话: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 quoteSplashRequest将URL呈现为html,并返回您可以在回调(解析)方法中使用的响应。解决方案2:我们现在称之为实验(2018年5月).此解决方案适用于Python版本3.6只是(目前)。你知道请求模块(谁不知道)?现在它有了一个爬行的小兄弟:请求-HTML:这个库旨在使解析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我们刚刚呈现的对象。