【问题标题】:How to scrape vessels from MarineTraffic如何从 MarineTraffic 刮掉船只
【发布时间】:2020-05-03 18:07:36
【问题描述】:

我尝试使用以下scrapy 的蜘蛛从https://www.marinetraffic.com/en/ais/details/ships/imo:9829069/ 提取数据,然后将响应保存到file.html。

# -*- coding: utf-8 -*-
import scrapy
from fake_useragent import UserAgent

class MarinetrafficSpider(scrapy.Spider):
    name = 'marinetraffic'
    allowed_domains = ['marinetraffic.com']
    ua = UserAgent()
    ua.update()

    def start_requests(self):
        urls = [
                    'https://www.marinetraffic.com/en/ais/details/ships/imo:9829069/'
            ]
        headers= {'User-Agent': self.ua['google chrome'] }
        for url in urls:
            yield scrapy.Request(url, callback=self.parse, headers=headers)

    def parse(self, response):
        with open('file.html', 'wb') as f:
            f.write(response.body)
        self.log('Saved file')

但我没有得到预期的回应。返回的响应在file.html

请检查debug 结果。

我需要对上述代码进行哪些修改,以使返回的响应与我从浏览器获取的响应相同?

我会通知你的笔记。

【问题讨论】:

  • 如果您右键单击该页面并单击“另存为...”,您可以将其下载为 .HTML 文件。使用文本编辑器,您可以像浏览器一样查看它。但我假设你想抓取多个页面?如果您没有其他选择,这只是我的建议。如果你得到你想要的数据,请告诉我。
  • 您需要使用无头浏览器呈现页面,以获得与您在浏览器中看到的类似的响应。您可以为此使用 Splash (splash.readthedocs.io/en/latest)。
  • @dram95 是的,我想抓取多个 imo 编号可变的页面 (marinetraffic.com/en/ais/details/ships/imo:...)。
  • @WimHermans 我会检查 Splash。很有趣。

标签: redirect scrapy user-agent httpforbiddenhandler ais


【解决方案1】:

您看不到任何内容的原因是该网站是通过 JavaScript 呈现的。换句话说,MarineTraffic 服务器会向您发送一个非常基本的 HTML 页面,以及一个 JS 脚本,该脚本将为您加载内容、构建和显示所需的 HTML。

要获得完整的 HTML 以及您要查找的数据,您需要模拟一个真实的浏览器。如果您使用 Python,可以查看Selenium 以及 Chromedriver。

但请注意,上次我检查(3 年前)MarineTraffic 具有非常强大的反爬虫保护,在使用 Selenium + Chromedriver 设置访问几个页面后会阻止您。

【讨论】:

    猜你喜欢
    • 2022-07-22
    • 2018-05-22
    • 2021-08-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-28
    • 1970-01-01
    • 2014-04-02
    • 2021-03-17
    相关资源
    最近更新 更多