我试图从 https:/www.marinetraffic.comenaisdetailsshipsimo:9829069 使用下面scrapy的spider,然后我把响应保存到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
请检查 调试 的结果。
我需要对上面的代码做哪些修改,才能使返回的响应与我从浏览器中得到的响应相同?
我将感激您的注意。
你看不到任何东西的原因是网站是通过JavaScript渲染的。换句话说,MarineTraffic 服务器向您发送一个非常基本的 HTML 页面,以及一个 JS 脚本,该脚本将为您加载内容、构建和显示所需的 HTML。
要获得完整的HTML,以及您正在寻找的数据,您需要模拟一个真正的浏览器。如果你使用的是Python,你可以看一看 硒,以及Chromedriver。
但要注意的是,上次我检查的时候(3年前)MarineTraffic有一个非常强大的反爬虫保护,在Selenium+Chromedriver的设置下,在访问了几个页面后就会阻止你。