这个网站如何知道我是刮刀?

时间:2017-01-27 11:06:10

标签: web-scraping scrapy

我试图从this web form获取结果(样本ID:15740175)。实际上我正在以与表单相同的方式从Scrapy发送POST请求。

我正在使用非阻止的IP工作 - 我可以在这台机器上成功地从Firefox发出请求。我使用Firefox并禁用了JavaScript和Cookie,因此该网站不需要JS或Cookie来返回结果。

这是我的Scrapy代码:

allowed_domains = ['eservices.landregistry.gov.uk']
start_urls = []
_FORM_URL = "http://eservices.landregistry.gov.uk/www/wps/portal/!ut/p/b1/" \
            "hc7LDoIwEAXQb-ELOrQFu60EgSgg8hDYEFQ0GHksCIZ-veBODTK7Sc69MyhFMU" \
            "rrvC9veVc2df6Y9lTNCGZUlik2GVFXYCkbg8iBQoCSESR_gCEv5Y8oBpr5d9ba" \
            "QxfvhNYHd-ENjtCxLTg44vy0ndP-Eh3CNefGoLMa-UU95tKvanfDwSJrd2sQDw" \
            "OoP-DzNsMLYPr9DWBmOCDHbKoCJSNbzfWwiKK2CvvyoF81LkkvDLGUgw!!/dl4" \
            "/d5/L0lDU0lKSmdwcGlRb0tVUW9LVVEhL29Gb2dBRUlRaGpFQ1VJZ0FJQUl5Rk" \
            "FNaHdVaFM0SldsYTRvIS80RzNhRDJnanZ5aERVd3BNaFFqVW81Q2pHcHhBL1o3" \
            "XzMyODQxMTQySDgzNjcwSTVGRzMxVDUzOFY0LzAvMjc0MzY5MTc0Njk2L3NwZl" \
            "9BY3Rpb25OYW1lL3NwZl9BY3Rpb25MaXN0ZW5lci9zcGZfc3RydXRzQWN0aW9uL" \
            "yEyZlFEU2VhcmNoLmRv/"

def start_requests(self):

    settings = get_project_settings()
    ids = ['15740175']
    for i, id in enumerate(ids):
        yield FormRequest(
            url=self._FORM_URL,
            formdata={
                'polygonId': id,
                'enquiryType': 'lrInspireId',
            },
            headers={
                'User-Agent': "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:43.0) Gecko/20100101 Firefox/43.0",
                'Accept-Language': 'en-GB,en;q=0.5', '
                'Referer': ''
            }
        )

def parse(self, response):
    # do parsing here

但是在日志中我只看到403响应。 (注意,该网站的robots.txt并不禁止抓取。)

我已经使用Charles来检查Scrapy发送的请求,并且所有请求标头(包括User-Agent)看起来与我在Firefox中发出请求并返回200时发送的请求标头相同。

据推测,该网站知道我是刮刀并阻挡了我,但它是如何知道的?我真的很神秘。我只发送一个响应,因此无法解决速率限制或下载延迟问题。

2 个答案:

答案 0 :(得分:0)

此网站可能会受到CSRF(跨网站请求伪造)的保护。此外,操作URL看起来像session token,可以防止重放攻击。但是,在以这种方式访问​​本网站之前,抓取可能是非法的并与本网站/组织的所有者核实

答案 1 :(得分:0)

只需在浏览器中打开页面源HTML并多次刷新 - 您每次都会看到表单操作URL正在更改,因此当您尝试将其用作硬编码时,它是动态URL。您应首先使用表单获取HTML页面,然后使用当前表单操作URL发送表单数据。